Java?RAG集成實戰(zhàn)指南(含代碼)
一、RAG 技術(shù)選型與架構(gòu)設(shè)計
1. 技術(shù)棧選型
| 組件 | 選型建議 | 理由 |
|---|---|---|
| 應(yīng)用框架 | Spring AI 或 LangChain4j | Spring AI 集成度高,Spring 官方出品;LangChain4j 功能更豐富,貼近 Python LangChain 設(shè)計 |
| 向量數(shù)據(jù)庫 | Milvus、Qdrant 或 PostgreSQL + pgvector | Milvus 云原生,適合大規(guī)模數(shù)據(jù);Qdrant 性能極佳;pgvector 適合已有 PostgreSQL 生態(tài)的項目 |
| 模型層 | OpenAI API 或本地 Embedding 模型 | 可選擇云端 API 或本地部署的小型模型 |
2. 系統(tǒng)架構(gòu)設(shè)計
一個成熟的 Java RAG 系統(tǒng)包含三個主要階段:
- 數(shù)據(jù)處理(ETL):文檔加載、分塊、向量化、存儲
- 檢索(Retrieval):向量檢索、混合檢索、重排序
- 生成(Generation):組裝 Prompt、調(diào)用大模型
二、Spring AI 實現(xiàn) RAG
1. 依賴配置
<dependencies>
<!-- Spring AI 核心 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
<!-- 向量數(shù)據(jù)庫集成 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-milvus-store-spring-boot-starter</artifactId>
</dependency>
<!-- Web API -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>2. 配置文件
# OpenAI 配置 spring.ai.openai.api-key=YOUR_OPENAI_API_KEY spring.ai.openai.embedding.model=text-embedding-ada-002 spring.ai.openai.chat.model=gpt-3.5-turbo # Milvus 配置 spring.ai.vectorstore.milvus.uri=http://localhost:19530 spring.ai.vectorstore.milvus.collection-name=my_knowledge_base spring.ai.vectorstore.milvus.embedding-dimension=1536
3. 核心代碼實現(xiàn)
文檔向量化與存儲
@Service
public class DocumentService {
@Autowired
private VectorStore vectorStore;
@Autowired
private EmbeddingClient embeddingClient;
public void addDocument(String content) {
Document document = new Document(content);
vectorStore.add(List.of(document));
}
}RAG 查詢服務(wù)
@Service
public class RagService {
@Autowired
private ChatClient chatClient;
@Autowired
private VectorStore vectorStore;
public String answer(String question) {
// 檢索相關(guān)文檔
List<Document> relevantDocuments = vectorStore.similaritySearch(question);
// 構(gòu)建上下文
String context = relevantDocuments.stream()
.map(Document::getContent)
.collect(Collectors.joining("\n\n"));
// 組裝 Prompt
String prompt = """
Answer the question using ONLY the context below.
Context:
%s
Question:
%s
""".formatted(context, question);
// 調(diào)用大模型
return chatClient.call(prompt);
}
}三、LangChain4j 實現(xiàn) RAG
1. 依賴配置
<dependencies>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-core</artifactId>
<version>0.30.0</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>0.30.0</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-milvus</artifactId>
<version>0.30.0</version>
</dependency>
</dependencies>2. 核心代碼實現(xiàn)
初始化配置
@Configuration
public class LangChain4jConfig {
@Bean
public OpenAiChatModel chatModel() {
return OpenAiChatModel.builder()
.apiKey("YOUR_OPENAI_API_KEY")
.modelName("gpt-3.5-turbo")
.build();
}
@Bean
public OpenAiEmbeddingModel embeddingModel() {
return OpenAiEmbeddingModel.builder()
.apiKey("YOUR_OPENAI_API_KEY")
.modelName("text-embedding-ada-002")
.build();
}
@Bean
public MilvusEmbeddingStore embeddingStore() {
return MilvusEmbeddingStore.builder()
.host("localhost")
.port(19530)
.collectionName("my_knowledge_base")
.dimension(1536)
.build();
}
}文檔處理與檢索
@Service
public class RagService {
@Autowired
private OpenAiChatModel chatModel;
@Autowired
private OpenAiEmbeddingModel embeddingModel;
@Autowired
private MilvusEmbeddingStore embeddingStore;
public void addDocument(String content) {
TextSegment segment = TextSegment.from(content);
embeddingStore.add(segment, embeddingModel.embed(segment));
}
public String answer(String question) {
// 檢索相關(guān)文檔
List<TextSegment> relevantSegments = embeddingStore.similaritySearch(question, embeddingModel);
// 構(gòu)建上下文
String context = relevantSegments.stream()
.map(TextSegment::text)
.collect(Collectors.joining("\n\n"));
// 組裝 Prompt
String prompt = """
Answer the question using ONLY the context below.
Context:
%s
Question:
%s
""".formatted(context, question);
// 調(diào)用大模型
return chatModel.generate(prompt);
}
}四、關(guān)鍵優(yōu)化策略
1. 文檔分塊策略
- 固定大小分塊:簡單但易切斷語義
- 遞歸分塊:按段落、句子遞歸切分,保留上下文
- 基于文檔結(jié)構(gòu)分塊:針對 Markdown 或 Code 的特定結(jié)構(gòu)切分
2. 檢索優(yōu)化
- 混合檢索:向量檢索 + BM25 關(guān)鍵詞檢索,加權(quán)融合
- 重排序:使用 Cross-Encoder 模型對檢索結(jié)果進行重排序
- 緩存:對相同問題的檢索結(jié)果進行緩存,減少重復(fù)計算
3. 性能優(yōu)化
- 批量處理:批量加載和向量化文檔
- 異步處理:使用 Java 21 虛擬線程處理 I/O 密集型任務(wù)
- 索引優(yōu)化:調(diào)整向量數(shù)據(jù)庫的索引參數(shù),如 HNSW 的 M 和 ef 參數(shù)
五、部署與運維
1. 向量數(shù)據(jù)庫部署
使用 Docker 快速啟動 Milvus:
# 下載 docker-compose.yml wget https://github.com/milvus-io/milvus/releases/download/v2.3.0/milvus-standalone-docker-compose.yml -O docker-compose.yml # 啟動 docker-compose up -d
2. 應(yīng)用部署
- 可部署為 Docker 容器
- 可部署到 Kubernetes 集群
- 可部署到云原生平臺,如 AWS ECS、GCP Cloud Run
六、總結(jié)
Java RAG 集成方案已經(jīng)非常成熟,開發(fā)者可以根據(jù)項目需求選擇 Spring AI 或 LangChain4j 框架。Spring AI 集成度高,適合快速上手;LangChain4j 功能更豐富,適合復(fù)雜場景。
到此這篇關(guān)于Java RAG集成實戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Java RAG集成內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
hashtable桶數(shù)通常會取一個素數(shù)分析
這篇文章主要介紹了hashtable桶數(shù)通常會取一個素數(shù)分析的相關(guān)資料,需要的朋友可以參考下2016-12-12
Eclipse+Java+Swing+Mysql實現(xiàn)電影購票系統(tǒng)(詳細代碼)
這篇文章主要介紹了Eclipse+Java+Swing+Mysql實現(xiàn)電影購票系統(tǒng)并附詳細的代碼詳解,需要的小伙伴可以參考一下2022-01-01
intellij idea使用git stash暫存一次提交的操作
這篇文章主要介紹了intellij idea使用git stash暫存一次提交的操作,具有很好的參考價值希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
全網(wǎng)最深分析SpringBoot MVC自動配置失效的原因
這篇文章主要介紹了全網(wǎng)最深分析SpringBoot MVC自動配置失效的原因,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07

