rag - 实现参考-联网搜索
v3.1.0 后支持
自 DeepSeek 出来后,开启“联网搜索”就特别流行了。在这个特性,可以把“联网搜索”,理解为一个动态的知识库。
1、实现思路
- 通过网络搜索,获取 10 条结果
- 矢量化,增加相似度过滤,获取 4 条结果
- 增强提示语
- 提交聊天模型
2、实现参考(仅供参考)
- 添加配置(配置可以随意,与相关的配置项对应起来就好)
solon.ai.chat:
demo:
apiUrl: "http://127.0.0.1:11434/api/chat" # 使用完整地址(而不是 api_base)
provider: "ollama" # 使用 ollama 服务时,需要配置 provider
model: "llama3.2"
solon.ai.embed:
demo:
apiUrl: "http://127.0.0.1:11434/api/embed" # 使用完整地址(而不是 api_base)
provider: "ollama" # 使用 ollama 服务时,需要配置 provider
model: "nomic-embed-text:latest"
solon.ai.repo:
demo:
apiUrl: "https://api.bochaai.com/v1/web-search" # 使用完整地址(而不是 api_base)
apiKey: "sk-demo..."
- 初始化三大组件
@Configuration
public class DemoConfig {
@Bean
public EmbeddingModel embeddingModel(@Inject("${solon.ai.embed.demo}") EmbeddingConfig config) {
return EmbeddingModel.of(config).build();
}
@Bean
public WebSearchRepository repository(@Inject("${solon.ai.repo.demo}") AiConfig config, EmbeddingModel embeddingModel) {
return new WebSearchRepository(embeddingModel, config);
}
@Bean
public ChatModel chatModel(@Inject("${solon.ai.chat.demo}") ChatConfig config) {
return ChatModel.of(config).build();
}
}
- 应用示例
@Component
public class DemoService{
@Inject
EmbeddingModel embeddingModel;
@Inject
WebSearchRepository repository;
@Inject
ChatModel chatModel;
public void aiSearch(String message) throws Exception { //接收消息
//1. 知识库检索,获取 10条
List<Document> context = repository.search(new QueryCondition(message).limit(10)); //取头部10条
//2. 再次做相似度过滤,获取 4条(太多,费 tokens)
context = FilterUtil.similarityFilter(new QueryCondition(message).limit(4), embeddingModel, context.stream());
//3. 消息增强(字符串格式化)
ChatMessage prompt = ChatMessage.augment(message, context); //提示语增强(内部为字符串格式化)
//4. 提交大模型
ChatResponse resp = chatModel.prompt(prompt).call();
//打印
System.out.println(resp.getMessage());
}
}