LangChain 的核心知识体系

📅 2026/6/27 10:44:49
LangChain 的核心知识体系
核心知识点一LangChain 表达式语言 (LCEL) —— 数据流的艺术这是整个 LangChain 框架的基石和灵魂。如果你不理解 LCEL你将永远停留在“调用函数”的层面而无法领会“构建系统”的乐趣。1. 核心思想声明式与可组合性 (Declarative Composable)详细解释LCEL 的核心是让你从命令式编程“第一步做什么第二步做什么…”转向声明式编程“我声明一个数据处理流程它由 A、B、C 几个阶段组成”。你定义的是“what to do”做什么而不是“how to do”具体怎么一步步做。为什么重要因为声明的“流程”Chain本身就是一个独立的、可复用的组件。你可以将一个复杂的 RAG 链作为一个整体嵌入到另一个更宏大的 Agent 链中作为它的一个工具。这种“可组合性”带来了无限的可能性。扩展知识这个思想借鉴了函数式编程和 Unix 哲学中的管道Pipes and Filters架构。理解这一点有助于你更好地设计解耦、可维护的复杂链。2. 标准化接口Runnable 协议详细解释LCEL 的魔力来自于它强制所有核心组件模型、提示、解析器、检索器都遵循一套共同的接口即Runnable协议。这套协议就像是“集装箱标准”规定了每个组件都必须具备.invoke(),.stream(),.batch()等核心能力。invokevs.streamvs.batch的权衡.invoke()调用最简单的方式一次性发起请求并等待完整结果。适用于后台任务、数据处理等非实时场景。.stream()流式持续地、一块一块地返回结果。这是构建任何交互式应用如聊天机器人的必需品因为它能极大地改善用户体验避免长时间的等待白屏。.batch()批量将多个输入打包成一次请求发送出去。这在处理大量数据时能显著提高效率、降低 API 调用开销。例如对 100 篇文档进行摘要使用 batch 会比循环调用 invoke 快得多。扩展知识LCEL 还能自动处理异步操作.ainvoke,.astream等。在构建高并发应用如一个面向多用户的 Web 服务时异步处理能力是至关重要的它可以防止 I/O 操作如等待 LLM 响应阻塞整个服务。3. 并行执行RunnableParallel详细解释当你写下{context: retriever, question: RunnablePassthrough()}这样的字典结构时LCEL 会自动启用并行处理。它会同时执行retriever的检索操作和RunnablePassthrough的数据传递操作。为什么重要在复杂的链中很多数据准备步骤可以并行进行。例如除了检索 RAG 的上下文你可能还需要并行地调用一个 API 获取用户信息。通过并行化你可以将总耗时从“所有步骤耗时之和”缩短为“最长那条路径的耗时”。扩展知识这实际上是“Map-Reduce”思想的一种简化体现。Map阶段并行处理多个输入分支Reduce阶段将它们的结果汇集到一个字典中供下一步使用。核心知识点二检索增强生成 (RAG) —— 模型的外部大脑RAG 是目前 LLM 应用中最成熟、最广泛的范式。掌握其深层原理是区分入门和进阶的关键。1. 核心权衡分割 (Splitting) 的艺术详细解释如何将文档切分成块Chunks是 RAG 效果好坏的第一个决定性因素。这背后有一对核心的矛盾块太小语义信息不完整。例如一个段落被拦腰截断后半段的关键信息丢失了导致检索命中但上下文不足。块太大包含太多无关噪声。一个大的文档块可能只有一句话与问题相关但整个块都被提交给 LLM这不仅浪费了宝贵的上下文窗口还可能干扰 LLM 的注意力。关键参数与策略chunk_size块的大小。chunk_overlap块之间的重叠。设置合理的重叠可以确保完整的句子或段落不会在块的边界被切断。策略不能无脑地按固定字数分割。更好的方法是按结构分割例如按段落、标题、Markdown 的分割符---等。RecursiveCharacterTextSplitter就是尝试按这个逻辑工作的。扩展知识语义分割 (Semantic Splitting)是一种更先进的方法。它利用 embedding 模型来判断文本的语义边界在“意思”发生转变的地方进行切割这通常能产生质量更高的文本块。2. 核心挑战检索的准确性与召回率详细解释向量搜索的本质是“相似性”搜索但语义相似不完全等于答案相关。这是 RAG 应用开发者遇到的最常见问题。提升检索质量的技术图谱高级 RAG查询转换 (Query Transformation)改造用户的原始问题使其更适合检索。多路查询 (Multi-Query)将一个复杂问题“A 和 B 哪个好”分解成多个简单问题“A 的优点是什么”、“B 的优点是什么”分别去检索。重写查询 (Rewrite)在对话中用户可能会问“它怎么样”需要将这个问题结合历史记录重写成“XX 产品的性能怎么样”再进行检索。重新排序 (Re-ranking)检索是一个两阶段过程。第一阶段向量搜索追求“召回率”把所有可能相关的都找回来速度快但可能不准。第二阶段重排追求“精确率”从找回来的里面挑出最相关的使用更精细的模型对初步结果进行二次打分排序。混合搜索 (Hybrid Search)传统的关键词搜索如 BM25在处理专业术语、缩写词时仍然有优势。混合搜索结合了“关键词搜索”和“向量搜索”的结果取长补短是目前最稳健的检索方案之一。扩展知识评估 RAG 系统不能只看最终答案。你需要建立一套评估体系分别评估检索阶段Context Precision/Recall和生成阶段Answer Faithfulness/Relevancy这样才能定位到系统的瓶ăpadă在哪。LangSmith 的评估功能就是为此设计的。核心知识点三Agent —— 赋予模型决策与行动的能力Agent 是 LLM 应用的“天花板”它让模型从一个被动的应答者变成了主动的任务执行者。1. 核心逻辑决策循环与模型角色详细解释Agent 的核心思想是将 LLM 的角色从“答案生成器”转变为“决策引擎”。在一个 Agent 循环中LLM 的每一次调用其目标都不是直接回答用户而是决定下一步的“行动”Action。决策循环的要素规划 (Planning)LLM 根据用户目标和当前状态分解任务并制定计划。工具使用 (Tool Use)LLM 从可用工具集中选择最合适的工具并生成调用它所需的参数。观察 (Observation)LLM 接收工具执行后的结果。反思 (Reflection)LLM 评估上一步的结果是否让它离最终目标更近了并根据反思调整下一步的规划。扩展知识不同的 Agent 类型其决策循环的复杂程度不同。简单的 ReAct Agent 可能只做一步思考而更复杂的 Plan-and-Execute Agent 会先生成一个完整的计划再逐一执行。2. 核心技术演进从 ReAct 到 Tool Calling详细解释这是 Agent 实践中最重要的一个技术分水岭。ReAct (Text-based)依赖 LLM 输出特定格式的文本来表达其意图。你需要精心设计 Prompt告诉 LLM“如果你想用工具就输出 ‘Action: [工具名], Action Input: [参数]’ 这样的文字。” 这非常脆弱容易被模型的微小变化破坏。Tool Calling / Function Calling (Structured)依赖 LLM 的原生能力来输出结构化的JSON对象。你不再教模型“如何说话”而是向模型“注册”可用的函数及其 API 规格。模型会直接返回一个意图清晰的 JSON 指令如{tool: search, args: {query: ...}}。为什么 Tool Calling 是未来它更可靠、更高效可以并行调用多工具并且使 Prompt 的编写大大简化。选择支持 Tool Calling 的新模型是构建健壮 Agent 的前提。3. Tool 设计的艺术详细解释一个好的工具其描述 (description)和参数定义比其内部实现的代码更重要。因为 LLM 就是通过阅读这个“API 文档”来理解工具的功能和使用方法的。最佳实践描述要清晰、具体不要写“搜索工具”而要写“用于在互联网上搜索最新信息的工具”。原子性一个工具只做一件事并把它做好。参数要明确使用类型提示Type Hinting和清晰的参数描述例如query: str # 要搜索的关键词。扩展知识你可以让 Agent 拥有一系列“元工具”例如一个能“列出所有可用工具并阅读其描述”的工具这能让 Agent 在面对未知任务时动态地学习如何使用自己的能力。核心知识点四Memory —— 跨越无状态的鸿沟对话记忆看似简单但在长对话和复杂应用中其设计直接影响成本、性能和用户体验。1. 核心权衡信息保真度 vs. 成本效益详细解释这是一个无法回避的三角难题完整的对话历史 (High Fidelity)提供了最完美的上下文但迅速填满上下文窗口导致成本飙升和性能下降。截断的历史 (Windowed)只保留最近的 N 轮对话成本可控但可能丢失早期的关键信息“我在对话开始时告诉你的我的名字你还记得吗”。总结的历史 (Summarized)用 LLM 对历史进行滚动总结极大地压缩了 Token但可能丢失细节并且总结本身也需要额外的 API 调用成本。选择哪种策略取决于你的应用场景。一个需要精确记住细节的客服机器人可能需要更大的窗口或更复杂的记忆机制。而一个闲聊机器人总结记忆可能就足够了。2. 记忆与 RAG 的结合详细解释在一个有记忆的 RAG 应用中你需要处理两种“历史”对话历史和检索到的文档。如何将它们有效地组合并呈现给 LLM是一个关键的设计点。常见模式在 Prompt 中为两者分配不同的区域并明确指示 LLM“优先根据【检索到的上下文】回答问题如果找不到可以参考【过往对话历史】。” 这可以防止模型在两者之间产生混淆。3. 记忆的管理与作用域详细解释记忆需要与会话 (Session)绑定。你需要一个明确的session_id来区分不同用户或不同对话的上下文。扩展知识:RunnableWithMessageHistory是 LCEL 中处理记忆的最佳实践。它将“记忆的存取逻辑”从数据库加载、回写到数据库与你的核心业务逻辑RAG 链、Agent 链完全解耦。这意味着你可以轻松地将记忆的后端从一个简单的内存字典切换到一个生产级的 Redis 或数据库而无需修改任何核心业务代码。掌握以上这些核心知识点你将建立起对 LangChain 深入且系统的理解从而能够设计和构建出真正强大、健壮且可维护的 LLM 应用。