前言
Hi,我是老麻花。
不得不说,第六届字节跳动青训营含 AI 量极高。尝试了下 AI 练中学,整个我体验过程非常流畅。无需进行任何环境配置,就可以直接在 MarsCode 平台上运行课程代码。更令人惊喜的是,连大模型调用所需的 API Key 都已经预配置好了,尽管有一定的使用限额。
本文以课程的第 3 部分(用 LangChain 快速构建基于“易速鲜花”本地知识库的智能问答系统)为例,带领大家完整体验 AI 练中学功能,并对课程的第 3 部分进行小结。
体验:有手就行
- 进入 AI 练中学平台
- 打开
DocQA.py文件(无需进行任何代码改动!) - 点击运行
运行后,终端出现以下内容就说明服务跑起来了:
那不对啊,我怎么测试代码呀,点index.html也没啥反应呀。
别急,点击网络服务,即可进行测试。
查看终端打印的调用日志:
不足之处:文件查看解析问题
(小小提个 issue)
PDF 解析乱码
Docx 文件打不开
临时的解决办法
暂时只能将文件下载到本地,使用本地的文件阅读器进行查看。
“易速鲜花”内部员工知识库问答系统流程解读
数据准备和载入
MarsCode 平台提供了“易速鲜花” 所需的所有数据文档,包括 Txt 文件、PDF 文件以及 Doc 文件。
首先,根据文件的格式,我们需要选择相应的文件加载器来完成加载过程。
备注:这里如果要在本地复现,需要安装相应的第三方库 PyPDF 和 Docx2txt
文本分割
接下来,一个至关重要的步骤是对文本进行合理的分割,将其划分成一个个独立的块(Chunk)。文本分割的方法将直接影响到后续大型模型在执行 RAG 过程中的检索召回质量。
常见的文本分块方式:
- 正则表达式拆分:利用模式匹配技术,识别中文标点符号,将文本拆分成独立的句子。
- 固定长度分块:按照预设的长度限制直接进行文本切分。
- 递归分块:分块器首先搜索两个换行符(用于段落分隔)。一旦段落被识别并分割,分块器会检查每个块的大小。如果某个块的尺寸过大,它将根据下一个换行符进行进一步分割。如果块仍然超过大小限制,分块器将继续递归地处理下一个块,直至所有块都符合大小要求。
在 MarsCode 平台上,代码采用的是固定长度分块方法。这可能是因为涉及的文档和项目相对简单,同时固定长度分块的实现也较为直接。后续有时间的话,我将分享其他文本分块技术,以供比较和选择(这里挖个坑
向量数据库存储
文本分割完成后,下一步是利用 Embedding 模型将这些文本块转换成嵌入向量。MarsCode 平台的代码使用的是 OpenAIEmbeddings 来生成这些嵌入向量。当然,也可以选择在 Huggingface 上下载开源且免费的 Embedding 模型来实现相同的功能。
获得嵌入向量后,就需要存储到向量数据库中。常见的向量数据库有 Qdrant 和 Chroma。Qdrant 适用于需要处理大规模、高维度数据的场景,而 Chroma 适用于小型到中型数据集。同时,这两种向量数据库都支持内存存储方式。
相关信息获取
当内部文档存储到向量数据库后,便可根据问题和任务来提取相关的信息。
信息提取的方式是将问题也转换成向量,与向量数据库中的每个向量比较,召回最相关的信息。
常见的向量比较方式有以下几种:
- 欧式距离:常用于关心数量等大小差异的场景
- 余弦相似度:常用于关心文本等语义差异的场景
RetrievalQA 链
这里为了更好地根据问题检索内部知识库的文档,用到了 RetrievalQA 链。
实现部分用到了MultiQueryRetriever,具体流程如下:
- 接收用户输入的查询。
- 使用 LLM 为该查询生成多个相关但角度不同的查询。
- 对每个生成的查询执行向量检索。
- 合并所有检索结果,去重后返回,以获得更大的一组可能相关的文档
采用这种方式,能够有效地提升检索的广度和深度,确保能够获取到更加丰富和精准的信息。
例子: 对于
网站如何盈利问题,MultiQueryRetriever 生成的多角度查询:
- 网站通过哪些方式实现盈利?
- 网站有什么盈利的途径?
- 怎样让网站获得盈利?
生成回答并展示
最终,问答系统通过 RetrievalQA 链来获取相关的文档,生成最终的答案。然后,将这些信息返回给用户,显示在网页上。
如果你觉得文章有用的话,给个不要钱的赞吧 O(∩_∩)O ~