LangChain 入门学习第三篇-工具调用和 Agent

💡 原文中文,约7700字,阅读约需19分钟。
📝

内容提要

本文介绍LangChain工具调用与Agent入门。通过@tool定义工具,bind_tools让模型返回tool_calls,手动执行工具并用ToolMessage回传结果;create_agent则自动完成调用循环。示例演示计算与字符统计,强调工具用于确定性任务,模型负责意图理解。

🔎

延伸解读

工具调用的核心:模型决策,程序执行

本文通过 bind_tools 和手动执行工具,清晰展示了工具调用的分工:模型负责理解用户意图并决定调用哪个工具、传入什么参数,而实际计算或统计由 Python 函数完成。这种设计将确定性任务交给工具,避免模型猜测,提高了结果的可靠性。理解这一分工是掌握 Agent 的基础。

bind_tools 与 Agent 的适用场景

bind_tools 是底层接口,需要手动处理 tool_calls 和 ToolMessage,适合学习和调试工具调用流程。而 create_agent 自动完成整个循环,适合实际业务开发。初学者应先通过手动方式理解机制,再使用 Agent 简化代码,这样能更深刻地理解 Agent 的工作原理。

工具定义中的关键细节

使用 @tool 装饰器时,函数名、参数和 docstring 都会影响模型对工具的理解。docstring 应清晰描述工具功能,否则模型可能无法正确选择工具。此外,工具应尽量简单、结果确定,以便观察调用过程。本文刻意不引入外部工具,正是为了聚焦机制本身。

Q&A

LangChain中如何使用@tool装饰器定义工具?

在LangChain中,使用@tool装饰器可以将普通Python函数包装成工具。函数名会成为工具名,函数参数会变成工具入参,docstring会作为工具说明提供给模型。例如:@tool def multiply(a: int, b: int) -> int: """计算两个整数相乘的结果。""" return a * b

bind_tools和create_agent有什么区别?

bind_tools是更底层的工具调用方式,它把工具列表绑定到模型,让模型返回tool_calls,但需要自己手动执行工具并处理ToolMessage。create_agent则更完整,它自动完成工具调用循环,包括执行工具和将结果交回模型,适合实际业务流程。

在LangChain中,模型返回的tool_calls是什么?

tool_calls是模型在调用bind_tools后返回的结构化请求,包含工具名称、参数和调用ID。它表示模型认为需要调用哪些工具以及参数是什么,但此时工具尚未执行。

LangChain中ToolMessage的作用是什么?

ToolMessage用于将工具执行结果包装成消息,并交回给模型。它包含工具名称、执行结果和对应的tool_call_id,使模型能够基于工具结果生成最终回答。

为什么在LangChain中不直接让模型计算,而是使用工具?

因为计算等确定性任务应该由程序执行,而不是依赖模型猜测。工具调用的核心价值是将确定性的事情交给确定性工具,模型则负责理解意图、选择工具和组织回答。

如果模型不调用工具,应该怎么排查?

可以从几个方向排查:问题是否真的需要工具;工具docstring是否描述清楚;system prompt是否明确要求优先使用工具;当前模型服务是否支持tool calling。

LangChain中Agent是什么?

Agent可以简单理解为模型+工具+执行循环。它自动完成工具调用流程,包括调用模型、读取tool_calls、执行工具、将结果交回模型并生成最终回答。

为什么第三章不使用真实外部工具?

因为第三章的重点是讲清楚工具调用机制本身。如果一开始就接文件、数据库或网络搜索,容易让读者分心于外部系统细节,而忽略LangChain工具调用流程。

🏷️

标签

➡️

继续阅读