AI智能体开发实战:LangChain工具调用链构建与ReAct推理模式配置指南

AI智能体(Agent)是大模型应用落地的核心方向,LangChain作为主流的大模型开发框架,提供了完整的工具调用链(Tool Chain)和推理模式配置能力。通过ReAct(Reasoning and Acting)推理模式,智能体能够在思考与行动之间交替执行,实现多步推理、工具调用、结果反馈的闭环。本文以LangChain为基础,搭建一个具备网络搜索和代码执行能力的AI智能体,涵盖工具定义、Agent类型选择、内存管理等关键配置。

LangChain智能体架构与ReAct推理模式原理

ReAct模式的核心在于让大模型在每一步推理中输出Thought(思考)、Action(行动)、Observation(观察)三个部分,形成循环直到得出最终答案。LangChain对此进行了封装,通过AgentExecutor管理整个执行流程。

智能体的工作流程:用户输入问题后,Agent将问题与可用工具描述一起发送给LLM,LLM返回需要调用的工具及参数,Agent执行工具调用,将结果反馈给LLM,LLM根据反馈继续推理或给出最终答案。

环境准备与依赖安装

pip install langchain langchain-openai langchain-community \
    langchain-experimental wikipedia numexpr duckduckgo-search

使用OpenAI的GPT-4作为推理引擎,配置API Key:

import os
from langchain_openai import ChatOpenAI

os.environ["OPENAI_API_KEY"] = "sk-your-api-key"

llm = ChatOpenAI(
    model="gpt-4-turbo-preview",
    temperature=0,
    max_tokens=4096
)

工具定义与@tool装饰器使用

LangChain提供@tool装饰器快速将Python函数转换为工具。每个工具需要包含name、description和参数类型注解,LLM通过description判断何时调用该工具。

from langchain.tools import tool
from langchain_community.utilities import DuckDuckGoSearchAPIWrapper
import numexpr

search = DuckDuckGoSearchAPIWrapper()

@tool
def web_search(query: str) -> str:
    """搜索互联网获取最新信息。输入搜索关键词。"""
    return search.run(query)

@tool
def calculate(expression: str) -> str:
    """数学计算器。输入数学表达式,如 '355/113' 或 '2**10 + 3*7'。"""
    try:
        result = numexpr.evaluate(expression).item()
        return f"计算结果: {result}"
    except Exception as e:
        return f"计算失败: {e}"

tools = [web_search, calculate]

Agent创建与AgentExecutor配置

LangChain提供多种Agent类型,create_tool_calling_agent适用于支持原生工具调用的模型(GPT-4、Claude等),create_react_agent适用于ReAct文本推理模式。

from langchain.agents import create_react_agent, AgentExecutor
from langchain import hub

# 拉取ReAct标准提示词模板
prompt = hub.pull("hwchase17/react")

agent = create_react_agent(llm, tools, prompt)

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,
    max_iterations=5,
    handle_parsing_errors=True,
    return_intermediate_steps=True
)

关键参数说明:

max_iterations:限制最大推理循环次数,防止无限调用工具消耗Token。handle_parsing_errors:LLM输出格式不符合预期时自动重试。return_intermediate_steps:返回中间推理步骤,便于调试和日志记录。

对话记忆与多轮交互配置

默认情况下Agent是无状态的,每次调用独立。添加ConversationBufferMemory实现多轮对话记忆:

from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True,
    output_key="output"
)

agent_with_memory = AgentExecutor(
    agent=agent,
    tools=tools,
    memory=memory,
    verbose=True,
    max_iterations=5,
    handle_parsing_errors=True
)

# 多轮对话
result1 = agent_with_memory.invoke({
    "input": "2026年中国智能算力规模是多少EFLOPS?"
})
print(result1["output"])

result2 = agent_with_memory.invoke({
    "input": "同比增长了多少百分比?"
})
print(result2["output"])

自定义工具与StructuredTool进阶用法

对于复杂参数场景,使用StructuredTool和Pydantic模型定义输入schema:

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

class DatabaseQueryInput(BaseModel):
    table_name: str = Field(description="要查询的数据库表名")
    conditions: str = Field(description="查询条件,WHERE子句内容")
    limit: int = Field(default=10, description="返回记录数量限制")

def query_database(table_name: str, conditions: str, limit: int = 10) -> str:
    """模拟数据库查询"""
    return f"从表 {table_name} 中查询条件为 {conditions} 的 {limit} 条记录"

db_tool = StructuredTool.from_function(
    func=query_database,
    name="database_query",
    description="查询数据库获取结构化数据。指定表名、查询条件和返回数量。",
    args_schema=DatabaseQueryInput
)

tools_advanced = [web_search, calculate, db_tool]
agent_advanced = create_react_agent(llm, tools_advanced, prompt)
executor_advanced = AgentExecutor(agent=agent_advanced, tools=tools_advanced, verbose=True)

错误处理与输出结构化

生产环境中需要捕获工具执行异常并返回结构化输出:

from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field

class AgentResponse(BaseModel):
    answer: str = Field(description="最终答案")
    sources: list = Field(description="引用的信息来源")
    confidence: float = Field(description="置信度0-1")

def safe_invoke(executor, query):
    try:
        result = executor.invoke({"input": query})
        return result.get("output", "无输出")
    except Exception as e:
        return f"执行异常: {e}"

response = safe_invoke(agent_executor, "计算圆周率前10位与355/113的差值")
print(response)

性能优化与Token成本控制

智能体开发中Token消耗是主要成本来源,几个优化方向:

1. 工具描述精简:description控制在50字以内,避免冗余描述消耗输入Token。

2. 使用GPT-4o-mini处理简单工具调用,GPT-4处理复杂推理,通过路由策略降低成本。

3. 设置max_iterations为3-5次,大多数任务3次工具调用足以完成。

4. 开启流式输出(streaming=True),提升用户体验的同时不增加Token消耗。

# 成本对比示例
from langchain_openai import ChatOpenAI

# 简单任务用mini模型
llm_lite = ChatOpenAI(model="gpt-4o-mini", temperature=0)
# 复杂推理用turbo模型
llm_pro = ChatOpenAI(model="gpt-4-turbo-preview", temperature=0)

def route_agent(query):
    if len(query) < 50 and "计算" in query:
        agent = create_react_agent(llm_lite, tools, prompt)
    else:
        agent = create_react_agent(llm_pro, tools, prompt)
    return AgentExecutor(agent=agent, tools=tools, verbose=True, max_iterations=3)

LangChain智能体开发的关键在于工具定义的精确性和提示词的优化。工具description越清晰,LLM选择工具的准确率越高。ReAct模式适合需要多步推理的复杂任务,对于单步工具调用场景,直接使用tool_calling功能更高效。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/ai-zhi-neng-ti-kai-fa-shi-zhan-langchain-gong-ju-diao-yong/

(0)
小编小编
上一篇 3小时前
下一篇 3小时前

相关推荐