langchain 学习笔记-FunctionCalling三种方式

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 函数

控制灯光。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/523188.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MPT - 初识账户状态树(World State)

往期回顾 ETH网络中的账户ETH网络中的区块链 通过以上文章,我们了解到ETH网络中的World State是节点根据交易维护的,节点在维护Wrold State时为了方便操作会将用户状态构建成一颗树,称为账户状态树,采用一种叫做MPT的数据结构 MP…

微信公众号取消了留言功能后,怎么提高互动和涨粉?

为什么公众号没有留言功能?2018年2月12日之后直到现在,新注册公众号的运营者会发现一个问题:无论是个人还是企业的公众号,在后台都找不到留言功能了。这对公众号来说绝对是一个极差的体验,少了一个这么重要的功能&…

四月软件测试面经合集(持续更新)

四月软件测试面经合集 polelink面试(一面过)01 对于JMeter接口测试,如何做接口关联?接口关联的定义JMeter关联方法正则表达式介绍贪婪匹配和非贪婪匹配案例分析正则表达式提取器步骤 02 是否会写shell脚本,能对shell进…

解决Toad for Oracle显示乱中文码问题

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

FPGA + 图像处理(三)生成3x3像素矩阵

前言 生成NxN的像素矩阵是对图像进行各类滤波操作的基本前提,本文介绍一种通过bram生成3x3矩阵的方法。 程序 生成bram核 因为本文介绍的是基于bram生成的3x3像素矩阵,所以要先生成两个bram核,用于缓存前两行图像数据 在 IP catalog中选…

【VTKExamples::Meshes】第九期 TestWindowedSincPolyDataFilter

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例TestWindowedSincPolyDataFilter,并解析接口vtkWindowedSincPolyDataFilter,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! …

yolo训练数据集时怎么改变数据集的下载和存放路径

项目场景: 在yolov8训练官方给的或者公开的或者自己的数据集的时候,给数据集写个配置文件也就是.yaml文件肯定是必不可少的,但有时根据ultralytics文件夹里的别人博客提示根本解决不了问题。 问题描述 在模型训练时自己明明将数据集放到了u…

计算机毕业设计java 基于Android的拼图游戏app

当今社会,随着电子信息技术的发展,电子游戏也成为人们日常生活的一部分。这种娱乐方式结合了日新月异的技术,在游戏软件中结合了多种复杂技术。拼图游戏流行在各种电子产品上,从计算机,掌上游戏机到如今的手机&#xf…

C语言基础语法-教案20(预处理-条件编译)

最近给大家争取到一个 深夜福利 保证你在深夜手机刷到 嘎嘎香~ 那就是 官方授权 大流量卡 缺点:月租太便宜 185GB~ 100分钟通话时长~ 长期套餐~ 畅想自由的气息 流量自由的同时还拥有超长通话,而且免费领取。 名额有限,咱们废话不…

测试基础|为啥大多数功能测试会觉得测试平台不好用?自动化测试的几点思考

一、接口自动化到底要验证什么 个人觉得做什么事情前,应该想下做的动机和想要达成的目的,这样会减少很多不必要的弯路。 1. 自动化的原因 测试界普遍认为应该加自动化用于提高测试效率和保障; 测试kpi任务; 应对需要频繁执行…

mysql 数据库的MHA高可用

目录 一、MHA概述: 1.认识MHA: 2.MHA 的组成: 3.MHA 的特点: 4.MHA 工作原理: 5.数据流向: 6.数据同步方式: 7. mysql 的高可用 : 二. MySQL MHA 的搭建: 1. 修改 Master、…

vulhub中Struts2-016 远程代码执行漏洞复现

影响版本: 2.0.0 - 2.3.15 漏洞复现 在struts2中,DefaultActionMapper类支持以"action:"、"redirect:"、"redirectAction:"作为导航或是重定向前缀,但是这些前缀后面同时可以跟OGNL表达式,由于struts2没有对这…

蓝桥杯每日一题:杨辉三角形(组合计数)

下面的图形是著名的杨辉三角形: 如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列: 1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, ... 给定一个正整数 N,请你输出数列中第一次出现 N是在第几个数&#x…

Vue - 你能说说Vue3和Vue2相比,改进了哪些地方吗

难度级别:中级及以上 提问概率:85% Vue2终将面临停止维护,不过幸好Vue3做到了很好的向后兼容,可以使前端开发人员能够更平滑的过渡。在前端面试中,Vue3的相关知识也会越来越多,那么Vue3与Vue2相比,都做到了哪些改进呢? 从开发阶段讲…

VS Code远程连接服务器运行python程序

之前一直用pycharm连接服务器跑程序,pycharm需要本地和远程都存一份代码,然后把本地的更新同步到服务器上来实现代码修改,后来实习的时候发现企业里面都用VS Code,不得不说,VS Code真的很方便,直接连服务器…

Leetcode 56. 合并区间

心路历程: 这道题看起来很简单,但实际上操作起来很多细节,第一反应是朋友圈问题,于是想到了并查集去做,顺便复习了一下并查集。但是这道题用并查集的话只能98% A,无法全部通过。 这道题其实是考察数组重复…

如何使用 FastApi

安装 fastapi fastapi 是一个用于构建高性能 Web 应用的 Python 框架,它提供了简洁、高效的 API 开发体验。 pip install fastapi 安装 uvicorn uvicorn 是一个用于运行 FastAPI 应用的服务器,它可以将你的 FastAPI 代码部署到生产环境中。 pip inst…

MySQL基础【语句执行顺序】

一个SQL语句它的执行顺序对于我们思考题意有着很重要的关系 题意就是:找出哪些只逛超市不买单的人(买单0元也算哦,可能是使用的是代金券吧) 看到此题关键找出两个数据 参观过的人 和 买单的人 他们的差就是白嫖的人(支…

【简单讲解想如何安装MXNet】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

C语言解决汉诺塔问题

背景 首先带大家了解一下汉诺塔问题 汉诺塔是一个典型的函数递归问题,汉诺塔描述了这样的场景,有三个柱子,A,B,C,A柱为起始柱,在A柱上面有若干大小不同的盘子,最下面的最大,最上面的最小&#x…