关于tidb:使用-Coze-搭建-TiDB-助手

52次阅读

共计 7447 个字符,预计需要花费 19 分钟才能阅读完成。

导读

本文介绍了应用 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 F
    from 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 等;基于现有数据库系统拓展了向量能力的有 ElasticsearchPgVectorRedis 等;甚至还有一些向量库的 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 就做好了。

正文完
 0