赞
踩
目录
ChatGPT4相比于ChatGPT3.5,有着诸多不可比拟的优势,比如图片生成、图片内容解析、GPTS开发、更智能的语言理解能力等,但是在国内使用GPT4存在网络及充值障碍等问题,如果您对ChatGPT4.0感兴趣,可以私信博主为您解决账号和环境问题。同时,如果您有一些AI技术应用的需要,也欢迎私信博主,我们聊一聊思路和解决方案
Function Calling 是一种函数调用机制,在使用 大模型进行prompt 提问时,大模型现有的知识库不一定有能力立即回答你的问题,但我们在提问时可以告诉大模型,我们有几个函数,让它结合我们的提问告诉程序,应该去调用哪个函数,并从给的提问中解析出参数。程序会根据大模型返回的函数和入参生成一个结果。然后程序将 最初的提问和函数调用结果一并发给 大模型进行 prompt ,这个时候,大模型就能回答出我们的问题了。
举例:
1. 我们调用API向大模型提问:推荐北京五道口附近的咖啡店。同时告诉大模型,我们定义了一个函数,这个函数需要参数是:地名、关键词
2. 大模型从我们的提问中解析出地名、关键词和函数的对应关系返回。如:地点搜索函数,入参是 北京五道口,咖啡店。
3. 程序根据大模型返回的参数调用 高德API返回咖啡店的位置信息。、
4. 程序将咖啡店的位置信息和最初的提问一并告诉大模型。
5. 大模型基于程序给的信息就能回答出这个问题了。
Function Calling 完整的官方接口文档:https://platform.openai.com/docs/guides/function-calling
需求:实现一个回答问题的 AI。题目中如果有加法,必须能精确计算。
- # 初始化
- from openai import OpenAI
- from dotenv import load_dotenv, find_dotenv
- import json
-
- _ = load_dotenv(find_dotenv())
-
- client = OpenAI()
-
-
- def print_json(data):
- """
- 打印参数。如果参数是有结构的(如字典或列表),则以格式化的 JSON 形式打印;
- 否则,直接打印该值。
- """
- if hasattr(data, 'model_dump_json'):
- data = json.loads(data.model_dump_json())
-
- if (isinstance(data, (list))):
- for item in data:
- print_json(item)
- elif (isinstance(data, (dict))):
- print(json.dumps(
- data,
- indent=4,
- ensure_ascii=False
- ))
- else:
- print(data)
-
-
- def get_completion(messages, model="gpt-3.5-turbo"):
- response = client.chat.completions.create(
- model=model,
- messages=messages,
- temperature=0.7,
- tools=[{ # 用 JSON 描述函数。可以定义多个。由大模型决定调用谁。也可能都不调用
- "type": "function",
- "function": {
- "name": "sum",
- "description": "加法器,计算一组数的和",
- "parameters": {
- "type": "object",
- "properties": {
- "numbers": {
- "type": "array",
- "items": {
- "type": "number"
- }
- }
- }
- }
- }
- }],
- )
- return response.choices[0].message
-
-
-
-
- from math import *
-
- prompt = "Tell me the sum of 1, 2, 3, 4, 5, 6, 7, 8, 9, 10."
- # prompt = "桌上有 2 个苹果,四个桃子和 3 本书,一共有几个水果?"
- # prompt = "1+2+3...+99+100"
- # prompt = "1024 乘以 1024 是多少?" # Tools 里没有定义乘法,会怎样?
- # prompt = "太阳从哪边升起?" # 不需要算加法,会怎样?
-
- messages = [
- {"role": "system", "content": "你是一个数学家"},
- {"role": "user", "content": prompt}
- ]
- response = get_completion(messages)
-
- # 把大模型的回复加入到对话历史中。必须有
- messages.append(response)
-
- print("=====GPT 第一次回复=====")
- print_json(response)
-
- # 如果返回的是函数调用结果,则打印出来
- if (response.tool_calls is not None):
- # 是否要调用 sum
- tool_call = response.tool_calls[0]
- if (tool_call.function.name == "sum"):
- # 调用 sum
- args = json.loads(tool_call.function.arguments)
- result = sum(args["numbers"])
- print("=====函数返回结果=====")
- print(result)
-
- # 把函数调用结果加入到对话历史中
- messages.append(
- {
- "tool_call_id": tool_call.id, # 用于标识函数调用的 ID
- "role": "tool",
- "name": "sum",
- "content": str(result) # 数值 result 必须转成字符串
- }
- )
-
- # 再次调用大模型
- print("=====最终 GPT 回复=====")
- print(get_completion(messages).content)
=====GPT回复===== { "content": null, "role": "assistant", "function_call": null, "tool_calls": [ { "id": "call_4Crnxkt4kj0bOspDxIiAJ6lD", "function": { "arguments": "{\"numbers\":[1,2,3,4,5,6,7,8,9,10]}", "name": "sum" }, "type": "function" } ] } =====函数返回===== 55 =====最终回复===== The sum of 1, 2, 3, 4, 5, 6, 7, 8, 9, and 10 is 55.
划重点:
划重点:
gpt-3.5-turbo-1106
和 gpt-4-1106-preview
及更高版本的模型可用本次课介绍的方法gpt-3.5-turbo
和 gpt-4-turbo
会调用最新模型,但要防范模型升级带来的负面效果,做好充足测试官方文档:文心千帆文档首页-百度智能云
百度文心 ERNIE-Bot 系列大模型都支持 Function Calling,参数大体和 OpenAI 一致,支持 examples。
官方文档:MiniMax-与用户共创智能
官方文档:ChatGLM3/tools_using_demo at main · THUDM/ChatGLM3 · GitHub
tools
而不是 function
来做参数,其它和 OpenAI 1106 版之前完全一样官方文档:星火认知大模型Web API文档 | 讯飞开放平台文档中心
和 OpenAI 1106 版之前完全一样
官方文档:如何使用通义千问API_模型服务灵积(DashScope)-阿里云帮助中心
和 OpenAI 接口完全一样。
在传统与 AI 之间徘徊:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。