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..."
- 初始化三大组件
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());
}
}