Solon v3.3.0

rag - 多要素联合演示

</> markdown

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());