30分钟,通过ModelScope平台和开源LLM打造个人知识库 QA Bot(1)

本文涉及的产品
模型训练 PAI-DLC,5000CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,5000CU*H 3个月
简介: 30分钟,通过ModelScope平台和开源LLM打造个人知识库 QA Bot

前言

在前三篇文章中,我们建立了GPT模型微调的环境,并使用微调让GPT学习了新知识,同时了解了ChatGPT中的Prompt技巧与设计。在本章中,我们将利用本地数据库,构建一个基于本地知识库的GPT问答机器人,而非使用Langchain。

附录:

《打造个性化离线ChatGPT - GPT模型微调实战指南》

《微调的小型模型在专业领域性能勉强接近GPT-3.5 - GPT 模型微调实战指南(二)》

《ChatGPT中的Prompt技巧与设计 - GPT 模型微调实战指南(三)》

环境准备

由于modelscope社区正在举办活动,新注册用户可以免费获得100小时的GPU算力,因此我们将使用modelscope提供的环境来进行本次实验。这将为大家提供更方便的测试和体验。

  1. 打开 https://modelscope.cn/my/mynotebook
  2. 依次点击 我的Notebook→阿里云弹性加速计算EAIS→GPU环境→快速启动。

image.png

  1. 稍等一会,即可进入界面。

image.png

至此,我们的基础环境准备好了。

注意,该环境乃测试环境,使用的时间和最大时长有限制任何数据记得及时做好备份!!!

image.png

由于我们希望在后期可以进行自定义定制,并且架构相对简单,因此本文决定不使用Langchain,而是准备自己实现整个流程。

主要涉及Prompt编写、向量库、向量算法以及文本切割。下面将详细介绍如何实现的过程。

Prompt编写

根据吴恩达在《ChatGPT中的Prompt技巧与设计》课程中介绍的范式,我们经过多次尝试后,决定采用该模板来构建的问答的Prompt。

请根据上下文来回答问题,
如果上下文的信息无法回答问题,请回答"我不知道"。
上下文:
"""
{根据用户输入的问题,从向量数据库查询的结果。一行一个}
"""
问题:"""{用户输入的问题}"""
回答:

为了让LLM认为从向量数据库查询的结果是一句完整的话,我在每个结果的末尾添加一个了句号。当然,这个模板仍然无法完全约束模型的生成结果,仍可能会存在编造结果的情况。

我尝试了调整模型的 top_p temperature 这两个参数,但是并没有消除这种情况的出现。要达到更好的效果,还是需要进行微调,并限制模型的思考范围和输出结果的格式。

向量数据库的选型

在众多的向量库类型中,我选择了Chroma向量库,原因如下:

  1. 可以本地部署,不需要连接到外部服务,保证了数据的隐私性。
  2. 结构简单,易于理解和魔改。
  3. 可以自定义实现量化算法,从而优化检索速度和准确度。
  4. 数据可以持久化,便于长期存储和管理。

因此,我们选择了Chroma向量库作为本次实验的数据库。

详细文档 https://docs.trychroma.com/

注:默认Chroma会收集匿名使用的信息,如何关闭请查阅https://docs.trychroma.com/telemetry

文本的分割

在导入文本到向量库之前,我们可以参考Langchain是如何对文本分割的,以便更好地理解该过程。

https://python.langchain.com/en/latest/modules/chains/index_examples/summarize.html

我们可以看到,默认使用的文本分割器是 CharacterTextSplitter。该文本分割器需要一个字符列表separator,它会尝试根据第一个字符进行分割,但如果任何块太大,则会转移到下一个字符。默认情况下,它会尝试拆分的字符是["\n\n", "\n", " ", ""]

除了控制separator可以拆分哪些字符外,我还可以通过以下参数来控制文本分割器的行为:

  1. length_function:用于计算块的长度的函数。默认情况下,只计算字符数量,但通常会传递一个标记计数器。
  2. chunk_size:块的最大大小(由长度函数测量)。
  3. chunk_overlap:块之间的最大重叠。保持一定的连续性(例如滑动窗口)可以很好地维护一些重叠。

除了使用文本分割器对文本进行分割外,langchain还介绍了其他几种方式来对大段文本进行切割。

https://docs.langchain.com/docs/components/chains/index_related_chains

stuff:   Stuffing 方法是最简单的方法,只需将所有相关数据作为上下文放入提示中,以传递给语言模型。在 LangChain 中实现为 StuffDocumentsChain。

优点:只需要向 LLM 进行一次调用。在生成文本时,LLM 可以一次性访问所有数据。

缺点:大多数 LLM 都有一个上下文长度,对于大型文档(或许多文档),这种方法将不起作用,因为它会导致提示大于上下文长度。

map_reduce: 这种方法涉及对每个数据块运行初始提示(对于摘要任务,这可能是该块的摘要;对于问答任务,这可能是仅基于该块的答案)。然后,运行一个不同的提示来组合所有初始输出。这在 LangChain 中实现为 MapReduceDocumentsChain。

优点:可扩展到比 StuffDocumentsChain 更大的文档(和更多的文档)。对单个文档的 LLM 调用是独立的,因此可以并行化。

缺点:需要比 StuffDocumentsChain 更多的 LLM 调用。在最终的合并调用过程中会丢失一些信息。

refine: 这种方法涉及在第一个数据块上运行初始提示,生成一些输出。对于其余文档,将传递该输出以及下一个文档,并要求LLM基于新文档来改进输出。

优点:可以提取更相关的上下文,比 MapReduceDocumentsChain 的信息丢失可能更少。

缺点:需要比 StuffDocumentsChain 更多的 LLM 调用。这些调用也不是独立的,意味着不能像 MapReduceDocumentsChain 那样并行化。文档的排序也可能存在一些潜在的依赖关系。‘

Map-rerank: 这种方法涉及在每个数据块上运行初始提示,它不仅尝试完成任务,还为其答案的确定性打分。然后根据这个得分对响应进行排序,并返回最高得分。

优点:类似于 MapReduceDocumentsChain。与 MapReduceDocumentsChain 相比,需要较少的调用。

缺点:不能在文档之间合并信息。这意味着当你期望在单个文档中有单一简单的答案时,它最有用。

本次用来做测试的是西游记,这种大段的文本通过map_reduce或者refine 的效果会更好一些,因为是小说,有上下文的含义。不过这里为了方便展 , 直接按照 100的长度进行分割打入数据库了。

不同的业务场景需要根据实际的需求来选择不同的方式进行分割文本,这样才可以达到比较好的效果。

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
可控细节的长文档摘要,探索开源LLM工具与实践
本文通过将文档分为几部分来解决这个问题,然后分段生成摘要。在对大语言模型进行多次查询后,可以重建完整的摘要。通过控制文本块的数量及其大小,我们最终可以控制输出中的细节级别。
|
12天前
|
算法 测试技术 AI芯片
CPU反超NPU,llama.cpp生成速度翻5倍!LLM端侧部署新范式T-MAC开源
【9月更文挑战第7天】微软研究院提出了一种名为T-MAC的创新方法,旨在解决大型语言模型在资源受限的边缘设备上高效部署的问题。T-MAC通过查表法在CPU上实现低比特LLM的高效推理,支持混合精度矩阵乘法,无需解量化。其通过位级查表实现统一且可扩展的解决方案,优化数据布局和重用率,显著提升了单线程和多线程下的mpGEMV及mpGEMM性能,并在端到端推理吞吐量和能效方面表现出色。然而,表量化和快速聚合技术可能引入近似和数值误差,影响模型准确性。论文详见:[链接](https://www.arxiv.org/pdf/2407.00088)。
44 10
|
30天前
|
人工智能 物联网 大数据
开源大赛 | 第七届CCF开源创新大赛ModelScope赛题解读
第七届CCF开源创新大赛由CCF主办,长沙理工大学和CCF开源发展委员会联合承办,以国家“十四五”开源生态发展战略布局为导向,重点关注人工智能、大数据、芯片设计、物联网等领域的开源软件,旨在创建一个展示、交流和合作的平台,激发开源创新精神,培养开源人才,并促进高质量的开源生态系统建设。
|
1月前
|
数据采集 人工智能 监控
赌你一定想要!OpenDataLab首款大模型多模态标注平台Label-LLM正式开源
Label-LLM 是一款专为大模型训练设计的多模态文本对话标注工具,支持团队协作,让标注工作变得简单高效。它不仅涵盖丰富的任务类型,如回答采集、偏好收集和内容评估等,还支持多模态数据标注,包括图像、视频和音频。Label-LLM具备预标注载入功能,能大幅提升工作效率,并提供全方位的任务管理与可视化分析,确保标注质量。快来体验这款强大的标注平台吧![部署文档](https://github.com/opendatalab/LabelLLM)
168 0
赌你一定想要!OpenDataLab首款大模型多模态标注平台Label-LLM正式开源
|
1月前
|
人工智能 开发框架 物联网
赢万元奖金 | 第七届CCF开源创新大赛ModelScope开源模型应用挑战赛开启报名!
第七届CCF开源创新大赛(后简称“大赛”) 由中国计算机学会(CCF)主办,长沙理工大学、CCF开源发展委员会联合承办。
|
2月前
|
算法 API 数据中心
魔搭社区利用 NVIDIA TensorRT-LLM 加速开源大语言模型推理
魔搭社区于 2022 年 11 月初创建,首次在业界提出了 “模型即服务”( MaaS, Model as a Service)的理念。
|
2月前
|
编解码 文字识别 计算机视觉
寒武纪1号诞生:谢赛宁Yann LeCun团队发布最强开源多模态LLM
【7月更文挑战第10天】【寒武纪1号】- 谢赛宁、Yann LeCun团队发布开源多模态LLM,含8B至34B规模模型,创新空间视觉聚合器(SVA)提升视觉-语言集成,建立新基准CV-Bench及大规模训练数据集Cambrian-7M。在多模态任务中表现出色,尤其在高分辨率图像处理上,但面临高分辨率信息处理和部分视觉任务评估的局限。[链接](https://arxiv.org/pdf/2406.16860)
63 1
|
3月前
|
人工智能 自然语言处理 算法
LLM主流开源代表模型(二)
随着ChatGPT迅速火爆,引发了大模型的时代变革,国内外各大公司也快速跟进生成式AI市场,近百款大模型发布及应用。
|
3月前
|
人工智能 小程序 机器人
开源一个RAG大模型本地知识库问答机器人-ChatWiki
准备工作 再安装ChatWiki之前,您需要准备一台具有联网功能的linux服务器,并确保服务器满足最低系统要求 • Cpu:最低需要2 Core • RAM:最低需要4GB 开始安装 ChatWiki社区版基于Docker部署,请先确保服务器已经安装好Docker。如果没有安装,可以通过以下命令安装:
238 0
|
1月前
|
人工智能 自然语言处理
公理训练让LLM学会因果推理:6700万参数模型比肩万亿参数级GPT-4
【8月更文挑战第3天】新论文提出“公理训练”法,使仅有6700万参数的语言模型掌握因果推理,性能媲美万亿级GPT-4。研究通过大量合成数据示例教授模型因果公理,实现有效推理并泛化至复杂图结构。尽管面临合成数据需求大及复杂关系处理限制,此法仍为语言模型的因果理解开辟新途径。[链接: https://arxiv.org/pdf/2407.07612]
41 1