langchain使用function_call调用本地函数
·
大模型是基于以前的数据进行训练的,不一定可以回答所有问题,例如“今天天气怎样?”,是无法回答的,所以提供了function_call和MCP的方法。function_call可调用本地的函数;MCP是提供了远程和本地调用的通讯协议(json-rpc),只要遵循响应的协议就可以调用服务器上函数。
这里介绍function_call方法:
函数的两种写法:
1:用tool装饰器装饰,对函数进行注释以供大模型了解函数是做什么用的,参数又是什么
2:在tool装饰器中带参数,对函数进行注释
import os
from typing import List
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.tools import tool
from langgraph.prebuilt import chat_agent_executor
from openai import OpenAI
from dotenv import load_dotenv
load_dotenv(dotenv_path=".env")
@tool
def validate_user(user_id: int, addresses: List[str]) -> bool:
"""
Validate user using historical addresses.
:param user_id: the user ID.
:param addresses: Previous addresses as a list of strings.
:return:True or False
"""
print(f"===user_id:{user_id}, addresses:{addresses}") # 此处可能要查数据库
return True
@tool
def get_weather(address: str) -> str:
"""
获取一个地方的天气信息
:param address: 地名.
:return:返回查询的天气信息
"""
print(f"===地名:{address}") # 此处可能要调其他网站的API查天气信息
return f"{address}天气:晴空万里。"
@tool("data multiply", description="乘法运算:计算两个数字相乘")
def multiply(a: int, b: int) -> int:
return a * b
from langchain_modelscope import ModelScopeChatEndpoint
llm = ModelScopeChatEndpoint(model="Qwen/Qwen2.5-Coder-32B-Instruct")
tools = [validate_user, get_weather, multiply]
modelscope每天允许大量调用,所有用langchain_modelscope来调用大模型。tools里指定所有可用工具
下面是agent执行,第一个是大模型直接返回,其他的需要调用工具。大模型可以直接回答的就不会调工具
agent_executor = chat_agent_executor.create_tool_calling_executor(llm, tools)
resp = agent_executor.invoke({"messages": [HumanMessage(content="你的名字是什么?")]})
print(resp["messages"][2].content if len(resp["messages"])>2 else resp["messages"][1].content)
resp = agent_executor.invoke({"messages": [HumanMessage(content="请校验一下用户123,他以前在河南省郑州市和北京市西城区住过")]})
print(resp["messages"][2].content if len(resp["messages"])>2 else resp["messages"][1].content)
resp = agent_executor.invoke({"messages": [HumanMessage(content="北京的天气怎样?")]})
print(resp["messages"][2].content if len(resp["messages"])>2 else resp["messages"][1].content)
resp = agent_executor.invoke({"messages": [HumanMessage(content="帮我计算一下4乘以5")]})
print(resp["messages"][2].content if len(resp["messages"])>2 else resp["messages"][1].content)

返回结果如上图所示,若大模型直接回答,那么长度为2;若调用工具,那么长度为4。根据需要来选择答案,所以用三元表达式来获取:resp["messages"][2].content if len(resp["messages"])>2 else resp["messages"][1].content
更多推荐
所有评论(0)