RAG自定义外部存储

RAG自定义外部存储

1
2
wget https://github.com/milvus-io/milvus/releases/download/v2.5.5/milvus-standalone-docker-compose.yml -O docker-compose.yml
docker-compose up -d
1
2
3
4
5
6
7
<!-- Milvus向量数据库集成依赖 -->
<!-- LangChain4j与Milvus集成的模块 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-milvus</artifactId>
<version>1.0.0-beta3</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package com.lixiang;

import static dev.langchain4j.data.document.loader.FileSystemDocumentLoader.loadDocuments;

import java.util.List;

import dev.langchain4j.community.model.dashscope.QwenChatModel;
import dev.langchain4j.community.model.dashscope.QwenEmbeddingModel;
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.DocumentSplitter;
import dev.langchain4j.data.document.splitter.DocumentSplitters;
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.rag.content.retriever.ContentRetriever;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.milvus.MilvusEmbeddingStore;
import io.milvus.client.MilvusServiceClient;
import io.milvus.param.ConnectParam;
import io.milvus.param.IndexType;

/* 演示外部向量存储的做法 */
public class NaiveRagDemo {

static ChatLanguageModel chatLanguageModel = QwenChatModel.builder()
.apiKey("sk-937aee4c3e654d04b84634d363f5a770")
.modelName("qwen-plus")
.build();

static QwenEmbeddingModel embeddingModel = QwenEmbeddingModel.builder()
.apiKey("sk-937aee4c3e654d04b84634d363f5a770")
.modelName("text-embedding-v1")
.build();

// 创建Milvus向量数据库客户端
// https://docs.langchain4j.dev/integrations/embedding-stores/
static MilvusServiceClient customMilvusClient = new MilvusServiceClient(
// 配置连接参数
ConnectParam.newBuilder()
// 设置Milvus服务器主机地址
.withHost("192.168.31.230")
// 设置Milvus服务器端口
.withPort(19530)
// 构建连接参数
.build());

// 创建Milvus向量存储构建器
static EmbeddingStore<TextSegment> embeddingStore = MilvusEmbeddingStore.builder()
// 设置Milvus客户端
.milvusClient(customMilvusClient)
// 设置数据库名称
.databaseName("default")
// 设置集合名称
.collectionName("text_collection")
// 设置索引类型为FLAT(精确搜索)
.indexType(IndexType.FLAT)
// 设置向量字段名称
.vectorFieldName("embedding")
// 设置向量维度(1536维)
.dimension(1536)
// 构建向量存储实例
.build();

// 创建内容检索器实例(基于向量存储的内容检索器)
static ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder()
// 设置向量存储实例(Milvus向量数据库)
.embeddingStore(embeddingStore)
// 设置嵌入模型(用于查询文本的向量化)
.embeddingModel(embeddingModel)
// 设置最大返回结果数(最多返回100条相关结果)
.maxResults(100)
// 设置最小相似度阈值(只返回相似度大于0.7的结果)
.minScore(0.7)
// 构建内容检索器实例
.build();

public static void main(String[] args) {
Assistant assistant = createAssistant();
init();

String input = "鲁智深做了什么?";
System.out.println("> " + input);
String chat = assistant.chat(input);
System.out.println("< " + chat);

input = "唐僧做了什么?";
System.out.println("> " + input);
chat = assistant.chat("唐僧做了什么?");
System.out.println("< " + chat);
}

/**
* 初始化向量数据库,加载并处理文档数据
* 1. 创建文档分割器将大文档分割为小片段
* 2. 从指定目录加载所有文档
* 3. 对每个文档进行分割、向量化处理
* 4. 将向量和文本片段存入Milvus向量数据库
*/
private static void init() {
DocumentSplitter splitter = DocumentSplitters.recursive(1000, 0);
List<Document> documents = loadDocuments("D:/Temp/txt");

documents.forEach(document -> {
List<TextSegment> segments = splitter.split(document);
List<Embedding> embeddings = embeddingModel.embedAll(segments).content();
System.out.println(embeddings.size());
embeddingStore.addAll(embeddings, segments);
});
}

/**
* 创建助手实例,用于处理用户输入并生成响应
* 1. 构建助手实例
* 2. 设置聊天模型(通义千问)
*/
private static Assistant createAssistant() {
return AiServices.builder(Assistant.class)
.chatLanguageModel(chatLanguageModel)
.contentRetriever(contentRetriever)
.build();
}
}

image-2025-03-22-1