Solon v3.2.0

rag - 实现参考-联网搜索

</> markdown

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