大模型是基于以前的数据进行训练的,不一定可以回答所有问题,例如“今天天气怎样?”,是无法回答的,所以提供了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

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐