这一章介绍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......

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐