langchain 学习笔记-FunctionCalling三种方式

news2024/11/17 2:44:20

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

控制灯光。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

牛客 2024春招冲刺题单 ONT98 牛牛猜节点【中等 斐波那契数列 Java,Go,PHP】

题目 题目链接: https://www.nowcoder.com/practice/6a3dfb5be4544381908529dc678ca6dd 思路 斐波那契数列参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规…

Nestjs中使用MQTT

准备工作,首先就得硬件的小伙伴自己吧硬件部分配置好,成功连通云端,并成功推送数据。然后就是服务器装好Nestjs 。做好这些准备工作就可以开始了!!! 然后直接开始工作: 一、安装 # 直接安装最…

Spring boot框架Rouyi Cloud入门之token

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 往期热门专栏回顾 专栏…

Android Glide配置AppGlideModule定制化线程池,Kotlin(1)

Android Glide配置AppGlideModule定制化线程池,Kotlin(1) plugins {id org.jetbrains.kotlin.kapt }implementation com.github.bumptech.glide:glide:4.16.0kapt com.github.bumptech.glide:compiler:4.16.0 import android.content.Context…

布局图纸电子管理系统,布局图纸电子管理系统哪个好?

布局图纸电子管理系统是一个涉及多个步骤和策略的过程,旨在优化图纸的存储、检索、共享和安全性。下面是一个可能的布局图纸电子管理系统的框架和关键要素: 一、需求分析 明确电子管理系统的具体需求,包括用户群体、功能模块、安全性要求等。…

竞赛 交通目标检测-行人车辆检测流量计数 - 竞赛

文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测?1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计…

NzN的数据结构--实现双向链表

上一章中,我们学习了链表中的单链表,那今天我们来学习另一种比较常见的链表--双向链表!! 目录 一、双向链表的结构 二、 双向链表的实现 1. 双向链表的初始化和销毁 2. 双向链表的打印 3. 双向链表的头插/尾插 4. 双向链表的…

java内存模型和线程

java内存模型 一个服务端需要同时对多个客户端提供服务,就是并法的具体场景。 衡量一个服务性能的好坏,每秒实务处理数(Transactions Per Second,TPS)是重要指标,它代表一秒内服务端平均能响应的请求总数。 硬件的效率和一致性 …

汇川PLC学习Day4:电机参数和气缸控制参数

汇川PLC学习Day4:伺服电机参数和气缸控制参数 一、伺服电机参数二、气缸参数1. 输入IO映射(1)输入IO映射(2) 输入IO触摸屏标签显示映射 2. 输出IO映射(1)输出IO映射(2) …

java中的正则表达式和异常

正则表达式: 作用一:用来校验数据格式是否合法 作用二:在文本中查找满足要求的内容 不用正则表达式:检验QQ号是否合法,要求全部是数字,长度在6-20,不能以0开头 public class test {public stat…

Python爬虫-爬取药膳食谱数据

🎈 博主:一只程序猿子 🎈 博客主页:一只程序猿子 博客主页 🎈 个人介绍:爱好(bushi)编程! 🎈 创作不易:喜欢的话麻烦您点个👍和⭐! 🎈…

顺序表的应用之通讯录

学习了顺序表之后,我们也得知道它的实际用途吧!所以,我们今天来学习一下通讯录的实现。 typedef struct personInfo SLDataType; contact.h #define NAME_MAX 20 #define GENDER_MAX 20 #define GTEL_MAX 20 #define ADDR_MAX 100 #include&…

post请求爬虫入门程序

<!--爬虫仅支持1.8版本的jdk--> <!-- 爬虫需要的依赖--> <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version> </dependency><!-- 爬虫需…

复现ChatGLM-6B

ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 项目代码https://github.com/THUDM/ChatGLM-6B 权重开放:…

VMware Workstation Pro 全屏模型隐藏上方命令栏

点击命令栏左侧的小图标&#xff0c;可以隐藏或固定命令栏。 如果要取消白线&#xff0c;参考&#xff1a; 虚拟机全屏后隐藏vmware菜单栏的问题

【KLEE】使用Docker安装KLEE KLEE的简单使用 KLEE的约束文件

本文架构 零、前言一、KLEE简介二、Docker安装KLEE1. 使用apt安装docker2.拉取klee镜像3.使用git 拉取klee源码4.安装klee镜像5. 运行镜像 三、试用KLEE的examples1.查看并了解待测文件examples/get_sign/get_sign.c2.KLEE进行符号测试的基本步骤编译成LLVM位码文件使用KLEE进行…

爬取微博热搜榜

需求&#xff1a; 利用python和xpath爬取微博热搜榜 步骤&#xff1a; 爬虫的步骤 获取网页数据-》分析网页数据-》提取网页数据。 1&#xff0c;首先获取微博热搜数据。 热搜主页为 https://s.weibo.com/top/summary?caterealtimehot 打开收&#xff0c;按F12获取网页源…

FebHost:墨西哥.MX域名概述

墨西哥&#xff0c;这片充满生机与历史的国度&#xff0c;以其丰富的文化传统、诱人的美食以及壮丽的自然景观吸引着世界各地的游客。从古老的阿兹特克和玛雅文明到现代都市的繁华街区&#xff0c;墨西哥为每一位访客和当地居民提供了一场视觉与感官的盛宴。 关于 .MX 域名 作…

特征值与特征向量的关系,Au=λu

特征值与特征向量的关系在线性代数中是一个核心概念&#xff0c;尤其在处理矩阵和线性变换时。给定一个矩阵 A A A&#xff0c;如果存在一个非零向量 u u u和一个标量 λ \lambda λ&#xff0c;使得 A u λ u Au \lambda u Auλu&#xff0c;那么我们就说 λ \lambda λ是矩…

docker使用arthas基本教程

供参考也是自己的笔记 docker容器下使用遇到的问题&#xff1a;大致是连接不上1号进程 我这边主要的问题是用户权限问题&#xff0c;docker容器使用aaa用户启动&#xff0c;那个在docker容器内&#xff0c;需要使用aaa用于启动 docker 容器如何使用arthas #实现下载好arthas …