赞
踩
ChatGPT 基于海量的训练数据生成答案,所以它无法回答训练数据中没有的信息或搜索信息
。人们希望 ChatGPT 具有对话以外的各种功能,例如“我想管理我的待办事项列表”。
函数调用是对此类请求的响应。 通过使用函数调用,ChatGPT 现在可以在生成答案时使用用户提供的函数!
例如,如果要添加一个查看天气的函数,可以定义一个确定天气预报 API 的函数。下面是示意图
我们定义了一个获取天气函数 。这是一个常规的python 函数。
- def weather_function(location):
- match location:
- case "无锡" | "wuxi":
- weather = "晴天"
- case "苏州"| "suzhou":
- weather = "多云"
- case "常州" | "changzhou":
- weather = "雨"
- case _ :
- weather = "不清楚"
-
- weather_answer = [
- {"天气": weather}
- ]
-
- return json.dumps(weather_answer)
- from openai import OpenAI
- import json
- client = OpenAI(
- api_key="sk-xxxxxx",
- base_url="https://api.chatanywhere.tech/v1"
- )
- def weather_function(location):
- match location:
- case "无锡" | "wuxi":
- weather = "晴天"
- case "苏州"| "suzhou":
- weather = "多云"
- case "常州" | "changzhou":
- weather = "雨"
- case _ :
- weather = "不清楚"
-
- weather_answer = [
- {"天气": weather}
- ]
-
- return json.dumps(weather_answer)
-
- functions = [
-
- {
- "name": "weather",
- "description": "了解天气",
- "parameters": {
- "type": "object",
- "properties": {
-
- "location": {
- "type": "string",
- "description": "输入您想要了解天气的位置。 示例:东京",
- },
- },
- "required": ["location"],
- },
- }
- ]
- messages = [
- {
- "role": "system",
- "content": "You are a useful assistant."
- },
- {
- "role": "user",
- "content": "无锡天气怎么样?"
- },
- ]
- print(messages[1]["content"])
- def role_function_conversation(message):
- response = client.chat.completions.create(
- model="gpt-3.5-turbo-0613",
- messages = message,
- temperature=0,
- functions= functions,
- function_call="auto",
- )
- message = response.choices[0].message.content
- print(message)
-
- completion = client.chat.completions.create(
- model="gpt-3.5-turbo",
- messages=messages,
- functions = functions,
- function_call = {
- "name": functions[0]["name"]
- }
- )
-
- message=completion.choices[0].message
- if(message.function_call):
- function_name = message.function_call.name
- arguments = json.loads(message.function_call.arguments)
- if (function_name == "weather"):
- weatherNow=weather_function(location=arguments.get('location'))
- messages.append(message)
- messages.append({"role": "function", "name": "weather", "content": weatherNow})
- #print(messages)
- role_function_conversation(messages)
-
-
从上面的程序看,功能调用被分成两段,分别访问两次大模型,第一次根据functions 模板获取函数的参数location,第二次真正调用 weather_function函数。然后将调用的结果交给大模型生成输出。
这个程序使用Langchain Agent 方式调用函数,简约了许多。
- import json
- import os
- from langchain_openai import ChatOpenAI
- from langchain.agents import initialize_agent, Tool
- from langchain.agents.mrkl import prompt
- os.environ['OPENAI_API_KEY'] ="sk-xxxxx"
- os.environ['OPENAI_BASE_URL'] ="https://api.chatanywhere.tech/v1"
- def weather_function(location):
- match location:
- case "无锡" | "wuxi":
- weather = "晴天"
- case "苏州"| "suzhou":
- weather = "多云"
- case "常州" | "changzhou":
- weather = "雨"
- case _ :
- weather = "不清楚"
-
- weather_answer = [
- {"天气": weather}
- ]
-
- return json.dumps(weather_answer)
- def lang_chain_agent(text):
- llm = ChatOpenAI(model_name="gpt-3.5-turbo",base_url="https://api.chatanywhere.tech/v1")
-
- tools = [
- Tool(
- name = "Weather",
- func=weather_function,
- description="输入你希望了解天气的位置,例如 无锡",
- )
- ]
-
- agent = initialize_agent(
- tools,
- llm,
- agent="zero-shot-react-description",
- agent_kwargs=dict(suffix='Answer should be in chinese.' + prompt.SUFFIX),
- verbose=True,
- return_intermediate_steps=True)
-
- response = agent({"input": text})
-
- return response
- lang_chain_agent("常州天气如何?")
这个程序利用langchain 实现函数调用。
- import os
- import json
- from langchain.schema import (
- HumanMessage,
- FunctionMessage
- )
- from langchain_openai import ChatOpenAI
- os.environ['OPENAI_API_KEY'] ="sk-xxxxxxxx"
- os.environ['OPENAI_BASE_URL'] ="https://api.chatanywhere.tech/v1"
- def weather_function(location):
- match location:
- case "无锡" | "wuxi":
- weather = "晴天"
- case "苏州"| "suzhou":
- weather = "多云"
- case "常州" | "changzhou":
- weather = "雨"
- case _ :
- weather = "不清楚"
-
- weather_answer = [
- {"天气": weather}
- ]
-
- return json.dumps(weather_answer)
- def lang_chain_with_function_calling(text):
-
- functions = [
-
- {
- "name": "weather",
- "description": "了解天气",
- "parameters": {
- "type": "object",
- "properties": {
-
- "location": {
- "type": "string",
- "description": "输入您想要了解天气的位置。 示例:东京",
- },
- },
- "required": ["location"],
- },
- }
- ]
-
-
- messages=[HumanMessage(content=text)]
- llm = ChatOpenAI(model_name="gpt-3.5-turbo",base_url="https://api.chatanywhere.tech/v1", temperature=0)
- message = llm.predict_messages(
- messages, functions=functions
- )
-
-
- if message.additional_kwargs:
-
-
- function_name = message.additional_kwargs["function_call"]["name"]
- arguments = json.loads(message.additional_kwargs["function_call"]["arguments"])
-
-
- function_response = weather_function(
- location=arguments.get("location"),
- )
-
-
- function_message = FunctionMessage(name=function_name, content=function_response)
- messages.append(function_message)
-
-
- second_response = llm.predict_messages(
- messages=messages, functions=functions
- )
- return "AI的回答: " + second_response.content
- else:
- return "AI的回答: " + message.content
- print(lang_chain_with_function_calling("无锡的天气怎么样?"))
-
这里介绍了三种大模型函数调用的方法。还可以调用多个函数,比如如果要使用大模型实现“如果天黑了,就关上灯” ,我觉得要调用两个函数
判断是否天黑。
控制灯光。
下一次来研究怎么实现吧!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。