Java AI 开发工具与向量数据库:构建智能应用的技术基石

在人工智能(AI)快速迭代的今天,Java 作为一门成熟稳定的编程语言,依然在企业级 AI 应用开发中占据重要地位。从模型调用到数据处理,Java 生态提供了丰富的工具链;而向量数据库作为 AI 时代的 “新基建”,则成为连接模型与现实数据的关键纽带。本文将深入解析 Java AI 开发的核心工具与向量数据库的技术原理,并探讨二者如何协同构建高效智能的应用系统。

什么是向量数据库?

向量数据库,顾名思义,它以高维向量的形式存储数据。这些向量是一串数字,代表了某个对象的特征或属性。每一个向量都对应着一个独一无二的实体,比如一段文字、一张图片或一段视频。

为什么选择向量呢?

向量的魅力在于它们能够精准捕捉到数据的语义含义和相似度。

向量数据库核心
向量数据库的核心在于相似性搜索(Similarity Search)。将文本转换成向量,然后将向量存储在数据库中,当用户输入问题时,将问题转换成向量,然后在数据库中搜索最相似的向量和上下文,最后将文本返回给用户。

为何向量数据库受到青睐?
近年来,随着机器学习和人工智能领域的迅速发展,向量数据库的需求日益增加。AI 和 ML 模型需要处理的非结构化数据量巨大,这就需要一种有效的存储、检索和搜索方法。

重点

采用了专门的搜索和索引算法,能够迅速地在数十亿条数据中找到相似的向量。

向量数据库的应用场景

向量数据库的出现极大地扩展了 AI 和 ML 应用的可能性

一些典型的应用场景包括:

  • RAG 系统:将向量数据库与大型语言模型结合,可构建出基于知识的语言 AI 应用。
  • 推荐系统:利用向量数据库构建个性化推荐引擎,通过向量来表示用户偏好和商品特性。
  • 基于内容的检索:向量数据库能够搜索视觉上相似的图像或视频,彻底改变了内容检索方式。
  • 自然语言处理:通过将文本转换为向量,向量数据库支持语义搜索、主题建模和文档分类。
  • 欺诈检测:向量数据库能够帮助识别金融交易中的异常模式和趋势。

Qdrant向量数据库

目前常见的向量数据库有 Qdrant, Milvus, Faiss 等等。

什么是Qdrant
"Qdrant "是一个向量相似性搜索引擎,提供生产就绪的服务,并配有方便的 API,用于存储、搜索和管理点(即向量)以及附加的有效负载。” 你可以将有效负载视为额外的信息片段,这些信息可以帮助你优化搜索,并向用户提供有用的信息。

由 Rust 编写的向量数据库, 在性能上自然是第一梯队的。

Qdrant 目前实现了 4 种距离算法
• 余弦相似度:适用于比较向量的方向,而不考虑向量的大小. 比如文本相似度, 信息检索等.

• 欧氏距离:适用于度量两点之间的直线距离,考虑向量的大小和方向. 用于几何计算, 图像处理等.

• 点积:适用于度量向量的相对位置和方向. 常用于线性代数和信号处理等离散数据计算.

• 曼哈顿距离:适用于度量两点之间的网格距离,适合网格状或离散空间. 用于路径规划, 特征工程等.

Qdrant 架构概览

概念:

  • 集合 (collections): 可以类比为 MySQL 中的表, 里边存储了一条条的记录
  • Points: 这个结构类似 MySQL 中的一条记录, 这是一个实体, 由三部分组成
  • • 唯一 ID
  • • vector: 固定长度的向量, 在创建集合的时候, 就已经确定好的
  • • payload: 记录里携带的 json 对象, 我们也是我们要利用的核心数据
  • Storage: 向量的存储方式, 向量和 payload 会分开存储, 通过 payload 索引进行关联, 为了保证数据完整,

Qdrant向量库安装

使用Docker安装Qdrant:

docker run -d -p 6333:6333 -p 6334:6334 qdrant/qdrant

参数说明:

  • 端口6333:用于HTTP API
  • 端口6334:用于gRPC API

访问

http://192.168.47.120:6333/dashboard#/welcome

集成LangChain4j与Qdrant_创建索引

添加Maven依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.springai</groupId>
        <artifactId>Ai</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>LangChain4jQdrant</artifactId>
    <packaging>jar</packaging>

    <name>LangChain4jQdrant</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-qdrant</artifactId>
        </dependency>
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-zhipu-ai</artifactId>
            <version>0.35.0</version>
        </dependency>
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j</artifactId>
        </dependency>
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-open-ai</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--SpringbootTest-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>
</project>

创建Qdrant客户端

package com.springai.config;

import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.zhipu.ZhipuAiEmbeddingModel;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.qdrant.QdrantEmbeddingStore;
import io.qdrant.client.QdrantClient;
import io.qdrant.client.QdrantGrpcClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.Duration;

@Configuration
public class QdrantConfig {
    //创建qdrant客户端
    @Bean
    public QdrantClient qdrantClient() {
        QdrantGrpcClient.Builder grpcClient =
                QdrantGrpcClient.newBuilder("192.168.66.99", 6334, false);
        return new QdrantClient(grpcClient.build());
    }

创建索引

SpringBootTest
public class AppTest {
    @Autowired
    QdrantClient qdrantGrpcClient;

    //创建qdrant索引
    @Test
    public void testApp() {
        var vectorParams = Collections.VectorParams.newBuilder()
                .setDistance(Collections.Distance.Cosine)
                .setSize(1024)
                .build();
        qdrantGrpcClient.createCollectionAsync("testv", vectorParams);
        System.out.println("创建成功");

    }
访问可视化模板查看是否创建成功

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐