从0开始搭建AI Agent(五)
这一章介绍LangChain的工具封装;
为什么需要封装工具?因为大语言模型是不能够获取到实时信息或者是第三方数据信息的,比如,在我们之前的提问中,如果提问:“今天北京的天气怎样?”,它是不能够回答的;再比如我们针对一个园区做的一些设备的监测数据(比如:某台设备的温度、某个车间的实时人数等),直接通过大语言模型也是不能拿到的,因而,就需要我们在Langchain中进行工具的封装调用,将我们的第三方接口按照Langchain的接口要求,集成进来,这样,我们在询问这些问题的时候,大语言模型就可以从对应的接口去取得数据,返回给用户。
示例流程
1.准备API接口
这里我用c#写了一个api get接口(接口自己随便准备就行,主要是测试如何能够封装到Langchain调用里面):
这个接口主要就是根据用户输入的公园名称,返回当前公园的人数统计:比如输入“双鱼公园”,返回如下:

2.编写python代码
安装包
pip install requests
封装工具
from langchain.tools import tool
import requests
from datetime import datetime
@tool
def getParkPeopleInfo(parkName:str)-> str:
"""
获取园区人员信息
参数:
parkName (str): 园区名称。
返回:
str: 园区人员信息。
"""
url = f"http://localhost:18600/businessOrchestrationControl/getParkPeopleInfo?parkName={parkName}"
response = requests.get(url,timeout=20)
print(response.text)
if response.status_code == 200:
data = response.json()
time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
return f"园区 {parkName} 的当前{time}人员总数为: {data.get('total')}, 其中男性人数为: {data.get('maleCnt')}, 女性人数为: {data.get('femaleCnt')}"
else:
return f"请求失败,状态码: {response.status_code}"
#getParkPeopleInfo('双鱼公园')
调用工具
Agent响应用户调用工具大概是:用户输入会话内容、Agent解析用户的意图、匹配相应工具、执行函数、最后整合到Agent响应;
#调用工具
from langchain.agents import create_react_agent,AgentExecutor
from langchain import hub
#创建工具
myTools = [getParkPeopleInfo]
#获取提示词
prompt = hub.pull("hwchase17/react")
#创建一个React Agent
agent = create_react_agent(llm=chat, tools=myTools, prompt=prompt)
#执行体
agent_executor = AgentExecutor(agent=agent, tools=myTools,verbose=True)
#调用
rsp = agent_executor.invoke({'input': '请帮我查询金牛公园的人员信息'})
print(rsp)
执行,打印如下结果:

可以看到智能体是如何进行工具调用的。
多个工具的调用
多数情况下,我们都需要封装多个工具,以满足不同的需求调用;
在这里,我自己又加了一个API测试接口:

根据输入的城市名称,获取天气状况,返回如下:

同样,把它封装到tool函数,同时我还加了计算两个数相乘的函数,如下:
@tool
def mutiply(input:str) -> int:
"""
计算两个整数的乘积。
参数:
input (str): 包含两个整数的字符串。
返回:
int: 两个整数的乘积。
"""
match = re.findall(r'\d+', input)
if len(match) >= 2:
a,b = map(int, match)
return a * b
注意看,我的函数定义没有写成:def mutiply(a: int, b: int) -> int:因为这种写法,LLM调用会返回类型转换的错误,所以改为用正则表达式去解析输入的数字。点击运行;
调用部分如下:

红色框线是在单个调用的基础上做的修改,很简单,写完运行即可,正常的话,可以看到大模型针对每一个问题,都去调用了对应的函数,并返回结果。
OK,下一章继续集成RAG......
更多推荐

所有评论(0)