LangChain Agent实践:构建智能推理和工具调用系统

LangChain Agent实践:构建智能推理和工具调用系统

引言

LangChain的Agent(智能体)系统提供了一种强大的机制,能够让AI模型进行推理并自主决定何时调用工具函数。本文将详细介绍如何使用LangChain构建和使用Agent系统。

环境准备

import os
from dotenv import load_dotenv
from langchain.agents import initialize_agent, AgentType
from langchain.tools import tool
from langchain_core.tools import StructuredTool
from langchain_openai import ChatOpenAI

# 加载环境变量
load_dotenv()

模型配置

model = ChatOpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key=os.getenv("KEY"),
    model="google/gemini-2.0-flash-001"
)

工具函数定义

1. 使用StructuredTool

def get_sunset(region: str):
    """
    获取指定地区的日落时间
    :param region: 地区
    :return: 日落时间信息
    """
    return f"{region}日落时间为18:30"

# 转换为工具
getSunsetTool = StructuredTool.from_function(
    func=get_sunset,
    description="获取指定地区的日落时间",
    name="get_sunset"
)

2. 使用@tool装饰器

@tool
def get_weather(region: str):
    """
    获取指定地区的天气
    :param region: 地区
    :return: 天气信息
    """
    return f"{region}晴天,25度"

Agent初始化和使用

# 初始化Agent
agent = initialize_agent(
    tools=[get_weather, getSunsetTool],
    llm=model,
    agent_type=AgentType.OPENAI_FUNCTIONS,
    verbose=True  # 启用详细输出
)

# 使用Agent处理查询
query = "上海今天天气怎么样什么时候日落"
response = agent.invoke(query)
print(response)

Agent工作流程解析

当Agent收到查询时,会经历以下步骤:

  1. 思考阶段(Thought)

    I need to find out the weather and sunset time for Shanghai.
    
  2. 行动选择(Action)

    Action: get_weather
    Action Input: 上海
    
  3. 观察结果(Observation)

    Observation: 上海晴天,25度
    
  4. 继续推理

    Thought: I have the weather information for Shanghai. Now I need to get the sunset time.
    
  5. 执行下一个动作

    Action: get_sunset
    Action Input: 上海
    
  6. 生成最终答案

    Final Answer: 上海今天晴天,25度,日落时间为18:30
    

技术要点解析

1. Agent类型

agent_type=AgentType.OPENAI_FUNCTIONS
  • OPENAI_FUNCTIONS:使用OpenAI函数调用方式
  • 其他可用类型:ZERO_SHOT_REACT_DESCRIPTION, STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION等

2. 工具注册

tools=[get_weather, getSunsetTool]
  • 支持多个工具同时注册
  • 工具可以混合使用@tool和StructuredTool

3. 详细输出

verbose=True
  • 显示Agent的思考和决策过程
  • 便于调试和理解Agent的行为

最佳实践

1. 工具函数设计

@tool
def get_detailed_weather(region: str):
    """
    获取详细的天气信息
    Args:
        region: 地区名称
    Returns:
        包含温度、湿度、风向等信息的详细天气报告
    """
    return {
        "temperature": "25度",
        "humidity": "65%",
        "wind": "东北风3级"
    }

2. 错误处理

@tool
def safe_tool_call(func_name: str, *args):
    try:
        return globals()[func_name](*args)
    except Exception as e:
        return f"调用{func_name}失败:{str(e)}"

3. 复杂查询处理

def process_complex_query(query):
    try:
        response = agent.invoke({
            "input": query,
            "context": {"time": "morning", "location": "Shanghai"}
        })
        return response["output"]
    except Exception as e:
        return f"处理查询失败:{str(e)}"

应用场景

  1. 智能助手

    • 个人助理
    • 客服系统
    • 信息查询
  2. 自动化工作流

    • 数据处理
    • 系统集成
    • 任务调度
  3. 决策支持

    • 数据分析
    • 推荐系统
    • 风险评估

注意事项

  1. 性能优化

    • 避免过多的工具调用
    • 合理设置超时时间
    • 使用缓存机制
  2. 安全性

    • 输入验证
    • 权限控制
    • 资源限制
  3. 可维护性

    • 清晰的工具文档
    • 模块化设计
    • 日志记录

结论

LangChain的Agent系统提供了一种智能的方式来组合和使用工具函数,通过合理的配置和使用,可以构建出强大的AI应用系统。

参考资料

  • LangChain官方文档
  • OpenAI Functions文档
  • Agent系统最佳实践指南

通过本文的介绍,你应该能够理解如何使用LangChain的Agent系统来构建智能的工具调用流程,为AI应用添加更多的实用功能。

### LangChain Agent 的概述 LangChain 是一种用于构建基于大型语言模型的应用程序的框架,而其中的核心组件之一就是 **Agent**。Agent 能够根据输入的任务动态调用不同的工具集,通过迭代的方式完成复杂任务[^1]。 #### 什么是 LangChain AgentLangChain 中的 Agent 是指能够自主决策执行操作的一种机制。它可以根据用户的请求自动选择合适的工具(Tools),通过多次交互逐步解决问题。这种能力使得 Agent 成为了处理多步推理复杂查询的理想解决方案[^3]。 --- ### LangChain Agent 的工作原理 Agent 的核心功能在于其能够解析用户输入、选择适当的工具以及生成最终响应。以下是它的主要流程: 1. 用户提供自然语言指令。 2. Agent 解析该指令将其转化为可执行的操作序列。 3. 基于这些操作,Agent 动态调用预定义的一组工具(如搜索引擎、数据库接口或其他外部服务)。 4. 工具返回的结果被反馈到 Agent,后者会继续优化后续动作直至目标达成[^5]。 例如,在 OpenAI 提供的支持函数调用的功能中,默认提示可以通过如下方式加载: ```python from langchain.agents import load_tools, initialize_agent from langchain.llms import OpenAI llm = OpenAI(temperature=0) tools = load_tools(["serpapi", "llm-math"], llm=llm) agent_chain = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True) ``` 上述代码片段展示了如何初始化一个简单的零样本反应描述型代理 (Zero-Shot React Description),此类型的代理无需任何训练即可运行[^2]。 --- ### 示例代码:创建自定义 LangChain Agent 下面是一个完整的例子,演示了如何利用 SerpAPI LLM 数学计算工具来解决涉及网络搜索与算术运算的问题。 ```python import os from langchain.agents import Tool, initialize_agent, AgentType from langchain.tools import BaseTool from langchain.utilities import SerpAPIWrapper from langchain.prompts import PromptTemplate from langchain.chains import LLMChain from langchain.llms import OpenAI class CustomSearchTool(BaseTool): name = "custom_search" description = "A tool that uses a custom search engine to find information." def _run(self, query: str) -> str: serp_api_key = os.getenv('SERP_API_KEY') search = SerpAPIWrapper(serpapi_api_key=serp_api_key) result = search.run(query) return f"Searched for {query}. Found: {result}" async def _arun(self, query: str) -> str: raise NotImplementedError() # 初始化LLM实例 llm = OpenAI(model_name="text-davinci-003") # 加载工具 search_tool = CustomSearchTool() tools = [ Tool( name=search_tool.name, func=search_tool._run, description=search_tool.description ) ] # 设置Prompt模板 prompt_template = """Use the following pieces of context to answer the question at the end. {context} Question: {question} Answer:""" prompt = PromptTemplate(template=prompt_template, input_variables=["context", "question"]) # 构建链式结构 chain = LLMChain(llm=llm, prompt=prompt) # 初始化Agent agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) # 测试Agent response = agent.run("What is the capital city of France and what's its population?") print(response) ``` 在这个脚本里,我们首先定义了一个名为 `CustomSearchTool` 的类继承自 `BaseTool` 接口;接着配置好所需的参数之后便可以轻松实现跨平台数据抓取等功能[^4]。 --- ### 总结 综上所述,LangChain Agents 不仅提供了强大的灵活性还简化了许多繁琐的手动编码环节,让开发者得以专注于业务逻辑本身而非底层细节。无论是初学者还是资深工程师都能从中受益匪浅。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值