基于GPT搭建私有知识库聊天机器人(五)函数调用
文章链接:
OpenAI在6月13日发布了几个重磅更新,其中包括:
- 开放了16k上下文的GPT-3.5-Turbo模型gpt-3.5-turbo-16k,这是目前模型容量的4倍。
- 发布了新的GPT-4和GPT-3.5-Turbo模型。
- Chat Completions API中新增了函数调用功能,使得实时获取网络数据成为可能。
- embeddings模型的成本降低了75%。
- gpt-3.5-turbo的输入token成本也降低了25%。
本文将重点介绍Chat Completions API新增的函数调用功能。
1、流程和原理
函数调用功能的流程如下:

- 用户发起问题。
- 服务端说明函数作用、参数提取规则
- OpenAI根据规则说明提取参数,并返回给服务端。
- 服务端调用本地函数获取结果。
- 结果返回给OpenAI。
- OpenAI归纳总结后生成答案并返回给用户。
通过这种方式,我们可以在聊天机器人中使用函数调用来实现更加灵活和复杂的业务功能。
2、功能演示
在这里,我们可以展示函数调用功能的一些应用场景,例如从外部API获取实时数据、执行计算任务、进行数据库操作等。这些功能可以根据具体需求进行定制,使聊天机器人能够更好地满足用户的需求。
我这里展示一个通过微信公众号查询汽车票班次的功能:

下面是日志数据:首先是从问题中提取出参数,然后调用本地接口获取班次信息,openai归纳总结后输出答案。
> Entering new chain...
Invoking: `query_bus_by_date` with `{'drv_date': '2023-07-14', 'start_name': '成都', 'target_name': '稻城'}`
[{'boardingAddress': '', 'boardingCode': '', 'boardingName': '', 'busNo': '川A88888', 'busTypeName': '大型高一', 'childSAmount': '500', 'displayExtraFlag': '', 'drvTime': '2023-07-14 20:00', 'endName': '亚丁', 'extraFlag': '0', 'fullPrice': '0.02', 'halfPrice': '130.00', 'isForbid': '0', 'isPassStation': '1', 'isRealNameLine': '1', 'mile': '100', 'motName': 'XXXX', 'passId': '6', 'refundTimeLimit': '', 'schId': '5JhYm', 'schTypeId': '1', 'scheduleType': '1', 'seatAmount': '4998', 'seatTypeName': '', 'signId': 'v21ofWkSTmttd8mVuwxZKL5p', 'startCityName': '成都', 'startCityNo': '510100', 'startDrvTime': '', 'startStationName': '城北客运站', 'startStationNo': 'cbcz', 'stationGuidePrice': '', 'stopAddress': '', 'stopCode': '', 'stopName': '稻城', 'stopTime': '', 'targetCityName': '', 'targetCityNo': '', 'targetStationName': '', 'targetStationNo': '', 'useMinutes': ''}, {'boardingAddress': '', 'boardingCode': '', 'boardingName': '', 'busNo': '川A88888', 'busTypeName': '大型高一', 'childSAmount': '4', 'displayExtraFlag': '', 'drvTime': '2023-07-14 07:30', 'endName': '亚丁', 'extraFlag': '0', 'fullPrice': '0.02', 'halfPrice': '130.00', 'isForbid': '0', 'isPassStation': '1', 'isRealNameLine': '1', 'mile': '100', 'motName': 'XXXXX', 'passId': '6', 'refundTimeLimit': '', 'schId': 'fPDLG', 'schTypeId': '0', 'scheduleType': '1', 'seatAmount': '42', 'seatTypeName': '', 'signId': 'mVpTnMHS7i9ZEQxl9JddzkI4', 'startCityName': '成都', 'startCityNo': '510100', 'startDrvTime': '', 'startStationName': '城北客运站', 'startStationNo': 'cbcz', 'stationGuidePrice': '', 'stopAddress': '', 'stopCode': '', 'stopName': '稻城', 'stopTime': '', 'targetCityName': '', 'targetCityNo': '', 'targetStationName': '', 'targetStationNo': '', 'useMinutes': ''}]
根据查询结果,我找到了两个班次可供选择:
1. 班次号:川A88888,车型:大型高一,出发时间:2023-07-14 20:00,起点:成都城北客运站,终点:稻城亚丁。全票价格为0.02元,半票价格为130.00元。该班次由XXXX运营,共有4998个座位。
2. 班次号:川A88888,车型:大型高一,出发时间:2023-07-14 07:30,起点:成都城北客运站,终点:稻城亚丁。全票价格为0.02元,半票价格为130.00元。该班次由XXXX运营,共有42个座位。
请问您对以上两个班次有什么要求或者偏好吗?
> Finished chain.
3、代码示例
以下代码依旧使用langchain提供的tools实现,读者也可以使用openAI提供的SDK实现。
from langchain.tools import BaseTool
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage
from langchain.tools import format_tool_to_openai_function
from langchain.agents import AgentType, initialize_agent
from pydantic import BaseModel, Field
from typing import Optional, Type
from datetime import date
import requests
import json
import os
llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo-0613") #注意这里要用gpt-3.5-turbo-0613模型才能支持函数调用
# 定义入参解析规则
class ScheduleCheckInput(BaseModel):
drv_date: str = Field(..., description="日期,请格式化为yyyy-mm-dd,日期当天从%s开始计算" % date.today())
start_name: str = Field(..., description="起点")
target_name: str = Field(..., description="终点")
class BusTool(BaseTool):
name = "query_bus_by_date"
description = "根据日期查询起止点的班次信息"
def _run(self, drv_date, start_name, target_name):
url = "http://test.test.com/"
data = {"body": {
"startName": "%s",
"targetNo": "%s",
"drvTime": "%s"}
}
json_data = json.dumps(data) % (start_name, target_name, drv_date)
response = requests.post(url, data=json_data.encode("utf-8"))
return response.json().get("body").get("data")
def _arun(self):
raise NotImplementedError("This tool does not support async1")
args_schema: Optional[Type[BaseModel]] = ScheduleCheckInput
def search_schedule(query: str) -> str:
bus_tools = [BusTool()]
open_ai_agent = initialize_agent(bus_tools,
llm,
agent=AgentType.OPENAI_FUNCTIONS,
verbose=True)
return open_ai_agent.run(query)
if __name__ == '__main__':
search_schedule("请帮我查询13号成都到绵阳的班次信息")
总结
本文介绍了OpenAI在6月13日发布的重磅更新中,新增的Chat Completions API函数调用功能。通过函数调用,我们可以在聊天机器人中实现更加灵活和复杂的功能,例如从外部API获取实时数据、执行计算任务等。我们还提供了一个简单的代码示例,演示了如何使用函数调用功能。这些更新为构建强大的私有知识库聊天机器人提供了更多的可能性。
基于GPT搭建私有知识库聊天机器人(五)函数调用的更多相关文章
- 计算机网络课设之基于UDP协议的简易聊天机器人
前言:2017年6月份计算机网络的课设任务,在同学的帮助和自学下基本搞懂了,基于UDP协议的基本聊天的实现方法.实现起来很简单,原理也很简单,主要是由于老师必须要求使用C语言来写,所以特别麻烦,而且C ...
- ChatGirl 一个基于 TensorFlow Seq2Seq 模型的聊天机器人[中文文档]
ChatGirl 一个基于 TensorFlow Seq2Seq 模型的聊天机器人[中文文档] 简介 简单地说就是该有的都有了,但是总体跑起来效果还不好. 还在开发中,它工作的效果还不好.但是你可以直 ...
- 版本控制系统之基于httpd搭建私有git仓库
在上一篇博客中,我们主要聊到了git的基本工作原理和一些常用的git命令的使用:回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13787701.html:今天我 ...
- 花了半个小时基于 ChatGPT 搭建了一个微信机器人
相信大家最近被 ChatGPT 刷屏了,其实在差不多一个月前就火过一次,不会那会好像只在程序员的圈子里面火起来了,并没有被大众认知到,不知道最近是因为什么又火起来了,而且这次搞的人尽皆知. 想着这么火 ...
- 基于docer搭建私有gitlab服务器
今天闲着无聊,于是乎想用最近很流行的docker容器搭建一个自己的gitlab的服务器,关于docker和gitlab就不多介绍了,网上查了很多资料,貌似没有一个统一的方法,很乱很杂,而且很容易误导人 ...
- 微信智能机器人助手,基于hook技术,自动聊天机器人
下载地址: 链接:https://pan.baidu.com/s/1N5uQ3gaG2IZu7f6EGUmBxA 提取码:md7z 复制这段内容后打开百度网盘手机App,操作更方便哦 微信智能助手说明 ...
- 基于CentOS搭建私有云服务
系统版本:CentOS 7.2 64 位操作系统 部署 XAMPP 服务 下载 XAMPP(XAMPP 是个集成了多个组件的开发环境,包括 Apache + MariaDB + PHP + Perl. ...
- 基于Docker搭建大数据集群(五)Mlsql部署
主要内容 mlsql部署 前提 zookeeper正常使用 spark正常使用 hadoop正常使用 安装包 微云下载 | tar包目录下 mlsql-cluster-2.4_2.11-1.4.0.t ...
- 智能聊天机器人——基于RASA搭建
前言: 最近了解了一下Rasa,阅读了一下官方文档,初步搭建了一个聊天机器人. 官方文档:https://rasa.com/docs/ 搭建的chatbot项目地址: https://github.c ...
- 0基础搭建基于OpenAI的ChatGPT钉钉聊天机器人
前言:以下文章来源于我去年写的个人公众号.最近chatgpt又开始流行,顺便把原文内容发到博客园上遛一遛. 注意事项和指引: 注册openai账号,需要有梯子进行访问,最好是欧美国家的IP,亚洲国家容 ...
随机推荐
- MKL稀疏矩阵运算示例及函数封装
Intel MKL库提供了大量优化程度高.效率快的稀疏矩阵算法,使用MKL库的将大型矩阵进行稀疏表示后,利用稀疏矩阵运算可大量节省计算时间和空间,但由于MKL中的原生API接口繁杂,因此将常用函数封装 ...
- 深度学习--魔法类nn.Module
深度学习--魔法类nn.Module 作用 pytorch 封装了一些基本的网络类,可以直接调用 好处: 可以直接调用现有的类 容器机制:self.net = nn.Sequential() 参数返回 ...
- pdf 转 word
目录 pdf 转 word 一.思路 二.软件安装下载 1. windows安装 2 certos7版本安装 3. Debian 版本安装 4. 安装字体 三.实现PDF转word文档 四.制作自己的 ...
- LeetCode 周赛 343(2023/04/30)结合「下一个排列」的贪心构造问题
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 今天是五一假期的第二天,打周赛的人数比前一天的双周赛多了,难道大家都只玩一天吗?这场周赛 ...
- UML类图——类之间的关系
关联关系(实线箭头) 是一种结构化关系,表示一类对象与另一类对象之间有联系.Java,c++,c#等编程语言在实现关联关系时,通常将一个类的对象作为另一个类的属性 - 双向关联 - 单向关联 - 自关 ...
- Unity中实现字段/枚举编辑器中显示中文(中文枚举、中文标签)
在unity开发编辑器相关经常会碰到定义的字段显示在Inspector是中文,枚举也经常碰到显示的是字段定义时候的英文,程序还好,但是如果编辑器交给策划编辑,策划的英文水平不可保证,会很头大,所以还是 ...
- 代码打包的可视化数据分析图: webpack-bundle-analyzer 的使用
先看webpack-bundle-analyzer的效果图(官方效果图): 通过使用webpack-bundle-analyzer可以看到项目各模块的大小,可以按需优化 1.先安装 npm insta ...
- react之todoList基础小项目
1.项目最终成品和项目目录快照如图: 2.context.js文件 // 使用context进行多级传递数据 // 1. createContext 创建一个可以多级传递的context数据 // 2 ...
- 2023-03-09:用golang调用ffmpeg,将流媒体数据(以RTMP为例)保存成本地文件(以flv为例)。
2023-03-09:用golang调用ffmpeg,将流媒体数据(以RTMP为例)保存成本地文件(以flv为例). 答案2023-03-09: 这是最简单的收流器.本文记录一个最简单的基于FFmpe ...
- 2022-07-13:给你一个整数数组 arr ,你一开始在数组的第一个元素处(下标为 0)。 每一步,你可以从下标 i 跳到下标 i + 1 、i - 1 或者 j : i + 1 需满足:i +
2022-07-13:给你一个整数数组 arr ,你一开始在数组的第一个元素处(下标为 0). 每一步,你可以从下标 i 跳到下标 i + 1 .i - 1 或者 j : i + 1 需满足:i + ...