logo

基于百度千帆“插件编排”开发自定义插件

可以通过自定义插件的方式让大语言模型调用自有或者第三方API接口实现真正的增强型智能助手,这是大语言模型构建强大生态圈的重要技术手段。
比如:让LLM扮演我的私人助理,帮我订票,因自定义插件的描述信息中包含订票的关键字,ERNIE-Bot接到“订某某票”指令时会自动路由到自定义插件,提取出输入的用户名和日期,并组装成json格式的数据作为订票API接口的入参,然后自动向接口提交请求,并返回接口的返回信息到对话页面。接口的入口如下图。
一切都是那么智能!!这如何实现?

首先,编写我的API接口


后端订票微服务,其暴露订票的URL给大语言模型,如果没有此人当天的订票信息则执行订票,并告知用户订票成功;如果已经订过票,提示已经订过。接口采用Python Flask开发,数据库使用MySQL。文件名为:bookTicket.py。
  
  
# -*- coding: utf-8 -*-
from flask import Flask, request, jsonify
import mysql.connector
from gevent import pywsgi
app = Flask(__name__)
# 连接MySQL数据库
def connect_db():
conn = mysql.connector.connect(
host="localhost",
user="plugins_user",
password="9aMtBOlnB$AZ*********",
database="pluginsdb"
)
return conn
# 查询某日某人的机票信息
def query_flight_info(date, name):
conn = connect_db()
cursor = conn.cursor()
query = "SELECT * FROM flights WHERE date = %s AND name = %s"
cursor.execute(query, (date, name))
result = cursor.fetchall()
cursor.close()
conn.close()
return result
# 预订某日某人的机票
def book_flight(date, name):
conn = connect_db()
cursor = conn.cursor()
query = "INSERT INTO flights (date, name) VALUES (%s, %s)"
cursor.execute(query, (date, name))
conn.commit()
cursor.close()
conn.close()
return "预订成功"
# 定义API路由和处理函数
@app.route('/book_flight', methods=['GET'])
def book_flight_api():
print("ok 进入方法")
data = request.json
date = data['date']
name = data['name']
print(name)
result = query_flight_info(date, name)
if result:
return jsonify({"message": "该日期已预订,请选择其他日期"}), 400
else:
book_flight(date, name)
return jsonify({"message": "预订成功"}), 200
server = pywsgi.WSGIServer(('0.0.0.0', 5000), app)
server.serve_forever()
代码发布到有域名(插件配置时需要域名)的自有服务器上,例如上传到目录 /www/wwwroot/www.guo.com/py
,执行python bookTicket.py启动微服务,并在安全组开放其5000端口供互联网访问。如果在服务器的shell窗口curl localhost的接口通,若换成公网IP不通,有可能也需要开放你服务器防火墙的5000端口。

其次,建数据库(名称pluginsdb)、表

  
  
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for flights ticket
-- ----------------------------
DROP TABLE IF EXISTS `flights`;
CREATE TABLE `flights` (
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`date` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;

配置文件


根据千帆自定义插件的对接要求,编写2个配置文件,格式必须正确,内容如下,需上传服务器可被公网域名访问(在千帆平台需配置有域名的文件URL)。
  • ai-plugin.json内容如下:
  
  
{
"schema_version": "v1",
"name_for_human": "我的智能订票工具",
"name_for_model": "bookTicket",
"description": "通过AI实现给某个人订某个日期的机票",
"auth": {
"type": "none"
},
"api": {
"type": "openapi",
"url": "http://www.guoxiuzhi.com/py/openapi.yaml"
},
"logo_url": "http://www.guoxiuzhi.com/py/example-icon.png",
"contact_email": "example@guo.com",
"legal_info_url": "http://www.guoxiuzhi.com/legal"
}
  • openapi.yaml内容如下:
  
  
openapi: 3.0.1
info:
title: 智能订票
description: 通过AI实现给某个人订某个日期的机票
version: 'v1'
servers:
- url: http://www.guoxiuzhi.com:5000
paths:
/book_flight:
get:
operationId: exampleOperation
summary: 通过人名和日期判断是否可以订票,如果可以就向数据库插入一条订票成功的记录。
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/exampleRequest'
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/exampleResponse'
"503":
description: "one or more services are unavailable"
components:
schemas:
exampleRequest:
type: object
required:
- name
- date
properties:
name:
type: string
date:
type: string
exampleResponse:
type: string

新建插件


在千帆的“插件编排”菜单自定义插件,操作步骤:点击插件应用服务的“配置”链接,然后点击“+”,再点击弹框左上角的“自定义插件”按钮。
在自定义插件页面,分别填入上传到服务器上的ai-plugin.json文件的url,点击验证按钮,如果验证不通过请检查相关文件书写和配置是否正确。
下面填写请求样例,让大语言模型知道提取问题中的什么信息以什么格式传递给接口,这是大语言模型与API交互的核心、关键
样例表述:从问题中抽取用户名和日期,形成json。
请求样例:
  
  
{
"name": "梅西爱骑车",
"date": "2023-12-01"
}
如下图开启插件。

发布自己开发的插件。可以看到在插件列表显示了自定义插件。
测试调用我的订票API接口,输入“请为郭秀志预订2023-12-02的票”,返回“订票成功”。证明LLM已经智能判断出“订票”,需要调用我的插件和API接口去订票,不是单纯的跟我进行对话。


再试一次。毕竟是人工智能,这次多回复了一句贴心的话:“请注意查收相关预订信息”,大语言模型聊天总是给人官宣可信赖的感觉,跟真的订票成功了似的!

最后查询我的数据库,验证数据已经落库,全流程已打通。
至此,完成了自有插件集成到千帆“插件编排”的全过程。
评论
用户头像