
RAG 开发‑01 LangChain 简介 笔记1. LangChain 基础介绍诞生由 Harrison Chase 于2022 年 10 月创建定位围绕大语言模型 LLM 构建的 Python 第三方开发框架关键点LangChain 本身不开发大模型核心理念为各式各样 LLM 提供统一通用接口将 LLM 相关各类组件 “链接” 串联起来降低复杂 LLM 应用的开发难度快速搭建 LLM 业务应用地位做 RAG 检索增强生成的主力开发框架2. LangChain 六大核心模块表格模块作用Prompts提示词优化提示词工程模板、Few‑Shot 等Models统一调用各类大模型通义千问、GPT、本地 Ollama 等History会话记忆管理聊天历史记录实现多轮对话Indexes文档索引文档加载、切分、向量化、文档分析管理RAG 核心模块Chains执行链把多个组件拼接串联按流水线顺序执行业务逻辑Agent智能体让大模型自主思考、调用工具、完成复杂任务3. 总结LangChain 是 LLM 业务开发的集大成 Python 库提供全套开箱即用 API。覆盖能力提示词工程、模型调用、会话记忆、文档处理、链式执行、Agent 智能体。学习路径后续 RAG 开发全部基于 LangChain 框架完成。通俗理解不用 LangChain自己手写代码处理提示词、文档分割、向量库调用、拼接消息全部从零写。 使用 LangChain直接调用封装好的 API把各个组件 “拼接链接”快速实现 RAG、聊天机器人、智能体。RAG 开发‑02 LangChain 的环境部署 笔记1、需要安装的包安装命令推荐使用清华镜像源下载更快bashpip install langchain langchain-community langchain-ollama dashscope chromadb -i https://pypi.tuna.tsinghua.edu.cn/simple表格包名作用langchainLangChain 核心包基础能力langchain‑community社区扩展包对接阿里云通义千问等第三方模型需要该包langchain‑ollamaOllama 对接包调用本地 Ollama 部署大模型dashscope阿里云通义千问官方 Python SDKchromadb轻量级本地向量数据库RAG 用来存储向量2、安装校验命令行输入python进入 python 交互环境执行导入python运行import langchain没有报错代表环境安装成功。3、常见小提示镜像源-i https://pypi.tuna.tsinghua.edu.cn/simple解决国内 pip 下载慢、超时问题。建议使用虚拟环境防止包版本冲突。版本课程使用langchain‑1.2.1、langchain‑community‑0.4.1。导入不报错不等于全部功能可用后续用到对应模块缺包时再补装。RAG 介绍 课程笔记一、什么是 RAGRAGRetrieval‑Augmented Generation检索增强生成公式RAG 检索技术 LLM 提示含义从外部数据源检索相关信息补充给大模型修正、完善模型回答。二、原生大模型存在 4 大痛点知识滞后模型训练完成后知识固定不会自动更新领域知识不足训练数据多为公开互联网数据缺少企业内部、专业私有知识幻觉问题输出看起来合理、实际错误的编造内容数据安全私有内部数据不能直接喂给公有大模型✅ RAG 对应的解决能力加载私有 / 领域知识库支持实时最新文档减少幻觉降低生成不确定性提升数据安全性对比微调 Fine‑tuningRAG不需要重训模型只更新知识库成本更低、迭代更快。三、RAG 两条工作主线离线准备线索引 Indexing知识库预处理提前执行一次处理多次使用文档/私有知识加载 → 文本分割(chunk) → 向量化(Embedding) → 存入向量数据库在线服务线检索 生成用户提问时实时跑用户每一次问答都会走用户提问 → 检索环节 → Prompt融合(问题检索到的上下文) → LLM生成回答四、RAG 三大标准阶段1. 索引阶段 Indexing离线加载各类文档文件提取文档文本内容文本切分生成文本块chunk对 chunk 做 Embedding 文本向量化将向量 原始文本存入向量数据库2. 检索阶段 Retriever在线用户问题query做向量化在向量库做相似度匹配取出最相似的top_k个文本块3. 生成阶段 Generation在线把检索出来的上下文片段 用户原始问题拼接组装到 Prompt将完整 Prompt 交给大模型输出答案五、核心本质大模型本质只做输入→输出。RAG 的本质在输入大模型之前做加工把检索拿到的参考资料塞到 prompt 输入里不给模型凭空记忆的机会。六、RAG 核心价值解决知识时效性接入最新文档不用重训模型回答与时俱进降低大模型幻觉回答依托检索到的真实资料减少编造成本优于微调更新知识只改知识库不用训练权重效率高支持私有内部知识库保护业务数据面试简答版可以背RAG 分为离线索引、在线检索、生成三个阶段。离线把文档加载、切分、向量化存入向量库用户提问时问题向量化检索相似片段把片段和问题一起封装进 Prompt 交给 LLM 输出。主要解决大模型知识过时、领域知识缺失、幻觉问题对比微调不需要训练模型成本更低。RAG 开发‑04 向量的基础概念笔记一、向量库在 RAG 中的位置RAG 分为离线流程索引、在线流程检索 生成两大阶段向量库是核心存储节点。离线流程索引阶段知识 / 文档信息 → 向量嵌入向量化 → 存入向量库文档处理链路知识库 (书籍 / 文档 / 报告) → 提取文本字符串 → 切分 chunk 文本块 → 向量嵌入 → 写入向量库在线流程检索 生成阶段用户提问 → 向量嵌入向量化 → 向量库做相似度匹配用户问题链路用户输入问题 → 向量化得到问题向量 → 和向量库内向量做相似匹配召回 Top‑K 相关文本块 → 把原始问题 召回参考片段组装成 Prompt → 交给大模型 LLM 输出最终回答。二、向量 (Vector) 是什么向量文本的数学身份证把一段文本的语义信息转换成一串固定长度数字列表让计算机可以读懂语义做相似度计算。作用让计算机判断两段文字是不是同一个意思不看字面看语义。示例“如何快速学习 RAG”“RAG 如何快速学会” 两句话字面不一样语义一致生成出来的向量数字序列很接近。三、向量嵌入生成向量向量嵌入文本→向量的转换过程依靠文本嵌入模型完成例text‑embedding‑v1。原理深度学习模型抽取文本语义特征输出固定长度数字序列。四、向量相似度计算余弦相似度拿到两段文本的向量使用余弦相似度算法计算语义相似程度。相似度取值范围0~1越接近 1 代表语义越相似。 例子A如何快速学打篮球 → [0.2,0.5,0.8]B打篮球怎么学得快 → [0.18,0.52,0.79]C运动后吃什么好呢 → [0.9,0.1,0.2] 计算结果A 与 B 相似度0.999789语义高度接近A 与 C 相似度0.361446语义不相关五、向量维度向量维度代表描述文本的抽象语义特征数量每一维数字代表文本在该语义特征上的得分 / 强度。 举例3 维向量情绪、动作、倾向 3 个特征1536 维向量 (text‑embedding‑v1 输出)1536 个抽象语义特征维度权衡✅维度越高保存语义信息越丰富语义匹配精度越高❌维度越高存储、计算、检索开销变大性能压力上升工程选择精度和性能之间做权衡1536 维是工业常用选择六、核心知识点总结向量文本语义转为固定长度数字数组计算机用来做语义比对。向量生成嵌入文本嵌入模型text‑embedding‑v1。向量比对余弦相似度算法数值越靠近 1 语义越像。向量维度语义特征数量维度↑精度↑存储计算开销↑1536 维常用。RAG 完整链路文档加载→切分 chunk→embedding 向量化→入库用户 query 向量化→向量库相似度检索召回→拼接 prompt→LLM 生成答案。⭐面试简答版方便背诵问什么是文本向量 /embedding 答文本向量是文本的数学身份证通过嵌入模型把文本语义转为定长数字列表。语义相近文本向量数值接近我们使用余弦相似度计算向量相似度。向量维度代表语义特征数量维度越高语义表达越强但存储计算成本上升。在 RAG 中文档切分 chunk 后转向量存入向量库用户查询也转向量检索召回语义相关片段辅助大模型回答。余弦相似度 课程笔记一、概念余弦相似度忽略向量长度只看向量在高维空间的方向夹角夹角越小向量越相似。RAG 场景文本会转为向量余弦相似度用来判断两段文本语义是否相近。值范围[-1,1]1方向完全相同最相似0方向垂直完全无关-1方向完全相反二、公式\(cosine\ similarity(\vec A,\vec B)\frac{\vec A \cdot \vec B}{||\vec A|| \times ||\vec B||}\)点积分子两个向量同维度相乘全部累加\(dot A_0*B_0 A_1*B_1 ...A_n*B_n\) 2.模长分母部分单个向量每个维度平方求和再开根号\(||vec||\sqrt{vec_0^2vec_1^2...vec_n^2}\) 3. 余弦相似度 点积 ÷ (向量 A 模长 × 向量 B 模长)示例向量 A[0.5,0.5]向量 B[0.7,0.7]点积 0.5*0.7 0.5*0.7 0.7A 模长 \(\sqrt{0.5^20.5^2}\)B 模长 \(\sqrt{0.7^20.7^2}\)余弦相似度 \(0.7 \div (\sqrt{0.5^20.5^2} * \sqrt{0.7^20.7^2}) 1.0\)代表方向完全一致。三、RAG 中的意义文本 Embedding 之后得到向量余弦相似度用来做向量检索找出知识库中和用户问题语义最接近的片段。只关心语义方向不关心向量的长度大小。四、完整可运行代码python运行import numpy as np def get_dot(vec_a, vec_b): 计算2个向量的点积2个向量同维度数字乘积之和 if len(vec_a) ! len(vec_b): raise ValueError(2个向量必须维度数量相同) dot_sum 0 for a, b in zip(vec_a, vec_b): dot_sum a * b return dot_sum def get_norm(vec): 计算单个向量的模长对向量的每个数字求平方在求和在开根号 sum_square 0 for v in vec: sum_square v * v # numpy sqrt函数完成开根号 return np.sqrt(sum_square) def cosine_similarity(vec_a, vec_b): 余弦相似度2个向量的点积 除以 2个向量模长的乘积 result get_dot(vec_a, vec_b) / (get_norm(vec_a) * get_norm(vec_b)) return result if __name__ __main__: vec_a [0.5, 0.5] vec_b [0.7, 0.7] vec_c [0.7, 0.5] vec_d [-0.6, -0.5] print(ab:, cosine_similarity(vec_a, vec_b)) print(ac:, cosine_similarity(vec_a, vec_c)) print(ad:, cosine_similarity(vec_a, vec_d))运行输出plaintextab: 0.9999999999999999 ac: 0.9863939238321437 ad: -0.9961537343407902ab 输出接近 1代表向量 A 和 B 同向ad 接近‑1 代表方向几乎相反。易错坑点代码中括号不能写错python运行# ❌错误写法运算优先级出错 result get_dot(vec_a, vec_b) / get_norm(vec_a) * get_norm(vec_b) # ✅正确写法分母是两个模长相乘必须括号包裹 result get_dot(vec_a, vec_b) / (get_norm(vec_a) * get_norm(vec_b))RAG 开发‑06 LangChain 调用大语言模型 笔记⭐星级★★★ 分值10 分一、LangChain 三类模型LangChain 提供统一接口支持 3 大类模型LLMs大语言模型Transformer 架构大参数量面向文本生成输入字符串输出字符串。注意qwen‑max属于 LLMqwen3‑max属于 ChatModel 聊天模型不要混用。Chat Models聊天模型在 LLM 基础上专门优化对话轮次交互面向聊天对话场景。Embeddings Models嵌入模型接收文本输入输出文本向量用于 RAG 检索。第三方模型实现大多放在langchain_community包。 Ollama 本地模型独立包langchain_ollama。二、两个模型源下载地址HuggingFacehttps://huggingface.co/modelsModelScope 魔搭https://modelscope.cn/models三、核心 APImodel.invoke(input你的问题)同步调用模型传入字符串 prompt返回模型生成文本。四、可运行完整代码1调用阿里云通义千问 LLMqwen‑max前置安装依赖pip install langchain‑community dashscope环境变量配置DASHSCOPE_API_KEY阿里云 API‑KEYpython运行# 02LangChain访问阿里云通义千问大模型.py from langchain_community.llms.tongyi import Tongyi # 实例化LLM对象qwen‑max是大语言模型不要传qwen3‑max(聊天模型) model Tongyi(modelqwen-max) # invoke方法发起提问 res model.invoke(input你是谁呀能做什么) # 打印结果 print(res)2调用 Ollama 本地 LLMqwen3:4b前置安装依赖pip install langchain‑ollama本地 Ollama 软件必须启动执行过ollama pull qwen3:4b拉取模型python运行# 03LangChain访问Ollama本地模型.py from langchain_ollama import OllamaLLM # 实例化本地Ollama模型对象 model OllamaLLM(modelqwen3:4b) # invoke调用 res model.invoke(input你是谁呀能做什么) print(res)五、关键注意点包来源区分通义千问 LLMlangchain_community.llms.tongyi.TongyiOllama 本地 LLMlangchain_ollama.OllamaLLM模型名称区分qwen‑maxLLM 大语言模型qwen3‑maxChat 聊天模型二者不能混用。Ollama 运行前提Ollama 服务后台运行模型已经提前 pull 下载否则报错。统一调用方式实例化模型对象后一律用.invoke(inputxxx)做推理。面试简答记忆点LangChain 对各种大模型做了封装对外提供统一 invoke 接口 云模型来自 langchain_communityOllama 本地模型来自 langchain_ollama LLM 输入输出都是原始字符串ChatModel 是消息对象。调用大模型LangChain 视角调用大模型核心就两步创建大模型实例指定模型、api‑key、参数完成模型对象初始化调用invoke()方法执行传入输入内容发起请求拿到模型返回结果代码示例python运行from langchain_openai import ChatOpenAI # 第一步创建大模型实例 llm ChatOpenAI( modelgpt‑3.5‑turbo, api_key你的key, temperature0.7 ) # 第二步invoke() 执行调用传入prompt res llm.invoke(讲一个简短小故事) print(res.content)补充小知识点invoke()是 LangChain 标准统一调用接口不管是 chat 模型、普通 LLM、Chain 都用invoke()返回值不是字符串是消息对象需要.content取出文本结果老版本还有predict()/__call__现在官方推荐统一使用invoke()07 LangChain 模型的流式输出 笔记核心知识点 ⭐⭐⭐面试高频LangChain 1.0 基于Runnable统一接口几乎所有组件模型、prompt、chain、检索器都支持下面两套方法invoke()同步一次性调用等待模型全部生成完毕一次性返回完整结果。优点简单直接拿到完整字符串缺点用户需要等待全部生成体验像卡住网页聊天框不会一个字一个字蹦出来stream()流式输出逐段返回生成内容chunk 块返回迭代器可以 for 循环遍历。优点模拟 ChatGPT 打字效果边生成边展示用户体感更快缺点需要循环接收每一小段文本代码多一层 for 循环关键概念chunk模型返回的一小段碎片文本多次 chunk 拼接起来才是完整回答。print 参数解释python运行print(chunk, end, flushTrue)end打印不要换行文字连续输出flushTrue强制刷新缓冲区立刻把文字打印到控制台不要缓存攒一堆再输出模型区分qwen‑maxLLM 大语言模型输出纯文本字符串适合本示例qwen3‑maxChat 聊天模型返回消息对象.content拿文本不要混用流程对比invoke 两步①创建模型实例 ②invoke()→拿到完整结果stream 两步①创建模型实例 ②stream()→拿到迭代器for 循环读取每一块 chunk注意stream 返回的不是最终字符串是可迭代对象必须 for 循环遍历读取。完整可运行代码旧版 community课程原版能跑但是会有弃用警告python运行# 04LangChain的流式输出.py from langchain_community.llms.tongyi import Tongyi # 第一步创建模型实例 model Tongyi(modelqwen-max) # 第二步调用stream 获取流式迭代器 res model.stream(input你是谁呀能做什么) # for循环遍历迭代器取出每一块chunk for chunk in res: print(chunk, end, flushTrue)✨新版无警告代码langchain‑alibaba推荐以后写这个python运行# 先安装依赖pip install langchain-alibaba from langchain_alibaba import Tongyi # 第一步创建模型实例 model Tongyi(modelqwen-max) # 第二步stream流式调用 res model.stream(input你是谁呀能做什么) # 循环打印每一个片段 for chunk in res: print(chunk, end, flushTrue)invoke 和 stream 对照完整示例放一起对比记忆python运行# 04LangChain的流式输出.py from langchain_community.llms.tongyi import Tongyi model Tongyi(modelqwen-max) # -------- invoke 一次性输出 -------- print( invoke一次性输出 ) result model.invoke(简单介绍python) print(result) # -------- stream 流式打字机输出 -------- print(\n stream流式输出 ) stream_res model.stream(简单介绍python) for chunk in stream_res: print(chunk, end, flushTrue)面试简答背诵问LangChain invoke 和 stream 区别 答invoke()一次性调用等待模型全部生成完成返回完整结果适合后台脚本处理。stream()流式调用返回迭代器循环拿到每一段 chunk实现边生成边输出适合前端聊天界面实现打字效果。两者是 Runnable 接口的标准方法模型、Chain、提示词模板都统一支持这两个 API。拓展小补充还有 batch 方法batch([问题1,问题2])批量传入多个问题一次性批量调用多个请求。Runnable 三大方法invoke(单个)、stream(流式)、batch(批量)。08 LangChain 调用聊天模型 ChatModels 笔记⭐⭐⭐⭐ 重点LLM大语言模型 vs ChatModel聊天模型LLMTongyi输入输出都是纯字符串modelqwen‑maxChatModelChatTongyi输入输出是消息对象 Messagemodelqwen3‑max专门用于多轮对话是现在开发主流。三种消息对象langchain_core.messages表格消息类对应 OpenAI 角色作用SystemMessagesystem系统提示设定 AI 角色、规则、背景放在消息列表最前面HumanMessageuser用户发送给 AI 的问题AIMessageassistantAI 历史返回的回答用于多轮上下文记忆messages 是列表按对话顺序存放消息实现多轮对话记忆。 ChatModel 返回的 chunk 不是字符串对象要用.content属性拿到文本内容。Runnable 接口同样生效聊天模型同样支持三大方法invoke(messages)一次性返回完整消息对象stream(messages)流式迭代返回 chunkchunk.content拿文本batch([msg1,msg2])批量请求注意坑写print(chunk)会打印对象必须写print(chunk.content)否则输出一堆对象描述文本。代码 1仅 HumanMessage单轮对话课程原版文件名05LangChain调用聊天模型.pypython运行# 课程原版会有弃用警告可以跑 from langchain_community.chat_models.tongyi import ChatTongyi from langchain_core.messages import HumanMessage # 1.初始化聊天模型 qwen3‑max是聊天模型 chat_model ChatTongyi(modelqwen3-max) # 2.构造消息列表 messages [ HumanMessage(content给我写一首唐诗) ] # 3.stream流式输出 res chat_model.stream(inputmessages) for chunk in res: # .content获取文本内容 print(chunk.content, end, flushTrue)代码 2SystemMessage HumanMessage设定 AI 角色python运行from langchain_community.chat_models.tongyi import ChatTongyi from langchain_core.messages import HumanMessage, SystemMessage chat_model ChatTongyi(modelqwen3-max) messages [ SystemMessage(content你是一名来自边塞的诗人), HumanMessage(content给我写一首唐诗) ] res chat_model.stream(inputmessages) for chunk in res: print(chunk.content, end, flushTrue)代码 3SystemMessage HumanMessage AIMessage模拟多轮上下文AIMessage 用来填入 AI 历史回答让模型参考上一轮输出格式、内容。python运行from langchain_community.chat_models.tongyi import ChatTongyi from langchain_core.messages import HumanMessage, SystemMessage, AIMessage chat_model ChatTongyi(modelqwen3-max) messages [ SystemMessage(content你是一名来自边塞的诗人), HumanMessage(content给我写一首唐诗), AIMessage(content锄禾日当午汗滴禾下土谁知盘中餐粒粒皆辛苦。), HumanMessage(content按照你上一个回复的格式再写一首唐诗。) ] res chat_model.stream(inputmessages) for chunk in res: print(chunk.content, end, flushTrue)✨新版无弃用警告代码langchain‑alibaba推荐工程使用python运行# pip install langchain-alibaba from langchain_alibaba import ChatTongyi from langchain_core.messages import HumanMessage, SystemMessage, AIMessage chat_model ChatTongyi(modelqwen3-max) messages [ SystemMessage(content你是一名来自边塞的诗人), HumanMessage(content给我写一首唐诗) ] res chat_model.stream(inputmessages) for chunk in res: print(chunk.content, end, flushTrue)invoke 完整示例一次性返回对比记忆python运行from langchain_alibaba import ChatTongyi from langchain_core.messages import HumanMessage chat_model ChatTongyi(modelqwen3-max) messages [HumanMessage(content简单介绍LangChain)] # invoke返回完整消息对象 resp_msg chat_model.invoke(inputmessages) # .content取出字符串 print(resp_msg.content)面试简答背诵QLLM 和 ChatModel 有什么区别LLM 输入输出都是普通字符串适合简单单轮调用ChatModel 输入输出是消息对象SystemMessage/HumanMessage/AIMessage天然支持多轮对话上下文ChatModel 调用返回的结果对象需要读取.content属性获取文本内容ChatModel 同样遵循 Runnable 接口支持invoke / stream / batch。易错点总结❌错误print(chunk)打印对象✅正确print(chunk.content)区分模型qwen‑max给 LLMqwen3‑max给 ChatModel不要混用。messages 是列表顺序很重要SystemMessage 一般放列表最前面。