Solon v3.3.3

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..."
  • 初始化三大组件
import org.noear.solon.ai.AiConfig;
import org.noear.solon.ai.chat.ChatConfig;
import org.noear.solon.ai.chat.ChatModel;
import org.noear.solon.ai.embedding.EmbeddingConfig;
import org.noear.solon.ai.embedding.EmbeddingModel;
import org.noear.solon.ai.rag.repository.WebSearchRepository;
import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Configuration;
import org.noear.solon.annotation.Inject;

@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();
    }
}
  • 应用示例
import org.noear.solon.ai.chat.ChatModel;
import org.noear.solon.ai.chat.ChatResponse;
import org.noear.solon.ai.chat.message.ChatMessage;
import org.noear.solon.ai.embedding.EmbeddingModel;
import org.noear.solon.ai.rag.Document;
import org.noear.solon.ai.rag.repository.WebSearchRepository;
import org.noear.solon.ai.rag.util.QueryCondition;
import org.noear.solon.ai.rag.util.SimilarityUtil;
import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Inject;

import java.util.List;

@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 = SimilarityUtil.refilter(context.stream(), new QueryCondition(message).limit(4));

        //3. 消息增强(字符串格式化)
        ChatMessage prompt = ChatMessage.ofUserAugment(message, context); //提示语增强(内部为字符串格式化)

        //4. 提交大模型
        ChatResponse resp = chatModel.prompt(prompt).call();

        //打印
        System.out.println(resp.getMessage());
    }
}