游乐游手机版
首页/AI教程/文章详情

LangChain从入门到进阶第6篇:AI调用外部工具保姆级教程

时间:2026-06-16 16:30
LangChain的ToolCalling机制使大模型能调用外部工具执行任务。核心流程包括模型输出结构化调用请求、执行工具、返回结果。三种定义工具方式:@tool装饰器、StructuredTool、BaseTool。结合Agent自动编排可实现天气查询、数学计算、数据库查询等真实场景应用。

LangChain从入门到进阶(6):学会让AI调用外部工具「喂饭教程」

先说几句实在的。做AI应用开发这么久,一个最深的感触就是:光靠大模型“说”,远远不够。真正能落地的场景,往往需要模型去“做”——查天气、搜网页、调数据库、发邮件……这些能力不再依赖模型内部的知识,而是通过一套清晰的接口,把外部工具的调用权交到AI手里。

这篇文章要聊的,正是LangChain中核心又实用的一个机制:Tool Calling(工具调用)。我会把从概念到实战的完整路径捋清楚,包括三种定义工具的方式、Agent自动编排、错误处理、结构化返回、异步调用等进阶技巧,最后还会给一个完整的数据库查询助手示例。学完这一篇,你完全可以自己动手搭出一个能执行真实任务的AI助手。

一、Tool Calling是什么?

1.1 传统AI的局限

先看一个最简单的例子:直接问AI一个需要实时数据的问题,比如“今天北京气温多少?”传统模型只能根据训练数据中的知识回答,但它并不知道此刻真实的天气。要解决这个问题,就需要让AI能主动去调用一个天气API,再把结果组织成自然语言返回。

换句话说,Tool Calling的本质是:模型在生成文本的过程中,识别出需要外部能力介入的时机,输出一个结构化的“工具调用请求”,然后由程序去执行这个工具,把结果再喂回模型,让它继续生成最终回答。

这个过程听起来复杂,但LangChain已经封装得相当优雅。下面我们直接上手。

1.2 Tool Calling的工作流程

整个流程可以简化为四个步骤:

  1. 模型分析用户输入,判断是否需要调用某个工具;
  2. 如果需要,模型输出一个包含工具名称和参数的JSON;
  3. 应用层接收到这个JSON,去执行对应的函数(比如查数据库、调API);
  4. 将工具返回的结果回传给模型,模型结合上下文继续生成回答。

这么看,Tool Calling不仅仅是一个技术实现,它更是一种思维范式的转变——从“模型作为知识的输出端”变为“模型作为思考和调度的中枢”。

二、环境准备

在开始之前,确保你的环境已经安装了必要的依赖。这里推荐使用 langchainlangchain-openai,以及 dotenv 来管理你的API密钥。

pip install langchain langchain-openai python-dotenv

然后创建一个 .env 文件,写入你的OpenAI API Key。接下来,我们可以开始定义第一个工具。

三、3种定义工具的方式

方式1:使用@tool装饰器(推荐)

这是最简洁的方式。只需写一个普通的Python函数,加上 @tool 装饰器,LangChain就能自动解析函数的签名、文档字符串和类型提示,生成符合模型要求的工具Schema。

from langchain.tools import tool

@tool
def get_weather(city: str) -> str:
    """获取指定城市的实时天气"""
    # 这里应该是真实的API调用,返回模拟数据
    return f"当前{city}气温22°C,晴朗。"

这种方式省时省力,适合大多数场景。而且LangChain会通过函数的docstring自动生成工具的描述,所以写好docstring很关键。

方式2:使用StructuredTool

如果需要对工具的参数做更精细的控制(比如设置默认值、参数的描述、是否必填等),可以用 StructuredTool

from langchain.tools import StructuredTool

def multiply(a: int, b: int) -> int:
    return a * b

tool = StructuredTool.from_function(
    func=multiply,
    name="multiply",
    description="计算两个数字的乘积",
    args_schema=None  # 可以传入自定义的Pydantic模型
)

方式3:使用BaseTool类

当工具逻辑比较复杂,或者需要管理状态时,可以继承 BaseTool 类。这种方式最灵活,但代码量也最大。

from langchain.tools import BaseTool
from pydantic import BaseModel, Field

class SearchInput(BaseModel):
    query: str = Field(description="搜索关键词")

class SearchTool(BaseTool):
    name = "search"
    description = "搜索网络信息"
    args_schema: type[BaseModel] = SearchInput

    def _run(self, query: str) -> str:
        # 实现搜索逻辑
        return f"关于'{query}'的搜索结果..."

三种方式可以根据场景灵活选择。日常项目中,用 @tool 装饰器能覆盖九成以上的需求。

四、自动执行工具:Agent

定义好工具后,我们需要一个“大脑”来决定什么时候调用哪个工具。这就是Agent(袋里)的角色。LangChain提供了多种Agent类型,最常用的是 OpenAI Tools Agent

from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o", temperature=0)
tools = [get_weather, multiply]

agent = create_openai_tools_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

这里需要补充一个 prompt,用于指导Agent的行为。LangChain内置了 ChatPromptTemplate 来方便构造。

当Agent收到用户的问题时,它会自动决定:是直接回答,还是调用某个工具。如果工具调用发生,Agent会等待工具返回结果,然后继续推理。整个过程就像在写一段多步的思维链。

五、实战案例:数据库查询助手

一个很实际的应用:让AI通过自然语言查询数据库。比如用户问“上个月销量最高的产品是什么?”——先让AI调用 query_database 工具执行SQL,拿到结果后再回答。

@tool
def query_database(sql: str) -> str:
    """执行SQL查询,返回结果字符串"""
    # 这里连接到真实数据库
    import sqlite3
    conn = sqlite3.connect("sales.db")
    cursor = conn.cursor()
    cursor.execute(sql)
    result = cursor.fetchall()
    conn.close()
    return str(result)

注意,直接让AI生成SQL存在安全风险,实际生产环境中需要对SQL执行权限做严格限制,或者使用固定模板。这里只是演示流程。

六、进阶技巧

1. 工具错误处理

工具在执行过程中可能失败(比如网络超时、数据库连接异常)。一个好的做法是在工具内部捕获异常,并返回人类可读的错误信息。Agent在收到错误后,可以尝试重试或者向用户解释。

@tool
def safe_call(api_url: str) -> str:
    try:
        response = requests.get(api_url, timeout=5)
        response.raise_for_status()
        return response.text
    except Exception as e:
        return f"调用失败: {str(e)}"

2. 工具返回结构化数据

有时工具返回的数据是列表或字典,直接转成字符串会丢失结构。更好的做法是返回JSON字符串,然后在Agent的prompt中告诉它如何解析。

@tool
def get_stock_price(symbol: str) -> str:
    # 返回JSON格式
    data = {"symbol": symbol, "price": 150.25, "change": -0.5}
    return json.dumps(data)

3. 工具依赖关系

有些工具之间存在依赖,比如先查用户ID,再查订单。在Agent中,你只需把两者都注册为工具,Agent会通过多轮调用自动串联起来。如果希望强制顺序,可以在工具内部调用另一个工具(但需要小心循环)。

4. 异步工具

如果你的应用是异步框架(如FastAPI),可以用 @toolasync 版本。LangChain原生支持异步Agent。

@tool
async def async_search(query: str) -> str:
    # 使用aiohttp等异步库
    ...

5. 工具权限控制

在多用户场景下,不同的用户应该只能调用自己有权使用的工具。可以在工具内部检查上下文中的用户信息,或者通过一个中间层做授权。

比如,在AgentExecutor的 callbacks 中拦截工具调用,校验权限后再放行。

七、常见问题与解决方案

Q1: AI不调用工具怎么办?

检查工具的描述是否清晰。模型完全依赖工具的name和description来决策。如果描述太模糊,模型可能“忘记”调用。建议在description中明确说明适用的场景。另外,可以调整模型温度至0,减少随机性。

Q2: 工具调用失败怎么处理?

在工具内部做好try-except,返回友好的错误信息。然后可以通过Agent的 max_retries 参数设置重试次数,或者让模型根据错误信息自行判断是否需要重试。

Q3: 如何限制工具调用次数?

AgentExecutor 中设置 max_iterations 参数,防止模型陷入无限循环。例如 max_iterations=5,超过次数后Agent会停止并返回当前结果。

Q4: 如何调试工具调用?

设置 verbose=True,Agent会打印出每一步的思考过程和工具调用结果。另外可以启用LangChain的Tracing功能(与LangSmith集成),可视化地查看每次调用的完整链。

Q5: 如何处理多语言工具?

工具本身不受语言限制。关键是模型的prompt要适配语言。如果需要中文输出,可以在工具返回后,让模型用中文总结。注意工具的名称和描述最好也使用对应语言,否则模型可能不理解。

八、完整示例:多功能AI助手

下面是一个集成天气查询、数学计算和数据库查询的完整示例(只展示核心代码结构):

from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_openai import ChatOpenAI
from langchain.tools import tool
from langchain.prompts import ChatPromptTemplate

@tool
def get_weather(city: str) -> str:
    """获取指定城市天气"""
    ...

@tool
def multiply(a: int, b: int) -> int:
    """计算两数乘积"""
    ...

@tool
def query_db(sql: str) -> str:
    """执行SQL查询"""
    ...

tools = [get_weather, multiply, query_db]
llm = ChatOpenAI(model="gpt-4o")
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个智能助手,可以使用工具来回答问题。"),
    ("human", "{input}"),
    ("placeholder", "{agent_scratchpad}")
])
agent = create_openai_tools_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

result = agent_executor.invoke({"input": "北京今天天气如何?顺便计算123*456"})
print(result["output"])

总结

Tool Calling是让大模型从“对话玩具”走向“生产工具”的关键一步。理解它的工作流程,掌握三种工具定义方式,再配合Agent的自动调度,基本就能应对绝大多数业务场景。

真正需要花心思的,其实不是技术实现,而是对工具粒度和描述的打磨。工具设计得好,模型用得顺手;工具设计得糙,再强的Agent也只能反复尝试。

希望这篇内容能帮你跨过“让AI动手做事”这道门槛。下一篇,我们可能会聊聊如何让Agent的推理过程更可控,或者如何把多个Agent编排成一个协作系统。方向很多,但核心始终不变:让AI真正服务现实世界。

来源:https://blog.csdn.net/weixin_48321392/article/details/155533678
上一篇Unity学习资源超全汇总:基础项目进阶面试 下一篇StableDiffusion教程:AI绘图十二生肖古代将军图景
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Continue Windows 本地安装配置教程 2026 最新版 下载地址与环境要求
AI教程 · 2026-07-02

Continue Windows 本地安装配置教程 2026 最新版 下载地址与环境要求

Continue是面向VSCode与JetBrains的AI编程插件,可连接云端或本地模型。Windows安装需准备编辑器、运行环境与模型服务,配置时应重点处理接口、索引、隐私与性能问题。

Tabnine新手从下载到首次运行保姆级安装教程
AI教程 · 2026-07-02

Tabnine新手从下载到首次运行保姆级安装教程

Tabnine是面向开发者的AI编程工具,适合在常见代码编辑器中辅助补全代码。安装前需确认环境、账号与编辑器版本,首次运行应完成登录、项目索引、补全测试和隐私设置。

Tabnine安装失败常见报错、日志排查与升级回滚方案
AI教程 · 2026-07-02

Tabnine安装失败常见报错、日志排查与升级回滚方案

Tabnine安装异常通常与编辑器版本、网络连接、权限、缓存或插件冲突有关。可按环境检查、日志定位、重装清理、版本切换和回滚流程逐步处理,并注意代码隐私与插件来源安全。

Tabnine插件安装配置全流程:浏览器编辑器扩展市场
AI教程 · 2026-07-02

Tabnine插件安装配置全流程:浏览器编辑器扩展市场

Tabnine适合在主流编辑器中提供代码补全与生成辅助。安装前需确认官方来源、账号策略和编辑器版本,按扩展市场或离线包方式完成配置,并注意隐私、授权与兼容问题。

Tabnine本地模型运行全攻略:下载配置与性能优化
AI教程 · 2026-07-02

Tabnine本地模型运行全攻略:下载配置与性能优化

Tabnine可在本地运行代码补全模型,适合重视代码隐私、网络环境不稳定或企业内网开发场景。配置重点包括版本确认、模型下载、路径设置、资源分配、IDE检查与性能调优。