rag - 多要素联合演示
1、知识库准备
//构建 embeddingModel
EmbeddingModel embeddingModel = EmbeddingModel.of(embedding_apiUrl)
.apiKey(embedding_apiKey)
.model(embedding_model)
.build();
//构建 repository
InMemoryRepository repository = new InMemoryRepository(embeddingModel);
//加载文档并存储
PdfLoader loader = new PdfLoader(new File("ticket.pdf")).additionalMetadata("file", "ticket.pdf");
//再次(按需)组合切割
List<Document> documents = new SplitterPipeline() //2.分割文档(确保不超过 max-token-size)
.next(new RegexTextSplitter("\n\n"))
.next(new TokenSizeTextSplitter(500))
.split(loader.load());
//存储仓库
repository.insert(documents);
2、建立会话
ChatSession chatSession = new ChatSessionDefault();
或者基于 Map 管理
Map<String, ChatSession> sessions = new ConcurrentHashMap<>();
ChatSession chatSession = sessions.computeIfAbsent(sessionId, k -> new ChatSessionDefault(k));
一般,会话需要持久化。比如放到数据库里(需要定制 ChatSession 接口)。
3、检索应用
//构建 chatModel
ChatModel chatModel = ChatModel.of(chat_apiUrl)
.provider(provider)
.model(model)
.build();
//用户输入消息
String message = "刘德华今年有几场演唱会?";
//1. 检索
List<Document> context = repository.search(message);
//2. 消息增强
ChatMessage chatMessage = ChatMessage.augment(message, context);
//或者用模板构建
//ChatMessage chatMessage = ChatMessage.template("${query} \n\n 请参考以下内容回答:${context}")
// .param("query", query)
// .param("context", context)
// .generate()
//3.加入会话
chatSession.addMessage(chatMessage);
//4. 提交大模型
ChatResponse resp = chatModel.prompt(chatSession).call();
//打印结果
System.out.println(resp.getMessage());