给大语言模型插上翅膀
1.引言 有人说,智慧是 知识 + 运用知识的能力。从这个角度来看,大语言模型(如ChatGPT) 在某种程度上可以被认为具有一定形式的智慧。然而现在针对大语言模型的使用有一个问题, 就是模型所具有的知识无法保持实时更新。比如某个API文档发生变化,大语言模型仍然只能基于历史知识进行回答。 有没有办法让大语言模型获取最新的知识,而不至于stale。 显然如果它能够调用搜索引擎,获取最新知识,就可以解决这个问题。 事实上,现在kimi的联网搜索和ChatGPT的搜索网页都是为了解决这个问题。 下面让我们看看如何利用function calling来实现大语言模型从搜索引擎获取数据,继而回答用户的提问。 2. 大语言模型通过搜索引擎获取数据 首先,我们来看一个问题:“今天武汉和上海的气温,哪一个更高?” 对于人类而言,我们要解决这个问题,必须经过以下步骤 1)获取武汉和上海的气温数据 2)比较武汉和上海的最高气温,得出结论 下面萌叔提供一个完整的Python程序,看看如何使用function calling来回答这个提问 import json from email.policy import strict from openai import OpenAI import requests from openai._utils import maybe_transform from openai.types.chat import ChatCompletion base_url = "{此处请自行替换}" api_key = "{此处请自行替换}" google_search_key = "{此处请自行替换}" google_search_engine = "{此处请自行替换}" # 定义 google_search 函数(示例) def google_search(query: str) -> str: url = "https://www.googleapis.com/customsearch/v1" query_params = { "key": google_search_key, "cx": google_search_engine, "q": query, "num": 5, } response = requests.get(url, params=query_params) print(response.url) return response.text # 调用大模型 def send_messages(messages): # 函数信息,用于 Function Calling tools = [ { "type": "function", "function": { "name": "google_search", "description": "通过 Google 搜索获取信息", "parameters": { # 参数类型必须是object "type": "object", "properties": { "query": { "type": "string", "description": "需要搜索的关键词或短语", } }, "required": ["query"], "additionalProperties": False, }, "strict": True } }, ] client = OpenAI(api_key=api_key, base_url=base_url) response = client.chat.completions.create( model="gpt-4o-mini", # 确保使用支持 Function Calling 的模型 messages=messages, tools=tools, max_tokens=4096, parallel_tool_calls=True, ) dd = maybe_transform(response, ChatCompletion) data = json.dumps(dd, ensure_ascii=False) print(data) return response.choices[0].message if __name__ == "__main__": # 示例对话 # input_text = input("请输入您的问题:") messages = [ {"role": "system", "content": "你是一个智能搜索机器人。你根据用户提出的问题,利用google_search函数,获取额外信息,然后回答用户的提问"}, {"role": "user", "content": "今天武汉和上海的气温,哪一个更高?"}, ] # 1. **第1次调用AI接口** message = send_messages(messages) call_cout = len(message.tool_calls) print(f"将会发起{call_cout}次调用...") # 2. **在client端调用google_search()** messages.append(message) for tool in message.tool_calls: if tool.function.name == "google_search": parsed_arguments = json.loads(tool.function.arguments) query = parsed_arguments.get("query", None) # 获取 query 值 print("query:", query) content = google_search(query) messages.append({"role": "tool", "tool_call_id": tool.id, "content": content}) # 3. **第2次调用AI接口** message = send_messages(messages) print(f"Model>\t {message.content}") 0) 函数说明 这里我们给出了函数google_search()说明, 并把它传递给大模型, 告诉它在处理问题的时候,可以考虑使用上我们提供的函数。 ...