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 而不是大模型输出