langchain 学习笔记-FunctionCalling三种方式

文章探讨了如何在ChatGPT中通过函数调用获取天气信息,展示了两种方法(OpenAIAPI和langchainAgent),以及潜在的多函数应用扩展.
摘要由CSDN通过智能技术生成

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)

例-1--openAI function calling

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函数。然后将调用的结果交给大模型生成输出。

例-2 langchain Agent方式

这个程序使用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("常州天气如何?")

例-3 langchain-functioncall方式

这个程序利用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("无锡的天气怎么样?"))

结束语

这里介绍了三种大模型函数调用的方法。还可以调用多个函数,比如如果要使用大模型实现“如果天黑了,就关上灯” ,我觉得要调用两个函数

CheckDarkness 函数

判断是否天黑。

LightControl 函数

控制灯光。

下一次来研究怎么实现吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值