掘金 人工智能 前天 15:58
5-工具调用 vs RAG-你喜欢主动还是被动?
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文探讨了如何通过工具化,让AI助手能够自主查询资料,从而提升回答问题的准确性和效率。作者将资料查询功能封装成工具,并集成到AI助手中,使其能够根据需要调用。通过实际案例演示,验证了这种方法的可行性,并展示了AI助手在获取信息和回答问题方面的能力提升。同时,文章也探讨了使用工具代替RAG的可能性,为读者提供了新的思考方向。

💡作者面临的挑战:在之前的RAG(Retrieval-Augmented Generation)方案中,用户需要手动为AI助手准备资料,导致工作量增加。为了解决这个问题,作者希望AI助手能够自主查询资料。

🛠️解决方案:作者将资料查询功能封装成一个工具类(KnowledgeRepositoryTools),该工具类可以根据用户提出的问题,检索个人知识库中的相关信息。通过@Tool注解,将该工具暴露给AI助手。

⚙️技术实现:作者在聊天客户端中注入了KnowledgeRepositoryTools,并改进了时间工具的描述,使其更易于被AI助手调用。具体来说,通过ChatClient.Builder将KnowledgeRepositoryTools添加到默认工具列表中。

✅效果验证:通过提问“到今天为止我毕业几年了?”,AI助手成功调用了知识库工具和时间工具,准确回答了问题。控制台日志显示,AI助手能够根据问题智能地调用工具查询所需信息。

💡课外拓展:文章探讨了使用工具代替RAG的可能性,并鼓励读者探索哪种方法更有效。这为读者提供了新的思路,促进了对AI助手技术更深入的理解。

1-背景故事

上一篇通过RAG,在AI助手回答问题前,将问题相关资料找出来提供给她,可以让她回答得更准确。

但是每次问她问题,还要提前帮她查好资料,感觉我比她还累😓。

另外她回答问题的好坏,完全取决于我的问题问得好不好、查出来的资料准不准😩。

能不能我告诉她在怎么查资料,她按需来查呢?

有了——我把查资料这事,封装成工具,让她按需来查不就行了!!

2-动手实践

本篇代码在上一篇代码的基础上,进行两点小改造即可。

2.1 封装一个知识库工具类:

@Slf4j@Componentpublic class KnowledgeRepositoryTools {    private final VectorStore vectorStore;    public KnowledgeRepositoryTools(VectorStore vectorStore) {        this.vectorStore = vectorStore;    }    @Tool(description = "我的个人资料库查询,可查询我的个人教育、工作经历、家庭成员等信息")    public List<Document> queryKnowledge(String keyword) {        log.info("查询个人档案,关键字:{}", keyword);        // 注意这里由于没有进行向量检索优化,故把相似度阈值调低以便更容易匹配到结果        var searchRequest = SearchRequest.builder().query(keyword).similarityThreshold(0.1).topK(5).build();        return vectorStore.similaritySearch(searchRequest);    }}

2.2 聊天客户端注入工具

@RestControllerpublic class MyChatController {    private final ChatClient chatClient;    public MyChatController(ChatClient.Builder chatClientBuilder, ChatMemoryRepository chatMemoryRepository, KnowledgeRepositoryTools knowledgeRepositoryTools) {        // ...        this.chatClient = chatClientBuilder                .defaultAdvisors(new SimpleLoggerAdvisor())                .defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build())                .defaultTools(new DateTimeTools())                // 重点是这一句:添加知识库工具                .defaultTools(knowledgeRepositoryTools)                .build();    }    //...}

2.3 改进时间工具

另外上一篇,我们发现大模型似乎不太喜欢我们的时间工具,改进一下工具描述,加上非常有用以提醒大模型调用:

@Slf4j@Componentpublic class DateTimeTools {    // ...    @Tool(description = "获取当前日期非常有用")    String getCurrentLocalDate() {        String current = LocalDate.now().toString();        log.info("获取当前日期: {}", current);        return current;    }    // ...}

2.4 验证效果

# 提问:到今天为止我毕业几年了?curl http://localhost:8080/ai/chat?message=%E5%88%B0%E4%BB%8A%E5%A4%A9%E4%B8%BA%E6%AD%A2%E6%88%91%E6%AF%95%E4%B8%9A%E5%87%A0%E5%B9%B4%E4%BA%86%EF%BC%9F# AI助手回复(再次答对):根据你的毕业时间为2022年6月30日,今天是2025年6月11日,你已经毕业大约3年了。

查看控制台日志,发现她非常聪明地调用了两次工具:

2025-06-11T16:32:44.740+08:00  INFO 72518 --- [ai-assistant] [omcat-handler-1] o.c.s.s.a.a.t.KnowledgeRepositoryTools   : 查询个人档案,关键字:毕业时间2025-06-11T16:32:47.902+08:00  INFO 72518 --- [ai-assistant] [omcat-handler-1] o.c.s.s.a.assistant.tools.DateTimeTools  : 获取当前日期: 2025-06-11

🔔为演示效果,这里测试了多个提示词,选取了效果最好的一个,实际场景还有大量优化要做。

3-课外拓展

通过本篇的演示,我们探索了使用工具代替RAG的可能性,至于哪个做得更好,留待各位看官去探索。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

AI助手 工具化 RAG 知识库
相关文章