目录
3.将向量化后的文档导入 Chroma 知识库,建立知识库索引
一、大模型理论简介
1.1 大语言模型(LLM)的概念
大语言模型(LLM,Large Language Model),也称大型语言模型,是一种旨在理解和生成人类语言的人工智能模型。
LLM 通常指包含数百亿(或更多)参数的语言模型,它们在海量的文本数据上进行训练,从而获得对语言深层次的理解。目前,国外的知名 LLM 有 GPT-3.5、GPT-4、PaLM、Claude 和 LLaMA 等,国内的有文心一言、讯飞星火、通义千问、ChatGLM、百川、Kimi等。
1.2 LLM的发展历程
语言建模的研究可以追溯到20 世纪 90 年代,当时的研究主要集中在采用统计学习方法来预测词汇。在理解复杂语言规则方面存在一定局限性。
随后,研究人员不断尝试改进,2003 年
深度学习先驱 Bengio 在他的经典论文 《A Neural Probabilistic Language Model》
中,首次将深度学习的思想融入到语言模型中。强大的神经网络模型,相当于为计算机提供了强大的"大脑"来理解语言,让模型可以更好地捕捉和理解语言中的复杂关系。
2018 年
左右,Transformer 架构的神经网络模型开始崭露头角。通过大量文本数据训练这些模型,使它们能够通过阅读大量文本来深入理解语言规则和模式,对语言有了更深刻的理解,极大地提升了模型在各种自然语言处理任务上的表现。
与此同时,研究人员发现,随着语言模型规模的扩大(增加模型大小或使用更多数据),模型展现出了一些惊人的能力,在各种任务中的表现均显著提升。这一发现标志着大型语言模型(LLM)时代的开启。
1.3 LLM的特点
大语言模型具有多种显著特点,这些特点使它们在自然语言处理和其他领域中引起了广泛的兴趣和研究。以下是大语言模型的一些主要特点:
-
巨大的规模: LLM 通常具有巨大的参数规模,可以达到数十亿甚至数千亿个参数。这使得它们能够捕捉更多的语言知识和复杂的语法结构。
-
预训练和微调: LLM 采用了预训练和微调的学习方法。首先在大规模文本数据上进行预训练(无标签数据),学习通用的语言表示和知识。然后通过微调(有标签数据)适应特定任务,从而在各种 NLP 任务中表现出色。
-
上下文感知: LLM 在处理文本时具有强大的上下文感知能力,能够理解和生成依赖于前文的文本内容。这使得它们在对话、文章生成和情境理解方面表现出色。
-
多语言支持: LLM 可以用于多种语言,不仅限于英语。它们的多语言能力使得跨文化和跨语言的应用变得更加容易。
-
多模态支持: 一些 LLM 已经扩展到支持多模态数据,包括文本、图像和声音。使得它们可以理解和生成不同媒体类型的内容,实现更多样化的应用。
-
伦理和风险问题: 尽管 LLM 具有出色的能力,但它们也引发了伦理和风险问题,包括生成有害内容、隐私问题、认知偏差等。因此,研究和应用 LLM 需要谨慎。
-
高计算资源需求: LLM 参数规模庞大,需要大量的计算资源进行训练和推理。通常需要使用高性能的 GPU 或 TPU 集群来实现。
大语言模型是一种具有强大语言处理能力的技术,已经在多个领域展示了潜力。它们为自然语言理解和生成任务提供了强大的工具,同时也引发了对其伦理和风险问题的关注。这些特点使 LLM 成为了当今计算机科学和人工智能领域的重要研究和应用方向
二、检索增强生成(RAG)简介
2.1 RAG是什么
大语言模型(LLM)相较于传统的语音模型具备更强大的能力,但是在某些情况可能无法提高准确的答案。未来决绝LLM在生成文本时面临的系列挑战,提高模型的性能和输出质量,研究人员提出了一种新的模型架构:检索增强生成(RAG, Retrieval-Augmented Generation)。该架构巧妙地整合了从庞大知识库中检索到的相关信息,并以此为基础,指导大型语言模型生成更为精准的答案,从而显著提升了回答的准确性与深度。
目前 LLM 面临的主要问题有:
-
信息偏差/幻觉: LLM 有时会产生与客观事实不符的信息,导致用户接收到的信息不准确。RAG 通过检索数据源,辅助模型生成过程,确保输出内容的精确性和可信度,减少信息偏差。
-
知识更新滞后性: LLM 基于静态的数据集训练,这可能导致模型的知识更新滞后,无法及时反映最新的信息动态。RAG 通过实时检索最新数据,保持内容的时效性,确保信息的持续更新和准确性。
-
内容不可追溯: LLM 生成的内容往往缺乏明确的信息来源,影响内容的可信度。RAG 将生成内容与检索到的原始资料建立链接,增强了内容的可追溯性,从而提升了用户对生成内容的信任度。
-
领域专业知识能力欠缺: LLM 在处理特定领域的专业知识时,效果可能不太理想,这可能会影响到其在相关领域的回答质量。RAG 通过检索特定领域的相关文档,为模型提供丰富的上下文信息,从而提升了在专业领域内的问题回答质量和深度。
-
应用场景适应性受限: LLM 需在多样化的应用场景中保持高效和准确,但单一模型可能难以全面适应所有场景。RAG 使得 LLM 能够通过检索对应应用场景数据的方式,灵活适应问答系统、推荐系统等多种应用场景。
2.2 RAG的工作流程
RAG 是一个完整的系统,其工作流程可以简单地分为数据处理、检索、增强和生成四个阶段:
-
数据处理阶段
-
对原始数据进行清洗和处理。
-
将处理后的数据转化为检索模型可以使用的格式。
-
将处理后的数据存储在对应的数据库中。
-
-
检索阶段
-
将用户的问题输入到检索系统中,从数据库中检索相关信息。
-
-
增强阶段
-
对检索到的信息进行处理和增强,以便生成模型可以更好地理解和使用。
-
-
生成阶段
-
将增强后的信息输入到生成模型中,生成模型根据这些信息生成答案。
-
2.3 RAG VS Finetune
在提升大语言模型效果中,RAG 和 微调(Finetune)是两种主流的方法。
微调: 通过在特定数据集上进一步训练大语言模型,来提升模型在特定任务上的表现。
RAG 和 微调的对比可以参考下表(表格来源[1](https://arxiv.org/abs/2312.10997)(面向大语言模型的检索增强生成技术:综述 [译] | 宝玉的分享)])
特征比较 | RAG | 微调 |
---|---|---|
知识更新 | 直接更新检索知识库,无需重新训练。信息更新成本低,适合动态变化的数据。 | 通常需要重新训练来保持知识和数据的更新。更新成本高,适合静态数据。 |
外部知识 | 擅长利用外部资源,特别适合处理文档或其他结构化/非结构化数据库。 | 将外部知识学习到 LLM 内部。 |
数据处理 | 对数据的处理和操作要求极低。 | 依赖于构建高质量的数据集,有限的数据集可能无法显著提高性能。 |
模型定制 | 侧重于信息检索和融合外部知识,但可能无法充分定制模型行为或写作风格。 | 可以根据特定风格或术语调整 LLM 行为、写作风格或特定领域知识。 |
可解释性 | 可以追溯到具体的数据来源,有较好的可解释性和可追踪性。 | 黑盒子,可解释性相对较低。 |
计算资源 | 需要额外的资源来支持检索机制和数据库的维护。 | 依赖高质量的训练数据集和微调目标,对计算资源的要求较高。 |
推理延迟 | 增加了检索步骤的耗时 | 单纯 LLM 生成的耗时 |
降低幻觉 | 通过检索到的真实信息生成回答,降低了产生幻觉的概率。 | 模型学习特定领域的数据有助于减少幻觉,但面对未见过的输入时仍可能出现幻觉。 |
伦理隐私 | 检索和使用外部数据可能引发伦理和隐私方面的问题。 | 训练数据中的敏感信息需要妥善处理,以防泄露。 |
三、LangChain简介
3.1LangChain是什么
LangChain是一个大模型框架,可以帮助开发者们快速构建基于大型语言模型的端到端应用程序或工作流程。
LangChain 框架是一个开源工具,充分利用了大型语言模型的强大能力,以便开发各种下游应用。它的目标是为各种大型语言模型应用提供通用接口,从而简化应用程序的开发流程。具体来说,LangChain 框架可以实现数据感知和环境互动,也就是说,它能够让语言模型与其他数据来源连接,并且允许语言模型与其所处的环境进行互动。
利用 LangChain 框架,我们可以轻松地构建如下所示的 RAG 应用(图片来源)。在下图中,每个椭圆形代表了 LangChain 的一个模块
,例如数据收集模块或预处理模块。每个矩形代表了一个数据状态
,例如原始数据或预处理后的数据。箭头表示数据流的方向,从一个模块流向另一个模块。在每一步中,LangChain 都可以提供对应的解决方案,帮助我们处理各种任务。
LangChain有6个核心组件:
模型输入/输出(Model I/O) | 与LLM交互 |
---|---|
数据连接(Data connection) | 与Data交互 |
链(Chains) | 组件结合 |
记忆(Memory) | 持久化应用程序状态 |
代理(Agents) | 扩展LLM的推理能力 |
回调(Callbacks) | 扩展LLM的推理能力 |
在开发过程中,我们可以根据自身需求灵活地进行组合。
3.2 LangChain的稳定版本
在 LLM 技术领域的迅猛发展浪潮中,LangChain 作为一个不断进化的创新平台,持续推动着技术边界的拓展。2024 年 1 月 9 日
,LangChain 正式发布了其稳定版本 v0.1.0,这一里程碑式的更新,为开发者带来了全面而强大的功能支持。其涵盖了模型的输入与输出处理、数据连接、链式操作、记忆机制、代理服务以及回调处理等关键组件,为 LLM 应用的开发和部署提供了坚实的基础。 同时,LangChain 的持续优化和功能迭代,未来将带来更多创新特性和性能提升。
-
兼容性与支持:LangChain v0.1.0 版本兼顾了对
Python 和 JavaScript
的支持,同时保持了向后兼容性,确保开发者能够在升级过程中无缝过渡,享受到更加安全稳定的开发体验。 -
架构改进:通过将核心组件 langchain-core 与合作伙伴包进行有效分离,LangChain 的架构设计变得更加条理清晰和稳固,为未来的系统化扩展和安全性提升奠定了坚实基础。
-
可观察性:LangChain 通过与 LangSmith 的深度集成,提供了业界领先的调试和观测功能。这使得开发者能够对 LLM 应用中的每一步操作及其输入输出有一个清晰的认识,极大地简化了调试和问题排查的流程。
-
广泛的集成:LangChain 拥有近 700 个集成,覆盖了从 LLM 到向量存储、工具和智能体(Agent)等多个技术领域,极大地降低了在各种技术栈上构建 LLM 应用的复杂度。
-
可组合性:借助
LangChain 表达式语言(LCEL)
,开发者可以轻松地构建和定制 chain,充分利用数据编排框架的优势,包括批量处理、并行化操作和备选方案等高级功能。 -
流式处理:LangChain 对流式处理进行了深度优化,确保所有利用 LCEL 创建的 chain 均能支持流式处理,包括中间步骤的数据流传输,从而为用户提供更加流畅的体验。
-
输出解析:LangChain 提供了一系列强大的输出解析工具,确保 LLM 能够以结构化的格式返回信息,这对于 LLM 执行具体行动计划至关重要。
-
检索能力:LangChain 引入了先进的检索技术,适用于生产环境,包括文本分割、检索机制和索引管道等,使得开发者能够轻松地将私有数据与 LLM 的能力相结合。
-
工具使用与智能体:LangChain 提供了丰富的智能体和工具集合,并提供了定义工具的简便方法,支持智能体工作负载,包括让 LLM 调用函数或工具,以及如何高效地进行多次调用和推理,极大地提升了开发效率和应用性能。
3.3 LangChain 的生态
-
LangChain Community: 专注于第三方集成,极大地丰富了 LangChain 的生态系统,使得开发者可以更容易地构建复杂和强大的应用程序,同时也促进了社区的合作和共享。
-
LangChain Core: LangChain 框架的核心库、核心组件,提供了基础抽象和 LangChain 表达式语言(LCEL),提供基础架构和工具,用于构建、运行和与 LLM 交互的应用程序,为 LangChain 应用程序的开发提供了坚实的基础。我们后续会用到的处理文档、格式化 prompt、输出解析等都来自这个库。
-
LangChain CLI: 命令行工具,使开发者能够通过终端与 LangChain 框架交互,执行项目初始化、测试、部署等任务。提高开发效率,让开发者能够通过简单的命令来管理整个应用程序的生命周期。
-
LangServe: 部署服务,用于将 LangChain 应用程序部署到云端,提供可扩展、高可用的托管解决方案,并带有监控和日志功能。简化部署流程,让开发者可以专注于应用程序的开发,而不必担心底层的基础设施和运维工作。
-
LangSmith: 开发者平台,专注于 LangChain 应用程序的开发、调试和测试,提供可视化界面和性能分析工具,旨在帮助开发者提高应用程序的质量,确保它们在部署前达到预期的性能和稳定性标准。
四、开发LLM应用的整体流程(重要)
大模型开发分解为以下几个流程:
-
确定目标。在进行开发前,我们首先需要确定开发的目标,即要开发的应用的应用场景、目标人群、核心价值。对于个体开发者或小型开发团队而言,一般应先设定最小化目标,从构建一个 MVP(最小可行性产品)开始,逐步进行完善和优化。
-
设计功能。在确定开发目标后,需要设计本应用所要提供的功能,以及每一个功能的大体实现逻辑。虽然我们通过使用大模型来简化了业务逻辑的拆解,但是越清晰、深入的业务逻辑理解往往也能带来更好的 Prompt 效果。同样,对于个体开发者或小型开发团队来说,首先要确定应用的核心功能,然后延展设计核心功能的上下游功能;例如,我们想打造一款个人知识库助手,那么核心功能就是结合个人知识库内容进行问题的回答,那么其上游功能的用户上传知识库、下游功能的用户手动纠正模型回答就是我们也必须要设计实现的子功能。
-
搭建整体架构。目前,绝大部分大模型应用都是采用的特定数据库 + Prompt + 通用大模型的架构。我们需要针对我们所设计的功能,搭建项目的整体架构,实现从用户输入到应用输出的全流程贯通。一般来说,我们推荐基于 LangChain 框架进行开发。LangChain 提供了 Chain、Tool 等架构的实现,我们可以基于 LangChain 进行个性化定制,实现从用户输入到数据库再到大模型最后输出的整体架构连接。
-
搭建数据库。个性化大模型应用需要有个性化数据库进行支撑。由于大模型应用需要进行向量语义检索,一般使用诸如 Chroma 的向量数据库。在该步骤中,我们需要收集数据并进行预处理,再向量化存储到数据库中。数据预处理一般包括从多种格式向纯文本的转化,例如 PDF、MarkDown、HTML、音视频等,以及对错误数据、异常数据、脏数据进行清洗。完成预处理后,需要进行切片、向量化构建出个性化数据库。
-
Prompt Engineering。优质的 Prompt 对大模型能力具有极大影响,我们需要逐步迭代构建优质的 Prompt Engineering 来提升应用性能。在该步中,我们首先应该明确 Prompt 设计的一般原则及技巧,构建出一个来源于实际业务的小型验证集,基于小型验证集设计满足基本要求、具备基本能力的 Prompt。
-
验证迭代。验证迭代在大模型开发中是极其重要的一步,一般指通过不断发现 Bad Case 并针对性改进 Prompt Engineering 来提升系统效果、应对边界情况。在完成上一步的初始化 Prompt 设计后,我们应该进行实际业务测试,探讨边界情况,找到 Bad Case,并针对性分析 Prompt 存在的问题,从而不断迭代优化,直到达到一个较为稳定、可以基本实现目标的 Prompt 版本。
-
前后端搭建。完成 Prompt Engineering 及其迭代优化之后,我们就完成了应用的核心功能,可以充分发挥大语言模型的强大能力。接下来我们需要搭建前后端,设计产品页面,让我们的应用能够上线成为产品。前后端开发是非常经典且成熟的领域,此处就不再赘述,我们采用 Gradio 和 Streamlit,可以帮助个体开发者迅速搭建可视化页面实现 Demo 上线。
-
体验优化。在完成前后端搭建之后,应用就可以上线体验了。接下来就需要进行长期的用户体验跟踪,记录 Bad Case 与用户负反馈,再针对性进行优化即可。
五、搭建 LLM 项目的流程简析(以知识库助手为例)
以下我们将结合本实践项目与上文的整体流程介绍,简要分析知识库助手项目开发流程:
步骤一:项目规划与需求分析
1.项目目标:基于个人知识库的问答助手
2.核心功能
-
将爬取并总结的 MarkDown 文件及用户上传文档向量化,并创建知识库;
-
选择知识库,检索用户提问的知识片段;
-
提供知识片段与提问,获取大模型回答;
-
流式回复;
-
历史对话记录
3.确定技术架构和工具
-
框架:LangChain
-
Embedding 模型:GPT、智谱、M3E
-
数据库:Chroma
-
大模型:GPT、讯飞星火、文心一言、GLM 等
-
前后端:Gradio 和 Streamlit
步骤二:数据准备与向量知识库构建
本项目实现原理如下图所示(图片来源):加载本地文档 -> 读取文本 -> 文本分割 -> 文本向量化 -> question 向量化 -> 在文本向量中匹配出与问句向量最相似的 top k 个 -> 匹配出的文本作为上下文和问题一起添加到 Prompt 中 -> 提交给 LLM 生成回答。
1.收集和整理用户提供的文档
用户常用文档格式有 PDF、TXT、MD 等,首先,我们可以使用 LangChain 的文档加载器模块方便地加载用户提供的文档,或者使用一些成熟的 Python 包进行读取。
由于目前大模型使用 token 的限制,我们需要对读取的文本进行切分,将较长的文本切分为较小的文本,这时一段文本就是一个单位的知识。
2.将文档词向量化
使用文本嵌入(Embeddings)技术
对分割后的文档进行向量化,使语义相似的文本片段具有接近的向量表示。然后,存入向量数据库,完成 索引(index)
的创建。
利用向量数据库对各文档片段进行索引,可以实现快速检索。
3.将向量化后的文档导入 Chroma 知识库,建立知识库索引
Langchain 集成了超过 30 个不同的向量数据库。Chroma 数据库轻量级且数据存储在内存中,这使得它非常容易启动和开始使用。
将用户知识库内容经过 Embedding 存入向量数据库,然后用户每一次提问也会经过 Embedding,利用向量相关性算法(例如余弦算法)找到最匹配的几个知识库片段,将这些知识库片段作为上下文,与用户问题一起作为 Prompt 提交给 LLM 回答。
步骤三:大模型集成与 API 连接
-
集成 GPT、星火、文心、GLM 等大模型,配置 API 连接。
-
编写代码,实现与大模型 API 的交互,以便获取问题回答。
步骤四:核心功能实现
-
构建 Prompt Engineering,实现大模型回答功能,根据用户提问和知识库内容生成回答。
-
实现流式回复,允许用户进行多轮对话。
-
添加历史对话记录功能,保存用户与助手的交互历史。
步骤五:核心功能迭代优化
-
进行验证评估,收集 Bad Case。
-
根据 Bad Case 迭代优化核心功能实现。
步骤六:前端与用户交互界面开发
-
使用 Gradio 和 Streamlit 搭建前端界面。
-
实现用户上传文档、创建知识库的功能。
-
设计用户界面,包括问题输入、知识库选择、历史记录展示等。
步骤七:部署测试与上线
-
部署问答助手到服务器或云平台,确保可在互联网上访问。
-
进行生产环境测试,确保系统稳定。
-
上线并向用户发布。
步骤八:维护与持续改进
-
监测系统性能和用户反馈,及时处理问题。
-
定期更新知识库,添加新的文档和信息。
-
收集用户需求,进行系统改进和功能扩展。
整个流程将确保项目从规划、开发、测试到上线和维护都能够顺利进行,为用户提供高质量的基于个人知识库的问答助手。