2025.10.25
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
import os
|
||||
from dotenv import load_dotenv
|
||||
from openai import OpenAI
|
||||
import json
|
||||
|
||||
load_dotenv()
|
||||
|
||||
|
||||
def create_client():
|
||||
api_key = os.getenv("OPENAI_API_KEY")
|
||||
return OpenAI(api_key=api_key, base_url="https://api.deepseek.com")
|
||||
|
||||
def get_weather(location):
|
||||
# 模拟获得天气信息
|
||||
return f"{location}当前天气:23℃,晴,风力2级"
|
||||
|
||||
|
||||
# 以下格式为固定写法,一般仅需改description与name
|
||||
get_weather_func = {
|
||||
"name": "get_weather", # 函数名称
|
||||
"description": "获取指定城市的天气情况", # 对该函数的描述
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"location": {
|
||||
"type": "string", # 该参数类型
|
||||
"description": "城市名称,如北京、上海等" # 对该参数的描述
|
||||
}
|
||||
},
|
||||
"required": ["location"] # 声明必填
|
||||
}
|
||||
}
|
||||
|
||||
# 固定写法,有多少个tool就往里追加多少个
|
||||
tools = [
|
||||
{
|
||||
"type": "function",
|
||||
"function": get_weather_func
|
||||
}
|
||||
]
|
||||
|
||||
def chat_loop(agent_client, tools):
|
||||
messages = [
|
||||
{"role": "system",
|
||||
"content": "你是一个善解人意会热心回答人问题的助手。如果你感觉你回答不了当前问题,就会调用函数来回答。"},
|
||||
{"role": "user", "content": "北京今天的天气怎么样?"}
|
||||
]
|
||||
response = agent_client.chat.completions.create(
|
||||
model="deepseek-chat",
|
||||
messages=messages,
|
||||
tools=tools, # 调用工具
|
||||
tool_choice="auto" # 模型自主选择是否调用工具
|
||||
)
|
||||
message = response.choices[0].message
|
||||
# 如果有该参数,证明ai调用了工具
|
||||
if message.tool_calls:
|
||||
# 对每个可能要调用的工具进行循环
|
||||
for tool_call in message.tool_calls:
|
||||
if tool_call.function.name == "get_weather":
|
||||
# 解析参数
|
||||
args = json.loads(tool_call.function.arguments) # 获取用户关键词的参数
|
||||
location = args.get("location", "未知地点")
|
||||
|
||||
# 调用真实参数
|
||||
weather_info = get_weather(location)
|
||||
|
||||
# 将函数执行结果以"tool"角色传给模型,等待后面二次调用
|
||||
messages.append(message) # 先添加模型的原始响应
|
||||
messages.append({
|
||||
"role": "tool",
|
||||
"tool_call_id": tool_call.id,
|
||||
"name": tool_call.function.name,
|
||||
"content": weather_info
|
||||
})
|
||||
# 第二次调用,让模型基于工具返回的结果再生成最终答案
|
||||
final_res = agent_client.chat.completions.create(
|
||||
model="deepseek-chat",
|
||||
messages=messages
|
||||
)
|
||||
print('已调用工具...')
|
||||
print(f'回答:{final_res.choices[0].message.content}')
|
||||
else:
|
||||
# 模型没有要调用工具,直接返回
|
||||
print('未调用工具...')
|
||||
print(f'回答:{response.choices[0].message.content}')
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
client = create_client()
|
||||
chat_loop(client, tools)
|
||||
Reference in New Issue
Block a user