手把手教你用 Milvus 和 Towhee 搭建一个 AI 聊天机器人!
作为向量数据库的佼佼者,Milvus 适用于各种需要借助高效和可扩展向量搜索功能的 AI 应用。
举个例子,如果想要搭建一个负责聊天机器人数据管理流程,Milvus 必然是首选向量数据库。那么如何让这个应用程序开发变得易于管理及更好理解,那就需要借助 Towhee(https://towhee.io/)了。Towhee 是一个新兴的机器学习(ML)框架,可以简化了实现和编排复杂 ML 模型的过程。
接下来我将介绍如何通过 Python 使用 Milvus + Towhee 搭建一个基础的 AI 聊天机器人。本文会重点讲解如何处理、分析非结构化数据及存储和查询向量数据。
01.设置环境
首先,创建一个 Python 虚拟环境来运行聊天机器人。
以下是 Linux shell session(会话)。借助 Shell session 创建并激活环境,将 pip 升级到最新版本。
接下来,安装运行代码所需的软件包:Pandas、Jupyter、Langchain、Towhee、Unstructured、Milvus、PymMilvus、sentence_transformers 和 Gradio。
访问链接 https://gist.github.com/egoebelbecker/07059b88a1c4daa96ec07937f8ca77b3 获取涵盖本教程所有代码的 Jupyter Notebook。下载 Notebook,启动 Jupyter 并加载 Notebook。
02.搭建聊天机器人
一切准备就绪后,就可以搭建聊天机器人了。
文档存储
机器人需要存储文档块以及使用 Towhee 提取出的文档块向量。在这个步骤中,我们需要用到 Milvus。
安装轻量版 Milvus Lite,使用以下命令运行 Milvus 服务器:
或者,运行 Notebook 中的代码:
设置应用变量并获取 OpenAI API 密钥
接下来,设置变量并清理旧的 SQLite 文件,我们将用 SQLite 存储聊天历史记录。
MILVUS_URI - Milvus 服务器连接信息,解析为主机和端口。
MILVUS_HOST - Milvus 运行的主机。
MILVUS_PORT - 服务器监听的端口。
DROP_EXIST - 在启动时删除现有的 Milvus 集合。
EMBED_MODEL - 用于生成 embedding 向量的 sentence_transformers 模型
COLLECTION_NAME - 用于存储向量数据的 Milvus collection 名称
DIM - 模型生成的文本向量维度
OPENAI_API_KEY - 大语言模型(LLM) API 的密钥
运行上述代码定义变量并输入 OpenAI API 密钥。
示例流水线(pipeline)
接下来,需要下载数据并存储在 Milvus 中。不过在此之前,先学习一下如何使用 pipeline 处理非结构化数据。
我会用 Towhee 官网主页作为文档来源的示例来进行演示,大家也可以尝试其他不同文档网站,了解 pipeline 如何处理不同的数据集。
以下代码使用 Towhee pipeline:
input - 创建新 pipeline,传入源数据。
map - 使用 ops.text_loader() 解析 URL 并将其映射为 'doc'。
flat_map - 使用 ops.text_splitter() 将文档拆分成多个片段,以便后续存储。
output - 选择数据输出,准备就绪可以使用。
将此 pipeline 传入 DataCollection 观察其工作原理。
以下为输出:
示例 Embedding pipeline
接着,参考以下示例 embedding pipeline 将这些文档块转化为向量。pipeline 通过 map() 在每个文档块上运行 ops.sentence_embedding.sbert()。在示例中,我们传入了 1 个文本块。
运行此代码查看这个 pipeline 如何将单个文档片段转换成向量。
设置 Milvus
创建 1 个 Collection 来存储数据。
以下代码中,我们使用 MILVUS_HOST 和 MILVUS_PORT 连接至 Milvus,删除所有现有 Collection ,并定义了 create_collection() 函数以创建 1 个全新的 Collection。
新 Collection 的 Schema 如下所示:
id - 标识符,数据类型为整数。
embedding - 向量,数据类型为浮点向量。
text - 向量对应的文档块文本,数据类型为字符串。
插入 Pipeline
现在,将文本向量插入 Milvus。
以下代码可以:
创建新 Collection
加载新文档数据
将新文档切块
使用 EMBED_MODEL 为文本快生成向量
将文本块向量和对应文本块数据插入到 Milvus
通过以下代码,我们将 Frodo Baggins 的百科页面内容转化为文本快向量并插入到 Milvus 中。
最终一共插入 408 个本文块向量:
03.检索知识库
Milvus 中已经存储了文本块向量,现在可以进行向量查询了。
以下函数创建了 1 个查询 pipeline。注意,这是本教程中最为关键的一个步骤!
OSSChat_milvus(https://towhee.io/ann-search/osschat-milvus) 查询 Milvus 向量数据库中与查询文本相匹配的文档片段。
以下为整个查询 pipeline 代码:
现在,可以尝试查询以下问题:
不难发现,我们使用的模型返还了 3 个相匹配的结果(注:前面 ann_search.osschat_milvus 中指定了 limit=3):
04.加入大语言模型(LLM)
接着,需要在聊天机器人中加入 LLM。这样,用户就可以和聊天机器人开展对话了。本示例中,我们将使用 OpenAI ChatGPT 背后的模型服务:GPT-3.5。
聊天记录
为了使 LLM 回答更准确,我们需要存储用户和机器人的聊天记录,并在查询时调用这些记录,可以用 SQLite 实现聊天记录的管理。
以下函数用于调取聊天记录:
以下函数用户存储聊天记录:
LLM 查询 Pipeline
搭建一个 Pipeline 将查询传递至 LLM 中。
这个 LLM 查询 Pipeline 可以:
根据用户查询问题搜索 Milvus 向量数据库
调取并存储当前聊天记录
将用户查询问题、Milvus 搜索结果、聊天记录三者一并传入 ChatGPT
记录本轮问题和答案
返回最终回答
在连接至图形用户界面(GUI)前,我们需要先测试以下这个 Pipeline。
以下为输出和结果:
恭喜你!这个 Pipeline 搭建成功了!接下来可以搭建 Gradio 界面吧!
Gradio 界面
首先,需要一些函数通过 UUID 来创建 session ID ,接受并响应界面上的用户查询。
接着,Gradio 界面通过这些函数搭建聊天机器人。Blocks API 用于搭建聊天机器人界面。发送信息(Send Message)按钮通过响应函数将请求发送至 ChatGPT。
界面如下所示:
至此,一个结合向量检索和 LLM 生成的智能聊天机器人就搭建完成啦!
05.总结
回顾一下,我们首先创建了 Towhee pipeline 来处理非结构化数据,并将其转化为向量并存储在 Milvus 向量数据库中。然后,搭建了一个查询 Pipeline,在聊天机器人中接入 LLM。最终,一个基础的聊天机器人界面便搭建完成。
简言之,Milvus 高度可扩展,提供高效的向量相似性搜索功能,能够帮助开发者轻松搭建聊天机器人、推荐系统、图片或文本识别等 ML 和 AI 应用。期待大家用 Milvus 搭建更出更棒的应用!
本文作者
Eric Goebelbecker 现居纽约,有着 25 年的金融市场从业经验。他负责为金融资讯交换(FIX)协定网络和市场数据分析系统搭建基础设施。Eric 热衷于探索各种提升团队工作效率的工具和软件。
如果在使用 Milvus 或 Zilliz 产品有任何问题,可添加小助手微信 “zilliz-tech” 加入交流群。
欢迎关注微信公众号“Zilliz”,了解最新资讯。
评论