第一章
该为动手学大模型应用开发的读书笔记,小白一枚,有错欢迎大佬指出,也欢迎大家去看原版。
简要介绍
大语言模型(LLM,Large Language Model),也称大型语言模型,是一种其在理解和生成人类语言的人工智能。知名的LLM有GPT,LLaMA,Claude,DeepSeek,Kimi等
20世纪90年代 | 2003年 | 2018年 | 2024 年 9 月以后 |
---|---|---|---|
人们采用统计学习方法来预测词汇 | 深度学习先驱Bengio 在他的论文*《A Neural Probabilistic Language Model》*中,首次将深度学习的思想融入到语言模型中 | Transformer 架构的神经网络模型开始崭露头角 | 随着 OpenAI o1 的推出,后训练和在线推理阶段也各自拥有了 Scaling Law |

LLM的特点与能力
- 巨大的规模: LLM 通常具有巨大的参数规模,可以达到数十亿甚至数千亿个参数。这使得它们能够捕捉更多的语言知识和复杂的语法结构。
- 预训练和微调: LLM 采用了预训练和微调的学习方法。首先在大规模文本数据上进行预训练(无标签数据),学习通用的语言表示与知识。然后通过==微调(有标签数据)==适应特定任务,从而在各种 NLP 任务中表现出色。
- 上下文感知: LLM 在处理文本时具有强大的上下文感知能力,能够理解和生成依赖于前文的文本内容
- 多语言支持: LLM 可以用于多种语言,不仅限于英语。它们的多语言能力使得跨文化和跨语言的应用变得更加容易。
- 多模态支持: 一些 LLM 已经扩展到支持多模态数据,包括文本、图像和声音。使得它们可以理解和生成不同媒体类型的内容,实现更多样化的应用。
- 伦理和风险问题: 尽管 LLM 具有出色的能力,但它们也引发了伦理和风险问题,包括生成有害内容、隐私问题、认知偏差等。因此,研究和应用 LLM 需要谨慎。
- 高计算资源需求: LLM 参数规模庞大,需要大量的计算资源进行训练和推理。通常需要使用高性能的 GPU 或 TPU 集群来实现。
1)涌现能力(emergent abilities)
涌现能力是指复杂系统中由个体简单规则交互所产生的、整体层面的新特性,它不是人为设计的,而是系统自发形成的。区分大语言模型和预训练语言模型最显著特征之一便是涌现能力。
以下是三个LLM的经典涌现能力:
- 上下文学习:这种能力允许语言模型在提供自然语言指令或多个任务示例的情况下,通过理解上下文并生成相应输出的方式来执行任务,而无需额外的训练或参数更新。
- 指令遵循:通过使用自然语言描述的多任务数据进行微调,也就是所谓的 指令微调。
- 逐步推理:小型语言模型通常难以解决涉及多个推理步骤的复杂任务,例如数学问题。而LLM 通过采用 思维链(CoT, Chain of Thought) 推理策略,利用包含中间推理步骤的提示机制来解决这些任务,从而得出最终答案。
2)作为基座模型支持多元应用的能力
**基座模型(Base Model)**是指在人工智能领域,尤其是生成式AI和大语言模型中,经过大规模数据预训练后形成的初始模型。
这是一种全新的 AI 技术范式,借助于海量无标注数据的训练,获得可以适用于大量下游任务的大模型(单模态或者多模态)。这样,多个应用可以只依赖于一个或少数几个大模型进行统一建设。
3)支持对话作为统一入口的能力
LLM 已经在许多领域产生了深远的影响,而且LLM 的出现让人们重新思考了 通用人工智能(AGI) 的可能性。
领域 | 影响 |
---|---|
自然语言处理 | 帮助计算机更好地理解和生成文本 |
信息检索 | 改进搜索引擎 |
计算机视觉 | 让计算机理解图像和文字 |
什么是RAG
检索增强生成(RAG, Retrieval-Augmented Generation),是一种结合信息检索与文本生成技术的人工智能方法。
该架构巧妙地整合了从庞大知识库中检索到的相关信息,并以此为基础,指导大型语言模型生成更为精准的答案,从而显著提升了回答的准确性与深度。
对LLM的帮助:
- 信息偏差/幻觉: LLM 有时会产生与客观事实不符的信息,利用RAG检索数据源,辅助模型生成过程,确保输出内容的精确性和可信度,减少信息偏差。
- 知识更新滞后性: LLM 基于静态的数据集训练,这可能导致模型的知识更新滞后,利用RAG 通过实时检索最新数据,保持内容的时效性,确保信息的持续更新和准确性。
- 内容不可追溯: LLM 生成的内容往往缺乏明确的信息来源,影响内容的可信度,利用RAG 将生成内容与检索到的原始资料建立链接,增强了内容的可追溯性,从而提升了用户对生成内容的信任度。
- 领域专业知识能力欠缺: LLM 在处理特定领域的专业知识时,效果可能不太理想,利用RAG 通过检索特定领域的相关文档,为模型提供丰富的上下文信息,从而提升了在专业领域内的问题回答质量和深度。
- 推理能力限制: 面对复杂问题时,LLM 可能缺乏必要的推理能力,利用RAG 结合检索到的信息和模型的生成能力,通过提供额外的背景知识和数据支持,增强了模型的推理和理解能力。
- 应用场景适应性受限: RAG 使得 LLM 能够通过检索对应应用场景数据的方式,灵活适应问答系统、推荐系统等多种应用场景。
- **长文本处理能力较弱:**RAG 通过检索和整合长文本信息,强化了模型对长上下文的理解和生成,有效突破了输入长度的限制,同时降低了调用成本,并提升了整体的处理效率。
RAG的工作流程
RAG 是一个完整的系统,其工作流程可以简单地分为数据处理、检索、增强和生成四个阶段,如下图所示:

RAG VS Finetune
在提升大语言模型效果中,RAG 和 **微调(Finetune)**是两种主流的方法。
微调通常是指在机器学习和深度学习中,对一个已经预训练好的模型进行进一步的训练,以使其更好地适应特定任务或数据集。
特征比较 | RAG | 微调 |
---|---|---|
知识更新 | 直接更新检索知识库,无需重新训练。信息更新成本低,适合动态变化的数据。 | 通常需要重新训练来保持知识和数据的更新。更新成本高,适合静态数据。 |
外部知识 | 擅长利用外部资源,特别适合处理文档或其他结构化/非结构化数据库。 | 将外部知识学习到 LLM 内部。 |
数据处理 | 对数据的处理和操作要求极低。 | 依赖于构建高质量的数据集,有限的数据集可能无法显著提高性能。 |
模型定制 | 侧重于信息检索和融合外部知识,但可能无法充分定制模型行为或写作风格。 | 可以根据特定风格或术语调整 LLM 行为、写作风格或特定领域知识。 |
可解释性 | 可以追溯到具体的数据来源,有较好的可解释性和可追踪性。 | 黑盒子,可解释性相对较低。 |
计算资源 | 需要额外的资源来支持检索机制和数据库的维护。 | 依赖高质量的训练数据集和微调目标,对计算资源的要求较高。 |
推理延迟 | 增加了检索步骤的耗时 | 单纯 LLM 生成的耗时 |
降低幻觉 | 通过检索到的真实信息生成回答,降低了产生幻觉的概率。 | 模型学习特定领域的数据有助于减少幻觉,但面对未见过的输入时仍可能出现幻觉。 |
伦理隐私 | 检索和使用外部数据可能引发伦理和隐私方面的问题。 | 训练数据中的敏感信息需要妥善处理,以防泄露。 |
LangChain
从 2022 年开始,许多机构和个人相继推出了多个开源项目,旨在帮助开发者们快速构建基于大型语言模型的端到端应用程序或工作流程。其中一个备受关注的项目就是 LangChain 框架。
LangChain 框架是一个开源工具,充分利用了大型语言模型的强大能力,以便开发各种下游应用。它的目标是为各种大型语言模型应用提供通用接口,从而简化应用程序的开发流程。

LangChain的核心组件
LangChian可以将 LLM 模型(对话模型、embedding 模型等)、向量数据库、交互层 Prompt、外部知识、外部代理工具整合到一起,进而可以自由构建 LLM 应用。 LangChain 主要由以下 6 个核心组件组成:
- 模型输入/输出(Model I/O):与语言模型交互的接口
- 数据连接(Data connection):与特定应用程序的数据进行交互的接口
- 链(Chains):将组件组合实现端到端应用
- 记忆(Memory):用于链的多次运行之间持久化应用程序状态
- 代理(Agents):扩展模型的推理能力
- 回调(Callbacks):扩展模型的推理能力
LangChain的稳定版本
自2024年1月9日,LangChain发布v0.1.0稳定版本后,其涵盖的模型的输入与输出处理、数据连接、链式操作、记忆机制、代理服务以及回调处理等关键组件为开发者们带来巨大便利,有以下9点优势:
- 兼容性与支持:LangChain v0.1.0 版本兼顾了对
Python 和 JavaScript
的支持,同时保持了向后兼容性。 - 架构改进:通过将核心组件 langchain-core 与合作伙伴包进行有效分离,LangChain 的架构设计变得更加条理清晰和稳固,为未来的系统化扩展和安全性提升奠定了坚实基础。
- 可观察性:通过与 LangSmith 的深度集成,提供了业界领先的调试和观测功能,极大地简化了调试和问题排查的流程。
- 广泛的集成:拥有近 700 个集成,覆盖了从 LLM 到向量存储、工具和智能体(Agent)等多个技术领域,极大地降低了在各种技术栈上构建 LLM 应用的复杂度。
- 可组合性:借助
LangChain 表达式语言(LCEL)
,开发者可以轻松地构建和定制 chain,充分利用数据编排框架的优势,包括批量处理、并行化操作和备选方案等高级功能。 - 流式处理:对流式处理进行了深度优化,确保所有利用 LCEL 创建的 chain 均能支持流式处理,包括中间步骤的数据流传输,从而为用户提供更加流畅的体验。
- 输出解析:提供了一系列强大的输出解析工具,确保 LLM 能够以结构化的格式返回信息。
- 检索能力:引入了先进的检索技术,适用于生产环境,包括文本分割、检索机制和索引管道等,使得开发者能够轻松地将私有数据与 LLM 的能力相结合。
- 工具使用与智能体:提供了丰富的智能体和工具集合,并提供了定义工具的简便方法,支持智能体工作负载,极大地提升了开发效率和应用性能。
LangChain的生态
- LangChain Community: 专注于第三方集成,极大地丰富了 LangChain 的生态系统,使得开发者可以更容易地构建复杂和强大的应用程序,同时也促进了社区的合作和共享。
- LangChain Core: LangChain 框架的核心库、核心组件,提供了基础抽象和 LangChain 表达式语言(LCEL),提供基础架构和工具,用于构建、运行和与 LLM 交互的应用程序,为 LangChain 应用程序的开发提供了坚实的基础,我们后续会用到的处理文档、格式化 prompt、输出解析等都来自这个库。
- LangChain CLI: 命令行工具,使开发者能够通过终端与 LangChain 框架交互,执行项目初始化、测试、部署等任务。提高开发效率,让开发者能够通过简单的命令来管理整个应用程序的生命周期。
- LangServe: 部署服务,用于将 LangChain 应用程序部署到云端,提供可扩展、高可用的托管解决方案,并带有监控和日志功能。简化部署流程,让开发者可以专注于应用程序的开发,而不必担心底层的基础设施和运维工作。
- LangSmith: 开发者平台,专注于 LangChain 应用程序的开发、调试和测试,提供可视化界面和性能分析工具,旨在帮助开发者提高应用程序的质量,确保它们在部署前达到预期的性能和稳定性标准。
大模型开发
大模型开发是指开发以大语言模型为功能核心、通过大语言模型的强大理解能力和生成能力、结合特殊的数据或业务逻辑来提供独特功能的应用。
在大模型开发中,往往不会选择改动模型,而是将大模型作为一个调用工具,通过 Prompt Engineering、数据工程、业务逻辑分解等手段来充分发挥大模型能力,适配应用任务,不会将精力聚焦在优化模型本身上。
这是大模型的开发要素图:

同时大模型开发与传统 AI 开发在整体思路和评估思路上有很大不同:
传统AI开发 | 大模型开发 | |
---|---|---|
整体思路 | 首先需要将非常复杂的业务逻辑依次拆解,对于每一个子业务构造训练数据与验证数据,对于每一个子业务训练优化模型,最后形成完整的模型链路来解决整个业务逻辑 | 用 Prompt Engineering 来替代子模型的训练调优,通过 Prompt 链路组合来实现业务逻辑,用一个通用大模型 + 若干业务 Prompt 来解决任务。 |
评估思路 | 需要首先构造训练集、测试集、验证集,通过在训练集上训练模型、在测试集上调优模型、在验证集上最终验证模型效果来实现性能的评估。 | 从实际业务需求出发构造小批量验证集,设计合理 Prompt 来满足验证集效果。然后,将不断从业务逻辑中收集当下 Prompt 的 Bad Case,并将 Bad Case 加入到验证集中,针对性优化 Prompt,最后实现较好的泛化效果。 |


大模型开发的一般流程
大模型开发分为确定目标,设计功能,搭建整体架构,搭建数据库,Prompt Engineering,验证迭代,前后端搭建,体验优化八个步骤:

- 确定目标:在进行开发前,我们首先需要确定开发的目标,即要开发的应用的应用场景、目标人群、核心价值。对于个体开发者或小型开发团队而言,一般应先设定最小化目标,从构建一个 MVP(最小可行性产品)开始,逐步进行完善和优化。
- 设计功能:在确定开发目标后,需要设计本应用所要提供的功能,以及每一个功能的大体实现逻辑。同样,对于个体开发者或小型开发团队来说,首先要确定应用的核心功能,然后延展设计核心功能的上下游功能(例如,我们想打造一款个人知识库助手,那么核心功能就是结合个人知识库内容进行问题的回答,那么其上游功能的用户上传知识库、下游功能的用户手动纠正模型回答就是我们也必须要设计实现的子功能)。
- 搭建整体架构:目前,绝大部分大模型应用都是采用的特定数据库 + Prompt + 通用大模型的架构。我们需要针对我们所设计的功能,搭建项目的整体架构,实现从用户输入到应用输出的全流程贯通。一般来说,我们推荐基于 LangChain 框架进行开发,LangChain 提供了 Chain、Tool 等架构的实现,进行个性化定制,实现从用户输入到数据库再到大模型最后输出的整体架构连接。
- 搭建数据库:个性化大模型应用需要有个性化数据库进行支撑。由于大模型应用需要进行向量语义检索,一般使用诸如 Chroma 的向量数据库。在该步骤中,我们需要收集数据并进行预处理,再向量化存储到数据库中。数据预处理一般包括从多种格式向纯文本的转化,例如 PDF、MarkDown、HTML、音视频等,以及对错误数据、异常数据、脏数据进行清洗。完成预处理后,需要进行切片、向量化构建出个性化数据库。
- Prompt Engineering:优质的 Prompt 对大模型能力具有极大影响,我们需要逐步迭代构建优质的 Prompt Engineering 来提升应用性能。在该步中,我们首先应该明确 Prompt 设计的一般原则及技巧,构建出一个来源于实际业务的小型验证集,基于小型验证集设计满足基本要求、具备基本能力的 Prompt。
- 验证迭代:验证迭代在大模型开发中是极其重要的一步,一般指通过不断发现 Bad Case 并针对性改进 Prompt Engineering 来提升系统效果、应对边界情况。在完成上一步的初始化 Prompt 设计后,我们应该进行实际业务测试,探讨边界情况,找到 Bad Case,并针对性分析 Prompt 存在的问题,从而不断迭代优化,直到达到一个较为稳定、可以基本实现目标的 Prompt 版本。
- 前后端搭建:完成 Prompt Engineering 及其迭代优化之后,我们就完成了应用的核心功能,可以充分发挥大语言模型的强大能力。接下来我们需要搭建前后端,设计产品页面,让我们的应用能够上线成为产品。
- 体验优化:在完成前后端搭建之后,应用就可以上线体验了。接下来就需要进行长期的用户体验跟踪,记录 Bad Case 与用户负反馈,再针对性进行优化即可。
搭建LLM项目的流程简析
1)项目规划和需求分析
1.项目目标:基于个人知识库的问答助手
2.核心功能
- 将爬取并总结的 MarkDown 文件及用户上传文档向量化,并创建知识库
- 选择知识库,检索用户提问的知识片段
- 提供知识片段与提问,获取大模型回答
- 流式回复
- 历史对话记录
3.确定技术架构和工具
- 框架:LangChain
- Embedding 模型:GPT、智谱、M3E
- 数据库:Chroma
- 大模型:GPT、讯飞星火、文心一言、GLM 等
- 前端:Gradio 和 Streamlit
4.数据准备与向量知识库构建
本项目实现原理如下图所示:
加载本地文档 -> 读取文本 -> 文本分割 -> 文本向量化 -> question 向量化 -> 在文本向量中匹配出与问句向量最相似的 top k 个 -> 匹配出的文本作为上下文和问题一起添加到 Prompt 中 -> 提交给 LLM 生成回答。

-
收集和整理用户提供的文档
用户常用文档格式有 PDF、TXT、MD 等 ,我们可以使用 LangChain 的文档加载器模块方便地加载用户提供的文档,或者使用一些成熟的 Python 包进行读取。由于目前大模型使用 token 的限制,我们需要对读取的文本进行切分,将较长的文本切分为较小的文本,这时一段文本就是一个单位的知识。
-
将文档词向量化
使用==文本嵌入(Embeddings)技术==对分割后的文档进行向量化,使语义相似的文本片段具有接近的向量表,然后,存入向量数据库,完成 ==索引(index)==的创建。利用向量数据库对各文档片段进行索引,可以实现快速检索。
-
将向量化后的文档导入 Chroma 知识库,建立知识库索引
LangChain 集成了超过 30 种不同的向量数据库。其中,Chroma 是一个轻量级的向量数据库,数据存储在内存中,具备快速启动和易于上手的特点,非常适合快速开发和测试场景。
将用户知识库内容经过 Embedding 存入向量数据库,然后用户每一次提问也会经过 Embedding,利用向量相关性算法(例如余弦算法)找到最匹配的几个知识库片段,将这些知识库片段作为上下文,与用户问题一起作为 Prompt 提交给 LLM 回答。
-
大模型集成与 API 连接
- 集成 GPT、星火、文心、GLM 等大模型,配置 API 连接。
- 编写代码,实现与大模型 API 的交互,以便获取问题回答。
-
核心功能实现
- 构建 Prompt Engineering,实现大模型回答功能,根据用户提问和知识库内容生成回答。
- 实现流式回复,允许用户进行多轮对话。
- 添加历史对话记录功能,保存用户与助手的交互历史。
-
核心功能迭代优化
- 进行验证评估,收集 Bad Case。
- 根据 Bad Case 迭代优化核心功能实现。
-
前端与用户交互界面开发
- 使用 Gradio 和 Streamlit 搭建前端界面。
- 实现用户上传文档、创建知识库的功能。
- 设计用户界面,包括问题输入、知识库选择、历史记录展示等。
-
部署测试与上线
- 部署问答助手到服务器或云平台,确保可在互联网上访问。
- 进行生产环境测试,确保系统稳定。
- 上线并向用户发布。
-
维护与持续改进
- 监测系统性能和用户反馈,及时处理问题。
- 定期更新知识库,添加新的文档和信息。
- 收集用户需求,进行系统改进和功能扩展。
整个流程将确保项目从规划、开发、测试到上线和维护都能够顺利进行,为用户提供高质量的基于个人知识库的问答助手。