LangChain入门教程 - 使用代理Agent

对于大模型,比如某些场景,需要数学计算,或者需要从某些网站获取参考资料,就必须使用专门的代理来完成任务。这里我们使用langchain提供的数学工具来实现一个最简单的例子,下一篇我们会讲如何自己实现代理。

首先创建一个对话模型,记得自己设置环境变量QIANFAN_AKQIANFAN_SK

python 复制代码
from langchain_community.chat_models import QianfanChatEndpoint

chatModel = QianfanChatEndpoint(
    model='ERNIE-Bot',
    endpoint='completions'
)

组装代理

我们使用lc库提供的数学包LLMMathChain组装数学代理,负责数学相关的计算工作。这里简单解释一下代理的工作原理,不完全正确,但大概原理是没跑的:大模型在收到问题后,和工具的描述匹配一下,决定使用哪些工具。然后把问题理解后生成合适的参数调用工具并返回结果。这里面是个大黑盒,怎么理解和拆分问题并匹配工具都是由大模型自己决定的,你只能通过提示词给出参考。对于百度的千帆,测试中发现对于数学问题用英文提问比较好,如果是中文理解就问有问题,没法正确调用工具。

python 复制代码
from langchain import LLMMathChain
from langchain.agents import AgentType, initialize_agent
from langchain.tools import BaseTool, Tool
from pydantic import BaseModel, Field

tools = []

class CalculatorInput(BaseModel):
    question: str = Field()
    
llm_math_chain = LLMMathChain(llm=chatModel, verbose=True)

tools.append(
    Tool.from_function(
        func=llm_math_chain.run,
        name='牛逼的计算器',
        description='用于回答数学问题',
        args_schema=CalculatorInput
    )
)


# ZERO_SHOT_REACT_DESCRIPTION代表根据工具的描述进行选择
agent = initialize_agent(
    tools, chatModel, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)

这里args_schema参数用于构造输入参数,CalculatorInut的写法参考pydantic的文档:pydantic · PyPI

提问

python 复制代码
# 使用英文便于大模型理解
agent.run(
    'What is the result of 5.85 raised to the 2.16 power?'
)

"""输出
> Entering new AgentExecutor chain...

This is a mathematical question that requires raising a number to a specific power.

Action: 牛逼的计算器
Action Input: Calculate 5.85 raised to the power of 2.16


> Entering new LLMMathChain chain...
Calculate 5.85 raised to the power of 2.16

```text
5.85**2.16
```
...numexpr.evaluate("5.85**2.16")...

Answer: 45.400085499141575
> Finished chain.

Observation: Answer: 45.400085499141575
Thought:I now know the result of 5.85 raised to the 2.16 power.

Final Answer: 5.85 raised to the 2.16 power is equal to 45.400085499141575.

> Finished chain.
"""

代理是如何执行的?

前面我们在构造tool时,func参数设置为llm_math_chain.run。那么这个函数支持哪些参数,被调用时传进来的参数又是什么样的呢?一种方法是找源码,那个比较费事,我们可以inspect库提供的方法查看信息,然后自己在run函数外面包一层,就能看到想要看的信息了。

使用inspect函数查看信息,我们可以看到run有哪些参数和参数的默认值。

python 复制代码
import inspect

sig = inspect.signature(llm_math_chain.run)

for name, para in sig.parameters.items():
    print(name, para.default)

'''输出
args <class 'inspect._empty'>
callbacks None
tags None
metadata None
kwargs <class 'inspect._empty'>
'''

我们在这里只关心第一个参数args,我们自己定义一个函数打印传了什么参数进来。

python 复制代码
from langchain import LLMMathChain
from langchain.tools import BaseTool, Tool
from pydantic import BaseModel, Field

tools = []

class CalculatorInput(BaseModel):
    question: str = Field()
    
llm_math_chain = LLMMathChain(llm=chatModel, verbose=True)

def my_math_func(*args):
    print('输入参数', args)
    return llm_math_chain.run(*args)

tools.append(
    Tool.from_function(
        func=my_math_func,
        name='牛逼的计算器',
        description='用于回答数学问题',
        args_schema=CalculatorInput
    )
)

'''
我们可以看到以下输出:

Action: 牛逼的计算器

Action Input: Calculate 5.85 raised to the 2.16 power.
输入参数 ('Calculate 5.85 raised to the 2.16 power.\n',)
'''
相关推荐
喵手7 分钟前
Python爬虫实战:用代码守护地球,追踪WWF濒危物种保护动态!
爬虫·python·爬虫实战·濒危物种·零基础python爬虫教学·wwf·濒危物种保护动态追踪
梦想的旅途28 分钟前
如何通过 QiWe API 实现企业微信主动发消息
开发语言·python
喵手13 分钟前
Python爬虫实战:自动化抓取 Pinterest 热门趋势与创意!
爬虫·python·爬虫实战·pinterest·零基础python爬虫教学·采集pinterest热门趋势·热门趋势预测
无心水14 分钟前
【OpenClaw:应用与协同】23、OpenClaw生产环境安全指南——Token管理/沙箱隔离/权限最小化
大数据·人工智能·安全·ai·性能优化·openclaw
向上的车轮14 分钟前
AI Agent开发框架——站在巨人肩膀上的入门指南(一):思考-行动的循环
人工智能
_YiFei16 分钟前
2026年度论文降重工具全维度评测|高效、合规、低重复率综合榜单
人工智能·深度学习
renhongxia117 分钟前
从模仿到创造:具身智能的技能演化路径
人工智能·深度学习·神经网络·算法·机器学习·知识图谱
凌晨一点的秃头猪18 分钟前
Python文件操作
开发语言·python
小张贼嚣张28 分钟前
数据分析全流程实战:Python(Pandas/Matplotlib/Numpy)+ MySQL(附可下载数据源+多图形绘制)
python·数据分析·pandas
刀法如飞30 分钟前
AI时代,人人都是Agent工程师
人工智能·agent·ai编程