5.1 tool_choice参数说明
bind_tools 可以传递参数tool_choice ,用于控制是否强制使用工具。
该字段最终会作为payload 的tool_choice 字段传递给模型,OpenAI和Deepseek的官方API服务对于tool_choice 的取值做了相同的规定。
OpenAI官方文档
![图片[1]-5、拓展:强制使用工具-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-675.png)
Deepseek官方文档
![图片[2]-5、拓展:强制使用工具-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-676.png)
此外, tool_choice 还支持传递any ,等价于required 。
5.2 none值举例
模型初始化:
![图片[3]-5、拓展:强制使用工具-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-677.png)
举例:
![图片[4]-5、拓展:强制使用工具-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-678.png)
用户要求查询天气,并提供了天气查询工具,但模型不会调用。
5.3 auto值举例
tool_choice 的默认值就是auto 。
举例1:需要调用工具的场景
![图片[5]-5、拓展:强制使用工具-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-679.png)
举例2:不需要调用工具的场景
from langchain.tools import tool
from langchain.messages import HumanMessage
![图片[6]-5、拓展:强制使用工具-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-680.png)
5.4 required值举例
举例1:需要调用工具的场景
![图片[7]-5、拓展:强制使用工具-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-681.png)
举例2:不需要调用工具的场景
![图片[8]-5、拓展:强制使用工具-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-682.png)
即便此时不需要,模型依然会调用工具
5.5 强制调用特定的工具
某些场景下我们希望调用特定的工具,仍然可以用tool_choice 解决。
from langchain.tools import tool
from langchain.messages import HumanMessage
![图片[9]-5、拓展:强制使用工具-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-683.png)
![图片[10]-5、拓展:强制使用工具-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-684.png)
反过来指定get_weather1
![图片[11]-5、拓展:强制使用工具-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-685.png)
![图片[12]-5、拓展:强制使用工具-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-686.png)
6、实践经验总结
1. 清晰的描述
![图片[13]-5、拓展:强制使用工具-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-687.png)
2. 功能单一
![图片[14]-5、拓展:强制使用工具-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-688.png)
![图片[15]-5、拓展:强制使用工具-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-689.png)
- 如何处理工具失败?
三层防护:
第1层:工具内部处理
![图片[16]-5、拓展:强制使用工具-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-690.png)
第2层:Agent 级重试(使用 prompt)
![图片[17]-5、拓展:强制使用工具-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-691.png)
第3层:调用级重试
在大模型应用(如 LangChain)中,网络请求和外部工具调用是最容易掉链子的地方。@retry 就像是一个容错保险。
![图片[18]-5、拓展:强制使用工具-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-692.png)
它的工作流程:
① 你调用 call_agent(“你好”) 。
② 程序进入函数,执行 agent.invoke(…) 。
③ 如果执行成功:正常返回结果, @retry 什么都不做。
④ 如果执行失败(报错): @retry 会拦截这个错误,不让程序直接崩溃。它会默默地帮你再次触发agent.invoke(…) 。
⑤ 如果连续 3 次都报错:它终于放弃了,把第 3 次的报错真正抛出来,程序此时才会报错中止。
4. 返回字符串
![图片[19]-5、拓展:强制使用工具-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-693.png)
在编写传统的 Python 代码时,返回字典( dict )显然更方便后续代码处理。但在 LangChain 的工具
(Tools)生态中,强烈建议工具返回字符串(str)。因为:
1)大模型(LLM)的本质只吃“文本”
2)避免大模型“胡思乱想”(乱码与格式问题)
如果你返回一个包含中文的字典 {“name”: “张三”} ,LangChain 在强制将其转换为字符串时,默认可能会采用 Unicode 编码,变成 {“name”: “\u5f20\u4e09”} 。
大模型虽然能理解 Unicode,但极易受到干扰。直接看到中文 张三 的大模型,和看到\u5f20\u4e09 的大模型,其输出的稳定性和准确率是有差距的。通过手动 json.dumps(…,ensure_ascii=False) ,你确保了喂给大模型的是最干净、最直观的纯文本。
- 选择同步 vs 异步
同步工具:简单场景,CPU 密集型任务
异步工具:IO 密集型(API 调用、数据库、文件操作)
![图片[20]-5、拓展:强制使用工具-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-694.png)

















请登录后查看评论内容