☰
程序员入门大模型:收藏这份基于LangChain的RAG实践指南
2026/10/24 2:28:11 网站建设 项目流程

本文详细介绍了使用LangChain框架实现端到端RAG(检索增强生成)的完整流程,包括文档加载、切分、向量化存储,以及多轮对话检索问答链的构建。同时,通过Langfuse实现LLMOps监控,自动捕获链中每一步的输入输出,帮助开发者快速掌握大模型应用开发技能。

整体框架

应用程序

程序跑起来的样子:

一、文档加载与切分


1.1 多格式加载

针对不同文档格式使用对应的 Loader,保留原始结构与元数据(如页码、来源路径):

# document_processor.pyfrom langchain_community.document_loaders import PyPDFLoader, UnstructuredMarkdownLoaderdef load_document(file_path: str):ext = os.path.splitext(file_path)[1].lower()if ext == ".pdf":loader = PyPDFLoader(file_path) # 逐页加载,自动提取页码到 metadataelif ext == ".md":loader = UnstructuredMarkdownLoader(file_path) # 保留 Markdown 结构else:raise ValueError(f"不支持的文件格式: {ext}")return loader.load()

说明:

  • PDF 使用PyPDFLoader,每页生成一个Document,metadata["page"]自动记录页码
  • Markdown使用UnstructuredMarkdownLoader,可保留标题层级语义
  • 始终验证返回列表非空,避免空文档流入后续流程
  1. 2 递归文本切分

文本切分是影响检索质量的关键环节。使用RecursiveCharacterTextSplitter按语义边界(段落→句子→词)逐级尝试切分:

from langchain_text_splitters import RecursiveCharacterTextSplittersplitter = RecursiveCharacterTextSplitter(chunk_size=1000, # 每块最大字符数chunk_overlap=100, # 相邻块重叠字符数,保留上下文连续性)chunks = splitter.split_documents(docs)# 过滤纯空白块,避免噪声进入向量库chunks = [c for c in chunks if c.page_content.strip()]

关键参数权衡:

参数偏小偏大
chunk_size语义不完整,上下文丢失噪声增多,检索精度下降
chunk_overlap块边界处信息断裂 冗余数据增加向量库膨胀

说明:

  • 中文技术文档推荐chunk_size=800~1200,chunk_overlap=80~150
  • 对结构化文档(表格、列表为主)可适当降低chunk_size
  • 切分后务必过滤空白块,否则会引入无意义的零向量污染检索结果

二、向量化与存储


  1. 1 Embeddings 选型

本项目使用text-embedding-v3模型:

# config.pyfrom langchain_community.embeddings import DashScopeEmbeddingsdef get_embeddings():return DashScopeEmbeddings(model="text-embedding-v3",dashscope_api_key=DASHSCOPE_API_KEY,)

说明:

  • Embeddings 模型与 LLM 的语言偏好应保持一致(中文文档 → 中文 Embeddings)
  • 不同 Embeddings 模型生成的向量不可混用;更换模型后必须重建整个向量库
  1. 2 FAISS 向量库

# vector_store.pyfrom langchain_community.vectorstores import FAISSdef create_vector_store(documents):embeddings = get_embeddings()vector_store = FAISS.from_documents(documents, embeddings)return vector_storedef get_retriever(vector_store, k=3):return vector_store.as_retriever(search_kwargs={"k": k})

FAISS 在内存中构建索引,适合中小规模知识库(万级以内文本块)。as_retriever(search_kwargs={"k": 3})表示每次检索返回相似度最高的 3 个文档块。

最佳实践:

  • k值推荐 3~5;过小会漏掉关键片段,过大则引入噪声,稀释 LLM 的注意力
  • 生产环境中需要将向量库持久化到磁盘,避免重启后重新构建:
vector_store.save_local("faiss_index") # 保存FAISS.load_local("faiss_index", embeddings) # 加载
  • 文档更新时,用 vector_store.add_documents(new_chunks)增量追加,而非全量重建

三、对话检索链


  1. 1 链的工作流程

ConversationalRetrievalChain将多轮对话与向量检索结合,分两步执行:

用户提问 + 对话历史│▼ Step 1: 问题改写[Condense Question LLM]将追问改写为独立的完整问题│▼ Step 2: 检索 + 生成[Retriever] → 相关文档块│[QA LLM] → 最终回答
  1. 2 Prompt 设计

问题改写 Prompt:

_CONDENSE_QUESTION_PROMPT = PromptTemplate.from_template("""根据以下对话历史和后续问题,将后续问题改写为一个独立的问题。对话历史:{chat_history}后续问题: {question}独立问题:""")

QA 回答 Prompt:

说明:

  • QA Prompt 中明确禁止编造是防止幻觉的关键约束
  • 要求 LLM 注明来源,使结果可追溯、可验证
  • 提供明确的兜底回复(“未查询到相关信息”),避免 LLM 在无关文档中强行拼凑答案
  1. 3 链的组装

# qa_chain.pydef create_qa_chain(retriever):llm = get_llm()memory = ConversationBufferWindowMemory(k=5, # 保留最近 5 轮对话memory_key="chat_history",return_messages=True, # 以消息对象格式返回,兼容 Chat 模型output_key="answer", # 只将 answer 字段写入记忆,排除 source_documents)chain = ConversationalRetrievalChain.from_llm(llm=llm,retriever=retriever,memory=memory,condense_question_prompt=_CONDENSE_QUESTION_PROMPT,combine_docs_chain_kwargs={"prompt": _QA_PROMPT},return_source_documents=True, # 返回检索到的原始文档,用于来源标注)return chain

说明:

  • output_key="answer"配合return_source_documents=True时是必填项,否则记忆模块无法识别应写入哪个输出字段
  • return_messages=True使记忆以 ChatMessage对象列表返回,与 Chat 类型 LLM(如 ChatOpenAI)原生兼容;若使用文本补全模型则应设为 False
  • k=5控制记忆窗口;过大会使 Prompt 超过 LLM 上下文长度限制,推荐 3~8
  1. 4 来源标注

检索完成后,从source_documents中提取文件名附加在回答末尾:

def ask(chain, question: str) -> str:result = chain({"question": question}, callbacks=callbacks)answer = result["answer"]source_docs = result.get("source_documents", [])sources = set()for doc in source_docs:source = doc.metadata.get("source", "未知来源")sources.add(source)if sources:source_text = "、".join(sources)if source_text not in answer:answer += f"/n/n📄 来源: {source_text}"return answer

说明:

  • 使用set()对来源去重,避免同一文件被多个 chunk 命中时重复显示
  • 在追加来源前检查 LLM 是否已自行引用,避免重复(if source_text not in answer)

四、LLM 接入


  1. 1 OpenAI 兼容接口(推荐)

使用ChatOpenAI+ 自定义base_url,可无缝接入任何兼容 OpenAI 协议的大模型(如华为云 GLM-5等):

# config.pyfrom langchain_openai import ChatOpenAIdef get_llm():return ChatOpenAI(model=LLM_MODEL_NAME, # 如 "glm-5"api_key=LLM_API_KEY,base_url=LLM_API_BASE, # 如 "https://api.modelarts-maas.com/openai/v1")

说明:

  • 优先使用ChatOpenAI(Chat 模型)而非LLM(文本补全模型),因为前者原生支持消息格式,与ConversationalRetrievalChain的多轮记忆机制兼容性更好
  • 通过环境变量管理凭证,永远不要将 API Key 硬编码进源码
  • 若需要切换模型,只需修改.env中的三个变量,无需改代码

五、可观测性:Langfuse 集成


  1. 1 为什么需要 RAG 可观测性

RAG 系统的质量问题往往难以定位,常见问题包括:

  • 检索阶段返回了不相关文档
  • 改写后的独立问题语义发生偏移
  • LLM 忽略检索结果、产生幻觉

Langfuse 通过 LangChainCallbackHandler自动捕获链中每一步的输入输出,在 Dashboard 中可视化展示完整的 Span 树。

  1. 2 集成方式(Langfuse 3.x)

Langfuse 3.x 通过环境变量自动配置,只需传入CallbackHandler:

# config.py — 环境变量自动读取 LANGFUSE_PUBLIC_KEY / SECRET_KEY / HOSTfrom langfuse.langchain import CallbackHandlerdef get_langfuse_handler():if not LANGFUSE_ENABLED:return Nonereturn CallbackHandler(update_trace=True)# qa_chain.py — 将 handler 注入 chain 调用handler = get_langfuse_handler()callbacks = [handler] if handler else Noneresult = chain({"question": question}, callbacks=callbacks)

必须在.env中配置:

LANGFUSE_PUBLIC_KEY=pk-lf-xxxLANGFUSE_SECRET_KEY=sk-lf-xxxLANGFUSE_HOST=http://your-langfuse-host:3000

最佳实践:

  • 通过LANGFUSE_ENABLED标志(当 key 缺失时自动为False)实现零侵入降级,不影响无 Langfuse 的部署环境
  • Langfuse 3.x 基于 OpenTelemetry,不需要手动调用flush(),trace 由后台线程异步上报
  • update_trace=True会将链的输入/输出自动写入 trace 根节点,方便在 Dashboard 直接查看 Q&A 对

六、配置管理最佳实践


所有运行参数通过环境变量集中管理,代码中无任何硬编码值:

# config.pyload_dotenv() # 从 .env 文件加载CHUNK_SIZE = int(os.getenv("CHUNK_SIZE", "1000")) # 带默认值CHUNK_OVERLAP = int(os.getenv("CHUNK_OVERLAP", "100"))TOP_K = int(os.getenv("TOP_K", "3"))MEMORY_ROUNDS = int(os.getenv("MEMORY_ROUNDS", "5"))

完整.env配置示例:

# LLM(必填)LLM_API_KEY=your_api_keyLLM_API_BASE=https://api.modelarts-maas.com/openai/v1LLM_MODEL_NAME=glm-5# 嵌入向量配置# 使用 'modelarts' 表示华为云 ModelArts bge-m3 嵌入向量EMBEDDINGS_PROVIDER=modelarts# 嵌入向量 API 配置EMBEDDINGS_API_BASE=https://api.modelarts-maas.com/v1EMBEDDINGS_MODEL=bge-m3# 文档处理(可选,有默认值)CHUNK_SIZE=1000CHUNK_OVERLAP=100TOP_K=3MEMORY_ROUNDS=5# Langfuse 可观测性(可选)LANGFUSE_PUBLIC_KEY=pk-lf-xxxLANGFUSE_SECRET_KEY=sk-lf-xxxLANGFUSE_HOST=http://localhost:3000

大模型的知识又多又杂,到底怎么学?

做这行久了,被问最多的问题就一个:大模型的知识又多又杂,我到底先学啥?翻了一堆资料,看啥都像重点,结果啥都没学进去。今天把我自己一路摸出来的顺序捋一遍,零基础、应届生、转行的都适用。跟着走,至少方向不乱、不瞎忙,学完拿得出手。

第一阶段(10天):初阶应用

这一阶段就一个目标:把大模型真正"玩明白",不是只会聊天那种,而是能调教它、能用代码把大模型和业务接起来。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范
  • …
第二阶段(30天):高阶应用

这阶段正式进实战,目标很实在:做出两个能拿出手的东西——一个私有知识库,一个 agent 对话机器人。

  • 为什么要做 RAG

  • 搭建一个简单的 ChatPDF

  • 检索的基础概念

  • 什么是向量表示(Embeddings)

  • 向量数据库与向量检索

  • 基于向量检索的 RAG

  • 搭建 RAG 系统的扩展知识

  • 混合检索与 RAG-Fusion 简介

  • 向量模型本地部署

  • …

走完这 30 天,Python 或 JavaScript 背景的基本能独立做一套 RAG 应用,简历上也敢写"大模型应用开发"了。

第三阶段(约20天):动手微调

学到这,你已经开始 “造” 模型了 —— 通过微调,搞出垂直领域的专用小模型。

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建
  • …

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你从 “只会用” 变成 “能造” 的 AI 小子。那么你还想往下探索吗?

想要入局AI大模型赛道、抢占行业红利的朋友,微信扫描下方CSDN官方认证二维码,即可100%免费领取全套学习资料!

第四阶段(20天):商业闭环,部署落地

技术学完,落地才算数。这阶段带你搞明白大模型怎么真正跑起来、用起来。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案
  • …

想要入坑大模型的朋友,给大家准备了一份2026 年最新 AI 大模型全套学习资料:

1、大模型系统化学习路线

2、大模型学习视频教程

3、大模型学习书籍&电子文档

4、AI大模型最新行业报告

5、大模型项目实战&配套源码

6、2026大模型大厂面试真题

7、为什么要学习大模型?

我国在A大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年,人才缺口已超百万,凸显培养不足。随着AI技术飞速发展,预计到2025年,这一缺口将急剧扩大至400万,严重制约我国AI产业的创新步伐。加强人才培养,优化教育体系,国际合作并进是破解困局、推动AI发展的关键。

8、适合谁学?
  • 传统后端 / Java / 前端开发,想转型 AI 应用
  • 大学生、应届生,想拿更好的 offer
  • 产品经理、运营,想武装职业竞争力
  • 技术负责人,想给团队落地提效

学习是反人性的,但回报是真金白银。技术会更新,赛道会切换,但只要你先动手,机会就永远站在你这边。

9、这些资料真的有用吗?

这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

想要入局AI大模型赛道、抢占行业红利的朋友,微信扫描下方CSDN官方认证二维码,即可100%免费领取全套学习资料!

好了,就写到这。路线是死的,人是活的,卡住了随时来问我。觉得有用就点个收藏,别让它进收藏夹吃灰——动起来比啥都强。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询