写代码得心应手的 AI 工具:FunctionCall

114 阅读3分钟

引言:

在我们问一些大模型( large language model( LLM ) )问题的时候可能会出现这一问题: 当我们不联网搜索或是在一个本地部署的 AI 大模型上问一个实时性问题的时候,AI 可能无法给出准确回答。

当我们想知道我们附进的咖啡店时可能会出现这种情况:

image.png

大模型不知道我们的具体位置,而需要我们给出具体方位它才会去进行搜索,只能给出没啥意义的一串文字。那有什么办法可以解决这种情况呢?

我们可以自己打造一个 AI 工具,在我们问同样的问题的时候,让这个 AI 工具可以访问我们的位置权限并且获取一个接口(如高德地图),然后获取用户当前位置附近的咖啡信息,根据获取到的信息生成回答。以至于不需要我们说 我们在哪,然后他才会去搜索然后反馈我们需要的东西。那么接下来就让我们来打造这个工具,让我们知道自己怎么打造一个 AI 工具。

打造 AI 工具:

准备:

首先需要创建一个自己的 API key

然后安装以下文件:

image.png

image.png

  • 我们先来看下创建一个简易的对话工具
from openai import OpenAI 
import os
from dotenv import load_dotenv  // 专门读取 . env 环境文件
from openai.types import completion
load_dotenv('.env.local')


client = OpenAI(  // 创建一个变量
    api_key=os.getenv("DEEPSEEK_API_KEY"),  //  这样写可以防止你上传到远程仓库的时候会显示你的 API key
    base_url="https://api.deepseek.com/v1",
)
  // 官方文档的使用规则
completion = client.chat.completions.create(
  model='deepseek-reasoner',   // 使用的模型
  //  随意问题
  messages=[   
    {'role': 'system', 'content': '你是一个足球领域的专家,请尽量帮我回答与足球相关的问题。'},
    {'role': 'user', 'content': 'c罗是哪个国家的足球运动员?'},
    
  ]
)

print('思考过程:')
print(completion.choices[0].message.reasoning_content)

print('最终答案:')
print(completion.choices[0].message.content)
  • 以 FunctionCall 为规则的AI 对话工具

首先打造一个工具函数

# 函数定义(工具声明)
tools = [{
    "type": "function",
    "function": {
        "name": "get_closing_price",  # 函数名
        "description": "获取指定股票的收盘价",  # 功能描述
        "parameters": {  # 参数规范
            "type": "object",
            "properties": {"name": {"type": "string"}},
            "required": ["name"]  # 必填参数
        }
    }
}]

然后工具传进来的参数进行判断需要进行的操作:

# 首次请求(判断是否需要函数调用)
response = send_message(messages)  # 包含tools参数

# 检查工具调用
if response.choices[0].message.tool_calls:
    tool_call = response.tool_calls[0]
    
    # 解析参数并执行函数
    arguments = json.loads(tool_call.function.arguments)
    price = get_closing_price(arguments['name'])
    
    # 将结果加入对话历史
    messages.append({
        "role": "tool",
        "content": price,
        "tool_call_id": tool_call.id
    })
    
    # 二次请求(生成最终回复)
    final_response = send_message(messages)
    print(final_response.choices[0].message.content)

以下就是需要通过调用接口去获取详信息了(这里还未获取接口,如果实现实时真实信息需要获取对应的接口去得到实时的真实数据然后 return 相应的数据)

# 实际函数实现
def get_closing_price(name):
    if name == '青岛啤酒': return '67.92'
    elif name == '贵州茅台': return '1488.21'
    else: return '未找到该股票'

以下就是整个项目的工作流程了:

image.png