向量计算由模型完成,存储由数据库完成。
1.pom
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<langchain4j.version>1.7.1</langchain4j.version>
</properties>
<dependencies>
<!-- LangChain4j Core -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>${langchain4j.version}</version>
</dependency>
<!-- LangChain4j OpenAI -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>${langchain4j.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.38</version>
<optional>true</optional>
</dependency>
<!-- LangChain4j PGVector Embedding Store -->
<!--
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-pgvector</artifactId>
<version>1.7.1-beta14</version>
</dependency>
-->
</dependencies>
2.java
1) embeddingModel.embed(segment) 方法,把文本发送给大模型,大模型计算得到向量,返回向量
2) contentRetriever.retrieve(query) 方法,把文本发送给大模型,大模型计算得到向量,返回向量,与之前的向量,langchain4j 进行余弦相似度计算,得到要查询的文本
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.loader.ClassPathDocumentLoader;
import dev.langchain4j.data.document.splitter.DocumentSplitters;
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.openai.OpenAiEmbeddingModel;
import dev.langchain4j.rag.content.Content;
import dev.langchain4j.rag.content.retriever.ContentRetriever;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.rag.query.Query;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
import dev.langchain4j.store.embedding.pgvector.PgVectorEmbeddingStore;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
try {
// 1. 创建 OpenAI Embedding 模型
EmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder()
.baseUrl("http://localhost:11434/v1")
.modelName("nomic-embed-text:latest")
.apiKey(null)
.build();
// EmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder()
// .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
// .modelName("text-embedding-v1")
// .apiKey("sk-123456")
// .build();
// 2. 创建内存 Embedding 存储
EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();
// 创建 PostgreSQL Embedding 存储
// EmbeddingStore<TextSegment> embeddingStore = PgVectorEmbeddingStore.builder()
// .host("localhost")
// .port(5432)
// .database("postgres")
// .user("postgres")
// .password("123456")
// .table("tbl1")
// .dimension(embeddingModel.dimension())
// .build();
// 3. 准备文档内容,把文档内容转化为 TextSegment
Document doc = Document.from("""
Java 是一种面向对象的编程语言,由 Sun Microsystems 公司开发,现在由 Oracle 维护。
Spring Boot 是一个基于 Java 的框架,用于快速构建微服务和 Web 应用程序。
LangChain4j 是一个 Java 版本的 LangChain,专门用于构建 AI 应用和 RAG 系统。
Python 是一种解释型编程语言,广泛用于数据科学、机器学习和 Web 开发。
机器学习是人工智能的一个分支,通过算法让计算机从数据中学习模式和规律。
数据库是存储和管理数据的系统,常见的关系型数据库有 MySQL、PostgreSQL 等。
""");
// Document doc = ClassPathDocumentLoader.loadDocument("student_ddl.sql");
List<TextSegment> segmentList = DocumentSplitters
.recursive(60, 20)
.split(doc);
// 4. 将文档转换为 TextSegment 并添加到 Embedding Store
for (TextSegment segment : segmentList) {
Embedding embedding = embeddingModel.embed(segment).content();
embeddingStore.add(embedding, segment);
}
// 5. 创建 ContentRetriever
ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder()
.embeddingStore(embeddingStore)
.embeddingModel(embeddingModel)
// 返回最相关的 3 个结果
.maxResults(3)
// 最小相似度分数
.minScore(0.0)
.build();
// 6. 执行检索
Query query = new Query("Java 编程语言");
System.out.println("查询: " + query.text());
List<Content> contents = contentRetriever.retrieve(query);
// 7. 打印结果
System.out.println("检索到的内容数量: " + contents.size());
for (int i = 0; i < contents.size(); i++) {
Content content = contents.get(i);
System.out.println("结果 " + (i + 1));
System.out.println("内容: " + content.textSegment().text());
}
} catch (Exception e) {
System.err.println("错误: " + e.getMessage());
}
}
}
3.结果
查询: Java 编程语言
检索到的内容数量: 3
结果 1
内容: Spring Boot 是一个基于 Java 的框架,用于快速构建微服务和 Web 应用程序。
结果 2
内容: Java 是一种面向对象的编程语言,由 Sun Microsystems 公司开发,现在由 Oracle 维护。
结果 3
内容: LangChain4j 是一个 Java 版本的 LangChain,专门用于构建 AI 应用和 RAG 系统。