切图仔学习llm之调用函数

27 阅读2分钟

commonn.py 封装好提示词以及llm obj

from langchain_core.prompts import ChatMessagePromptTemplate, ChatPromptTemplate
from langchain_openai import ChatOpenAI
from pydantic import SecretStr

llm = ChatOpenAI(
    model="qwen-max-latest",
    # model="qwen3-235b-a22b",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key=SecretStr(""),
    streaming=True,
)



system_message_template = ChatMessagePromptTemplate.from_template(
    template =  "你是一个{role}专家, 帮助用户解答{domain}领域的问题, 回答内容请遵守法律法规",
    role="system"
)

human_message_template = ChatMessagePromptTemplate.from_template(
    template = "用户的问题: {question}",
    role="user"
)

chat_prompt_template = ChatPromptTemplate.from_messages([
    system_message_template,
    human_message_template
])

app.py

from app.bailian.common import chat_prompt_template, llm
from langchain_core.tools import  Tool

def add (a, b):
        return a + b

# 转化fn wei langchain 可以使用的对象
add_tools =Tool.from_function(
    func=add,
    name="add",
    description="加法计算"
)


# 将tools 与llm 绑定
llm_with_tools = llm.bind_tools([add_tools])
chain = chat_prompt_template | llm_with_tools

# 调用
resp = chain.invoke(input={
    "role": "高数",
    "domain": "数学计算",
    "question": "请计算 1111+12=?"
})

# 打印响应
print(resp)

app 会输出

content='' additional_kwargs={'tool_calls': [{'index': 0, 'id': 'call_2f29bf78ed6a4cb7b357de', 'function': {'arguments': '{"__arg1": "1111", "__arg2": "12"}', 'name': 'add'}, 'type': 'function'}]} response_metadata={'finish_reason': 'tool_calls', 'model_name': 'qwen-max-latest'} id='run--2f100b30-6661-42ee-b174-67b011657fff-0' tool_calls=[{'name': 'add', 'args': {'__arg1': '1111', '__arg2': '12'}, 'id': 'call_2f29bf78ed6a4cb7b357de', 'type': 'tool_call'}]
{'name': 'add', 'args': {'__arg1': '1111', '__arg2': '12'}, 'id': 'call_2f29bf78ed6a4cb7b357de', 'type': 'tool_call'}
{'__arg1': '1111', '__arg2': '12'}
add
1123

tool_calls 是指大语言模型(LLM)在处理用户请求时,识别出需要调用特定工具(tools)来完成任务的一种结构化输出。它通常包含以下信息: name: 要调用的工具名称(例如 "add")。 args: 工具执行所需的参数列表(例如 { "__arg1": "1111", "__arg2": "12" })。

还有一种调用方法是注解

tool装饰器注册工具+args_schema精确控制工具入参


from pydantic import BaseModel, Field

from app.bailian.common import chat_prompt_template, llm
from langchain_core.tools import  Tool, tool

# @tool
# def add (a, b):
#         return a + b

# 这样参数和方法会被精准的抓取 理解
class AddInputArgs(BaseModel):
    a: int = Field(description="第一个数字")
    b: int = Field(description="第二个数字")

@tool(
    description="加法计算",
    args_schema=AddInputArgs # 定义入参类型 是class类型
)
def add (a, b):
    """add two numbers"""
    return a + b

# 转化fn wei langchain 可以使用的对象
# add =Tool.from_function(
#     func=add,
#     name="add",
#     description="加法计算"
# )

# 将tools 与llm 绑定
llm_with_tools = llm.bind_tools([add])
chain = chat_prompt_template | llm_with_tools

# 调用
resp = chain.invoke(input={
    "role": "高数",
    "domain": "数学计算",
    "question": " 1111+12=?"
})

# 打印响应
print(resp)


tools_dict = {
    "add": add
}



for tool_calls in resp.tool_calls:
    print(tool_calls) # 数组

    args = tool_calls["args"]
    print(args)

    fn_name = tool_calls["name"]
    print(fn_name)

    tool_func = tools_dict[fn_name]

    # 加上注解后 调用方式和参数发生变化
    print(tool_func.invoke(args))

# 注意  大模型不一致,请自行测试
# 有参数打印证明走的是tools 而不是大模型输出