Quarkus Langchain4j未触发@Tool调用远程GraphQL API问题求助
Quarkus Langchain4j未触发@Tool调用远程GraphQL API问题求助
兄弟,我太懂你第一次用Quarkus Langchain4j卡壳的痛苦——折腾好几天还看不到工具调用确实闹心。结合你说的情况(调用Mistral返回空体、tools-calling为null,甚至删掉ExtractorAiService只留单个@Tool也没用),我整理了几个最可能踩的坑,你挨个排查下:
1. @Tool方法的元信息一定要写到位
大模型完全依赖@Tool的name和description来判断什么时候该调用工具,这是新手最容易忽略的点!
- 你得给@Tool明确的名称和功能描述,比如:
@Tool(name = "获取马德里旅游景点列表", description = "根据用户提供的搜索文本,精准查询对应的马德里旅游景点详细信息,所有景点数据必须通过此工具获取") public List<TouristSpot> fetchMadridSpots(String searchKeyword) { // 调用GraphQL客户端的逻辑 } - 同时要确保方法的参数名、类型和你给大模型的提示词里的描述完全匹配,比如提示词里说“根据用户的搜索关键词调用工具”,那方法参数就叫
searchKeyword,别搞成queryText这种大模型识别不了的名字。
2. 检查Quarkus与Langchain4j的集成配置
先确认application.properties里的关键配置有没有拉满:
- 必须开启大模型的工具调用支持:
quarkus.langchain4j.mistralai.tools.enabled=true - 另外建议升级到最新稳定版的
quarkus-langchain4j-mistralai依赖,旧版本可能存在工具调用的兼容性bug。
3. 先单独验证GraphQL客户端的可用性
别上来就和Langchain4j绑在一起测,先把@Tool里的GraphQL调用逻辑抽出来,写个单元测试单独跑:
@Test void testGraphQLClientAlone() { // 直接获取GraphQL客户端实例 TouristGraphQLClient client = Arc.container().instance(TouristGraphQLClient.class).get(); List<TouristSpot> spots = client.searchSpots("普拉多博物馆"); // 验证是否能拿到有效数据 Assertions.assertFalse(spots.isEmpty()); }
如果这个测试都通不过,那大模型就算触发了工具调用也拿不到结果,甚至可能因为调用异常直接放弃触发。
4. 提示词里必须强制大模型调用工具
大模型天生爱“瞎编”,你得在系统提示词里明确下死命令:
你是专属的马德里旅游助手,所有与马德里旅游相关的景点、活动信息,必须通过调用提供的工具获取,绝对不能凭空生成内容。如果用户的查询涉及马德里旅游相关需求,直接调用工具获取结果后整理返回。
没有这个强制要求,大模型大概率会自己生成假的景点信息,根本不会触发工具调用。
5. 开Debug日志看大模型的思考过程
这是定位问题的终极杀招!在application.properties里加这两行:
quarkus.log.category."dev.langchain4j".level=DEBUG quarkus.log.category."io.quarkus.langchain4j".level=DEBUG
启动服务后,你能看到:
- 大模型收到的完整提示词
- 大模型的思考链(比如“用户问的是马德里博物馆,我需要调用获取景点的工具”或者“我自己知道这个信息,不用调用工具”)
- 工具调用的请求参数、响应结果
从日志里能直接看出是大模型没触发调用,还是调用了但工具逻辑出问题。
你先从这几个点入手排查,尤其是@Tool的描述和提示词,这俩是新手最容易踩的坑。如果排查到某个点有问题,或者拿到了关键的日志信息,随时补充上来,我再帮你细化分析!




