使用 Coze 搭建 TiDB 助手

导读

本文介绍了使用 Coze 平台搭建 TiDB 文档助手的过程。通过比较不同 AI Bot 平台,突出了 Coze 在插件能力和易用性方面的优势。文章深入讨论了实现原理,包括知识库、function call、embedding 模型等关键概念,最后成功演示了如何在 Coze 平台上快速创建 TiDB Help Bot 。

本文作者 Weaxs,TiDB 社区布道师。

引言

目前市面上有很多搭建 AI Bot 的平台和应用,开源的有 langchain、flowise、dify、FastGPT 等等。字节之前也推出了 Coze,之前试过 Dify 和 FastGPT,目前感觉 Coze 的插件能力有很多,且易用性方面、搭建效率方面也强于其他平台(例如 langchain 或 flowise 需要搭建相对复杂的编排逻辑才能实现大模型调用互联网信息的拓展能力,但是 Coze 则是直接添加 plugin 且不指定任何参数就能实现)。

于是想尝试用 Coze 搭建一个 TiDB 文档助手,顺便研究厘清 Coze 平台是如何抽象一些大模型和其他能力来提高易用和搭建效率的。

实现原理

首先我们先抛开 Coze 平台,在大模型提供能力的基础上如何实现调用文档数据?

这里给出两种模式:知识库 和 function call。知识库的优点在于对非实时数据有一个相对准确的近似查询,function call 的优点在于可以实时获得最新的数据,当然也包括文档数据。

Coze 平台中的 plugins 实现了 function 模式,同时也提供了 knowledge 知识库可以管理本地和在线的文档。

1 embedding + 向量库

我们先来介绍基于 文本表示模型 (embedding model) + 向量数据库 (vector db) 增强大模型能力的方式。主要分为两个任务:

● 离线任务(同步原始文档到向量库):

i. 因为大模型本身会有 token 长度限制,所以需要现将原始文档进行切片(coze 平台的知识库能力,自动分割模式下将每块分片内容限制在最大 800 tokens)。

ii . 使用 embedding model 文本表示模型对每个分片进行 embedding,将其转换为 向量的形式

iii. 将向量存储在向量数据库中特定的 collection

● 在线任务(用户提问):

i. 使用 embedding model 对用户的问题做向量化

ii. 通过用户问题的向量数据,请求向量数据库做 ANN 近似近邻查询,并指定返回 topK

iii. 拿到对应 topK 分片后,我们需要结合分片内容和用户问题,拼凑完整的 prompt。示例如下, quote 为文档的分片内容, question 为用户的实际问题

- 使用标记中的内容作为你的知识:

- {{quote}}

- 回答要求:

如果你不清楚答案,你需要澄清。

避免提及你是从获取的知识。

保持答案与中描述的一致。

使用 Markdown 语法优化回答格式。

使用与问题相同的语言回答。

- 问题:"{{question}}"

iv. 最后请求大模型,拿到结果即可

在这种以知识库为主的模式下,比较关键的是 embedding model 、向量数据库 和 prompt。下面我们重点说一下 embedding model 和 向量库。

1.1 embedding

如果是自己尝试的话,embedding model 建议选 huggingface 开源模型,具体的排名 huggingface 上也有,可以看 Massive Text Embedding Benchmark (MTEB) Leaderboard ( https://huggingface.co/spaces/mteb/leaderboard )。中文长文本目前排名比较高的是 tao-8k,向量化后的维度是 1024,具体的调用示例如下:

def tao_8k_embedding(sentences):import torch.nn.functional as Ffrom transformers import AutoModel, AutoTokenizer
​model = AutoModel.from_pretrained("tao-8k")tokenizer = AutoTokenizer.from_pretrained("tao-8k")batch_data = tokenizer(sentences,padding="longest",return_tensors="pt",max_length=8192,# 关闭自动截断。默认为 true,即超过 8192 token 的文本会自动截断truncation="do_not_truncate", )
​outputs = model(**batch_data)vectors = outputs.last_hidden_state[:, 0]
​vectors = F.normalize(vectors, p=2, dim=1)

当然除了开源的外,像百川、OPENAI、ChatGLM、文心等等都提供了 embedding API。OPENAI 的文档如下:embeddings ( https://platform.openai.com/docs/guides/embeddings ),其他的大家可以自行去官网找文档。

1.2 向量库

向量库的选择也比较多,开源的有:国产分布式架构的 Milvus 、standalone 单机部署的 Qdrant 和基于 local 且 no-server 的 Chroma 等;基于现有数据库系统拓展了向量能力的有 Elasticsearch 、 PgVector 、 Redis 等;甚至还有一些向量库的 DBaas,比如 zilliz cloud 。抛开这些应用,向量库的核心主要是 3 点:距离度量选择、向量维度、索引类型。

以 Qdrant 为例,可以快速使用 docker 构建镜像。向量库的同步、查询等可以看 Qdrant 接口文档 ( https://qdrant.github.io/qdrant/redoc/index.html )。

docker pull qdrant/qdrant
​
docker run -p 6333:6333 -p 6334:6334 \\-v $(pwd)/qdrant_storage:/qdrant/storage:z \\qdrant/qdrant

2 system + 插件 (function)

基于知识库的模式很大程度上可以实现文档问答的能力,但是也有缺点:

● 需要维护向量库,且如果为了降低成本使用开源 embedding,那么需要在本地维护 embedding 模型。

● 文档同步实时性问题。文档一旦更新,需要及时同步,否则会拿到旧数据。

这里介绍另外一种 system 人设 + function call 的方式。system 比较简单就是用一段描述性 prompt 来设定模型的背景、能力、目标等等人设相关的信息;function call 是给大模型定义一些拓展能力,让大模型可以获取自己拿不到的数据。具体如何把他们串联起来,步骤如下:

  1. 用户设定 人设 (system) 和 插件 (function),并提问
  2. 服务端合并组合参数,并将用户选择的插件映射为大模型中的 function 工具,然后请求大模型
  3. 大模型判断是否需要调用 function
  4. 如果不需要 function,则服务端直接返回大模型结果即可;
  5. 如果需要调用 function,大模型会返回具体的函数和参数值,此时服务端通过自身的联网能力,执行 function 并将结果反哺给大模型
  6. 大模型拿到 function 的结果后,最终给用户一个明确的回答

2.1 function call

system 这部分就不额外介绍了,主要说说 function call。

前面提到,Coze 平台的 Plugins 是采用了 function call 的能力,下面以 Github plugin 为例,尝试用 OPENAI 定义的 function ( https://platform.openai.com/docs/guides/function-calling )的 schema 格式来定义它:

{"type": "function","function": {"name": "Github-searchRepositories","description": "search Repositories","parameters": {"type": "object","properties": {"q": {"type": "string","description": "format like \"keywords+language:js\", language can be other dev languages"},"sort": {"type": "string","description": "Default: stars, Can be one of: stars, forks, help-wanted-issues, updated","enum": ["stars","forks","help-wanted-issues","updated"]},"order": {"type": "string","description": "Default: desc, Can be one of: desc, asc","enum": ["desc","asc"]}},"required": ["q"]}}
}

现在我们知道了,OPENAI 会通过我们事先定义好的 function 来做判断,如果需要 function 提供的能力,大模型会给我们一个回调请求,以 Github-searchRepositories 为例,具体的执行实际是调用 Github 的 OpenAPI ( https://docs.github.com/en/rest/search/search?apiVersion=latest#search-repositories ),将其结果给到大模型。

Coze 搭建 bot

我们前面介绍了具体的实现方式,下面我们在 Coze 平台快速来搭建 TiDB Help Bot。不过再次之前,我们先参考一下 CloudWeGoHelpBot 的实现方式。

1 CloudWeGoHelpBot

首先介绍一下搭建步骤,因为我选用的是文档助手,所以参考了 coze 平台在 explore 中的 CloudWeGoHelpBot ( https://www.coze.com/explore/7302765283003957249 ),来看看它是怎么构建的。

可以看到这里主要有三个部分:

  1. Persona & Prompt:给大模型设定了人设、技能、约束和目标。对应 system 的部分。
  2. Plugins:Github 查询代码库的插件,通过 Github 的 SearchRepositoriesApi ( https://docs.github.com/en/rest/search/search?apiVersion=lastest#search-repositories );Browser 查询网页的插件,可以得到网站的标题、内容和连接。对应 function 的部分。

3 . Opening Dialog: 开场白,个人感觉这部分内容不参与和大模型的交互,功能是帮助用户快速理解 Bot 的功能和目的。

2 TiDB Help Bot

现在让我们来创造一个 TiDB Help Bot!

2.1 Plugins

Plugins 设定和 CloudWeGo HelpBot 类似,使用 Github-searchRepositories 和 Browser-browse_raw。

2.2 Persona & Prompt

在 Persona & Prompt 内容中需要明确 TiDB 的文档地址和代码库地址,这里直接用的 CloudWeGoHelpBot 的模板,并把相应的信息改成 TiDB,示例如下:

# Role: TiDB Support and Assistance Bot
You're TiDB Help Bot, the dedicated support for all things TiDB. Whether users are troubleshooting, seeking documentation, or have questions about TiDB, TiKV, PD and other sub-projects, you're here to assist. Utilizing the official TiDB documentation (<https://docs.pingcap.com/>) and GitHub repositories (<https://github.com/pingcap>, <https://github.com/tikv>), you ensure users have access to the most accurate and up-to-date information. You provide a smooth and productive experience.
​
## Skills
​
- Proficient in natural language processing to understand and respond to user queries effectively.
- Advanced web scraping capabilities to extract information from the official TiDB documentation (<https://docs.pingcap.com/>).
- Integration with the official GitHub repositories (<https://github.com/pingcap>, <https://github.com/tikv>) for real-time updates and issue tracking.
- Knowledge of TiDB's sub-projects, such as TiDB、TiKV and PD, to provide specialized assistance.
- User-friendly interface for clear communication and easy navigation.
- Regular updates to maintain synchronization with the latest documentation and GitHub repository changes.
​
## Constraints
​
- Adhere to copyright laws and terms of use for the TiDB documentation and GitHub repository.
- Respect user privacy by avoiding the collection or storage of personal information.
- Clearly communicate that the bot is a support and information tool, and users should verify details from official sources.
- Avoid promoting or endorsing any form of illegal or unethical activities related to TiDB or its sub-projects.
- Handle user data securely and ensure compliance with relevant privacy and data protection regulations.
​
## Goals
​
- Provide prompt and accurate assistance to users with questions or issues related to TiDB and its sub-projects.
- Offer detailed information from the official TiDB documentation for comprehensive support.
- Integrate with the GitHub repository to track and address user-reported issues effectively.
- Foster a positive and collaborative community around TiDB by facilitating discussions and knowledge sharing.
- Ensure the bot contributes to a smooth and productive development experience for TiDB users.
- Establish TiDB Help Bot as a trusted and reliable resource for developers and contributors.
- Encourage user engagement through clear communication and proactive issue resolution.
- Continuously improve the bot's capabilities based on user feedback and evolving needs within the TiDB community.

2.3 knowledge

首先需要再主页添加一个 knowledge 知识库,需要注意一点的是,Coze 平台这里分为了 text format 和 table format ,第一种一次只能同步一个文档,第二个可以一次同步多个但需要以 csv 或者 api 返回的 json 格式。

以同步【PingCAP 文档中心 | 主页】为例,我们直接通过 text format 中的 Online data ,贴上主页地址即可。

2.4 opening dialog

开场白和开场问题我们可以在 Coze 平台自动生成,生成如下:

I'm TiDB Help Bot, your dedicated support for all things TiDB. Whether you need troubleshooting assistance, documentation, or have questions about TiDB, TiKV, PD, and other sub-projects, I'm here to help. With access to the official TiDB documentation and GitHub repositories, I provide accurate and up-to-date information for a smooth and productive experience.

至此我们的 TiDB Help Bot 就做好了。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【EasyV】QGIS转换至EasyV

QGIS转换至EasyV 第一步&#xff1a;导入QGIS第二步 坐标系转换第三步 集合修正第四步 重命名字段第五步 导出WGS geojson坐标第六步 导入EasyV 第一步&#xff1a;导入QGIS 第二步 坐标系转换 第三步 集合修正 第四步 重命名字段 第五步 导出WGS geojson坐标 第六步 导入EasyV…

【Git】:初识git

初识git 一.创建git仓库二.管理文件三.认识.git内部结构 一.创建git仓库 1.安装git 使用yum install git -y即可安装git。 2.创建仓库 首先创建一个git目录。 3.初始化仓库 这里面有很多内容&#xff0c;后面会将&#xff0c;主要是用来进行追踪的。 4.配置name和email 当然也…

ClickHouse快速上手

简介 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS) 官网(https://clickhouse.com/docs/zh)给出的定义&#xff0c;其实没看懂 特性 ClickHouse支持一种基于SQL的声明式查询语言&#xff0c;它在许多情况下与ANSI SQL标准相同。使用时和MySQL有点相似&#…

Python输出函数有知道的吗?

print()函数主要用于在终端中输出程序结果。它接受可变参数&#xff0c;可输出多个数据&#xff0c;数据之间默认用空格隔开&#xff0c;输出完毕后默认以换行结尾。print()函数还接受sep和end参数来指定数据间隔和结尾符号&#xff0c;以及file参数来指定输出流。 1.print() 函…

一分钟学会MobaXterm当Linux客户端使用

一、介绍 MobaXterm是一款功能强大的远程计算机管理工具&#xff0c;它集成了各种网络工具和远程连接协议&#xff0c;可以帮助用户在Windows系统上轻松管理远程计算机。MobaXterm支持SSH、Telnet、RDP、VNC等多种远程连接协议&#xff0c;同时还集成了X11服务器&#xff0c;可…

爬虫在网页抓取的过程中可能会遇到哪些问题?

在网页抓取&#xff08;爬虫&#xff09;过程中&#xff0c;开发者可能会遇到多种问题&#xff0c;以下是一些常见问题及其解决方案&#xff1a; 1. IP封锁&#xff1a; 问题&#xff1a;封IP是最常见的问题&#xff0c;抓取的目标网站会识别并封锁频繁请求的IP地址。 解决方案…

【解决(几乎)任何机器学习问题】:处理分类变量篇(上篇)

这篇文章相当长&#xff0c;您可以添加至收藏夹&#xff0c;以便在后续有空时候悠闲地阅读。 本章因太长所以分为上下篇来上传&#xff0c;文章末尾有下篇链接 很多⼈在处理分类变量时都会遇到很多困难&#xff0c;因此这值得⽤整整⼀章的篇幅来讨论。在本章中&#xff0c;我将…

C++动态分配内存知识点!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家好呀&#xff0c;又是分享干货的时间&#xff0c;今天我们来学习一下动态分配内存。 文章目录 1.动态分配内存的思想 2.动态分配内存的概念 2.1内存分配函数 2.2动态内存的申请和释放 2.3内存碎片问…

MyBatis小技巧

MyBatis小技巧 一、#{}和${}1.#{}和${}的区别2.什么情况下必须使⽤${} 二、别名机制-typeAliases1.typeAlias2.package 三、mappers的配置1.mapper&#xff08;1&#xff09;resource&#xff08;3&#xff09;URL&#xff08;3&#xff09;class 2.package 四、插⼊数据时获取…

pikachu靶场-CSRF

CSRF: 介绍&#xff1a; Cross-site request forgery简称为"CSRF”。 在CSF的攻击场景中攻击者会伪造一个请求&#xff08;这个请求一般是一个链接&#xff09; 然后欺骗目标用户进行点击&#xff0c;用户一旦点击了这个请求&#xff0c;整个攻击也就完成了&#xff0…

泽攸科普——扫描电子显微镜(SEM)像衬度形成原理

扫描电镜通过电子束在样品表面进行周而复始的扫描运动&#xff0c;同时实时监测各种信号图像的产生&#xff0c;然后根据产生的信号多少来调制图像。 引起各种信号产生的扫描电镜图像衬度的来源有三个方面&#xff1a; 1. 试样本身性质&#xff1a;包括表面的凹凸不平、成分的…

把excel模版保存到文件夹里不走接口进行下载的方法

把excel保存到文件夹不走接口进行下载&#xff0c;一定要注意&#xff0c;需要放到public下的static文件夹下&#xff0c;如果没有static文件夹&#xff0c;就新建一个 &#xff01;&#xff01;&#xff01;不放在static文件夹下可能会报错&#xff0c;提示&#xff1a;无法从…

尾矿库排洪系统结构仿真软件WKStruc(可试用)

1、背景介绍 尾矿库作为重大危险源之一&#xff0c;在国际灾害事故排名中位列第18位&#xff0c;根据中国钼业2019年8月刊《中国尾矿库溃坝与泄漏事故统计及成因分析》的统计&#xff0c;在46起尾矿库泄漏事故中&#xff0c;由于排洪设施导致的尾矿泄漏事故占比高达1/3&#x…

Mysql第二关之存储引擎

简介 所有关于Mysql数据库优化的介绍仿佛都有存储引擎的身影。本文介绍Mysql常用的有MyISAM存储引擎和Innodb存储引擎&#xff0c;还有常见的索引。 Mysql有两种常见的存储引擎&#xff0c;MyISAM和Innodb&#xff0c;它们各有优劣&#xff0c;经过多次优化和迭代&#xff0c;…

基于 QUIC 协议的 HTTP/3 正式发布!

近期&#xff0c;超文本传输协议新版本 HTTP/3 RFC 文档&#xff0c;已由互联网工程任务组&#xff08;IETF&#xff09;对外发布。HTTP/3 全称为 HTTP-over-QUIC&#xff0c;指在 QUIC&#xff08;Quick UDP Internet Connections, 快速 UDP 互联网连接&#xff09;上映射 HTT…

TSINGSEE青犀AI智能分析网关V4初始配置与算法相关配置介绍

TSINGSEE青犀AI智能分析网关V4内置了近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、物、行为等实时检测分析&#xff0c;上报识别结果&#xff0c;并能进行语音告警播放。硬件管理平台支持RTSP、GB28181协议、以及厂家私有协议接入&#xff0c;可兼容市面上常见…

CSS基础属性

【三】基础属性 【1】高度和宽度 &#xff08;1&#xff09;参数 width&#xff08;宽度&#xff09;&#xff1a;用于设置元素的宽度。可以使用具体的数值&#xff08;如像素值&#xff09;或百分比来指定宽度。 height&#xff08;高度&#xff09;&#xff1a;用于设置元…

Excel练习:双层图表

Excel练习&#xff1a;双层图表 学习视频Excel制作双层图表&#xff0c;很多人都不会&#xff0c;其实只需1步操作就够了&#xff01;_哔哩哔哩_bilibili ​​ 通过调整两个图形的显示范围实现 增加折现图的负数显示范围&#xff0c;使折现图仅出现在整体图形的上方增加柱形…

白话微机:8.解释FPGA以及一些考研面试问题

一. 前言&#xff08;更新世界观&#xff09; 在“微机世界”&#xff0c;普通的城市(单片机)里&#xff0c;人又有一个别的名字叫做“数据”&#xff0c;人有0有1&#xff1b;人们也有住房&#xff0c;这些住房在这个世界叫做“存储器”&#xff1b;地上有路&#xff0c;这些路…

吴恩达机器学习全课程笔记第三篇

目录 前言 P42-P48 神经元和大脑 神经网络中的层 更复杂的神经网络 前向传播&#xff08;做出预测&#xff09; P49-P53 代码中的推理 构建一个神经网络 P54-P60 矩阵乘法 TensorFlow框架实现神经网络 前言 这是吴恩达机器学习笔记的第三篇&#xff0c;第二篇笔记…