当前位置: 首页 > news >正文

RAG 实战:从手写 MVP 链路到生产级优化

摘要:从零手写 LangChain RAG 链路,解析切片策略、混合检索、重排序(Rerank)及向量数据库实战指南。

01 核心能力要求

在 RAG(检索增强生成)的工程落地中,我们不能只停留在“知道概念”的层面。一个合格的 RAG 工程师必须具备以下能力:

  • 基础链路闭环能够手写出完整的:文档加载->切片(Chunking)->向量化(Embedding)->存储(Vector DB)->检索->提示词组装->模型生成
  • 精细化切片策略不盲目按字数切分,掌握语义切分Markdown 标题层级切分
  • 多路召回与重排序理解为什么单一向量检索不够用,如何引入Rerank解决精度问题。
  • 混合检索 (Hybrid Search)能够结合Elasticsearch (BM25)的关键词搜索与Vector的语义搜索。
  • 向量库实战熟练掌握ChromaMilvus的 CRUD 及索引配置。

02 标准 LangChain MVP 实现

(Minimum Viable Product)

以下代码展示了一个最基础的 RAG 流程。

import os from langchain_community.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain_chroma import Chroma from langchain.prompts import ChatPromptTemplate # -------------------------- # 1. 文档加载 (Load) # -------------------------- # 场景:加载一份金融研报 PDF loader = PyPDFLoader("financial_report_2026.pdf") docs = loader.load() # -------------------------- # 2. 切片 (Chunking) # -------------------------- # 策略:按字符递归切分,保留上下文 text_splitter = RecursiveCharacterTextSplitter( chunk_size = 500, # 每一块约500字符 chunk_overlap = 50, # 重叠50字,保证句子不被腰斩 separators = ["\n\n", "\n", "。", "!", "?"] # 优先按段落切 ) splits = text_splitter.split_documents(docs) # -------------------------- # 3. 向量化 & 存储 (Embedding & Vector DB) # -------------------------- # 调用 OpenAI API 将文字转为向量 [0.1, -0.2, ...] vectorstore = Chroma.from_documents( documents = splits, embedding = OpenAIEmbeddings(), persist_directory = "./chroma_db" # 持久化存储 ) # -------------------------- # 4. 检索 (Retrieval) # -------------------------- # 找出最相似的 Top 3 片段 retriever = vectorstore.as_retriever(search_kwargs={"k": 3}) question = "TSLA 2025 Q4的净利润率是多少?" retrieved_docs = retriever.invoke(question) # -------------------------- # 5. 提示词组装 (Prompt Assembly) # -------------------------- template = """你是一个专业的金融分析师。请根据以下研报内容回答问题: {context} 问题:{question} """ prompt = ChatPromptTemplate.from_template(template) # -------------------------- # 6. 模型生成 (Generation) # -------------------------- llm = ChatOpenAI(model="gpt-3.5-turbo") chain = prompt | llm # context 由检索出的 docs 拼接而成 response = chain.invoke({ "question": question, "context": "\n\n".join([doc.page_content for doc in retrieved_docs]) }) print(response.content)

03 进阶:RAG 效果不好怎么办?

这是面试和实战中最常见的问题。我们通常从以下三点入手优化:

1. 优化切片策略 (Chunking Strategy)

  • 🔴 痛点

    死板地按 500 字切分,容易把“2025年营收:”切在上一段,而把具体的“100亿”切在下一段。检索时上下文丢失,导致大模型幻觉

  • 🟢 解决方案

  • 语义切分 (Semantic Chunking)

    利用 Embedding 计算前后句子的相似度,意思连贯时不切,突变时才切。

  • Markdown 标题切分

    按照# 一、财务摘要## 1.1 营收这种层级切分。检索时,内容会带上财务摘要 > 营收的元数据,极大地提高了上下文准确度。

2. 混合检索 (Hybrid Search)

  • 🔴 痛点
  • 向量检索 (Dense)

    擅长搜概念(搜“水果”能召回“苹果”)。

  • 关键词检索 (Sparse/BM25)

    擅长搜专有名词(搜股票代码“600519”,向量可能不准,但关键词匹配不仅准而且快)。

  • 🟢 解决方案

如果用户问“600519的代码是多少?”,这就需要结合 Elasticsearch (BM25) 和 Chroma (Vector) 的结果,加权输出

参考公式:Final Score = 0.7 * Vector_Score + 0.3 * BM25_Score

3. 重排序 (Rerank)

  • 🔴 痛点

    初步检索出的 Top 5 内容,可能混入了只包含关键词但语义无关的噪音。

  • 🟢 解决方案

    采用Two-Stage Retrieval(两阶段检索)

  1. 粗排

    用向量库快速召回 50 条相关片段(速度快,精度一般)。

  2. 精排

    使用 Cross-Encoder (如bge-reranker) 对这 50 条进行精细打分,选出 Top 5 给大模型。效果:虽然增加了约 200ms 耗时,但准确率会有质的飞跃。

04 向量数据库 (Chroma) 实战速查

1. 创建/读取集合

import chromadb client = chromadb.PersistentClient(path="./db") collection = client.get_or_create_collection(name="finance_reports")

2. Upsert (更新或插入)

⚠️注意:必须指定唯一的ids,否则数据会重复堆积。

collection.upsert( documents=["苹果公司Q3营收上涨...", "特斯拉销量下跌..."], metadatas=[{"source": "report1.pdf"}, {"source": "report2.pdf"}], ids=["doc1", "doc2"] )

3. Query (查询)

results = collection.query( query_texts=["特斯拉销量怎么样?"], n_results=2 )

05 深度 Q&A:工程化避坑指南

Q1:PDF 里的表格怎么处理?

直接用 PyPDFLoader 加载表格会变成乱码,语义全毁。

实战解法: 使用pdfplumberUnstructured库。检测到表格结构时,将其提取并转化为 Markdown 格式(如| 科目 | 金额 |),再进行 Embedding。这样向量模型就能理解这是结构化数据,而不是乱码。

Q2:加了 Rerank 速度变慢怎么办?

Rerank 确实会增加 300ms-500ms 的延迟。

优化策略

  1. 限制数量

    初筛 50 条,Rerank 只排前 10 条。

  2. 流式输出 (Streaming)

    后端拿到 LLM 第一个 token 就通过 SSE 推送给前端。用户看到字在蹦,心理等待感会降低很多。

Q3:怎么证明 RAG 变准了?

不能靠感觉,要靠数据。

评估方法: 构建一个包含 50 个高频问题的“金标准测试集”。每次优化策略后,运行脚本计算“召回率 (Recall)”(即 Top 3 结果里是否包含正确答案)。只有召回率提升(如从 60% -> 80%)时,才上线新代码。

Q4:怎么解决“上下文断裂”问题?

比如“茅台营收”这句话,一半在 Chunk A 结尾,数字在 Chunk B 开头。

实战配置: 利用chunk_overlap(切片重叠)。配置Chunk Size = 500, Overlap = 50~100。这样 Chunk B 的开头会重复 Chunk A 的结尾,保证关键信息(主语+数字)完整出现在至少一个 Chunk 中。

Q5:流程这么长,怎么优化 Latency?

如果用户等 10 秒,体验就崩了。

三层优化

  1. 体验层

    全链路流式输出 (Streaming/SSE)。

  2. 架构层

    向量检索和 BM25 并行执行;Rerank 后只选 Top 3 给大模型(减少 Input Token)。

  3. 兜底层

    引入 Redis 语义缓存。如果问题被问过,直接返回缓存答案,耗时仅需 0.1s。

学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

http://www.jsqmd.com/news/504078/

相关文章:

  • Wemod-Patcher开源工具:免费解锁游戏修改高级功能的完整方案
  • FT32F030F6AP7高性能32位RISC内核MCU解析(兼容STM32F030K6TP7)
  • C#与西门子PLC通讯上位机软件:全系列PLC以太网S7通讯实现与数据监控
  • Detectron2 0.5升0.6实战:模型兼容性验证与CUDA报错解决方案
  • FPGA设计实战:利用MATLAB的Fixed-Point Tool优化Simulink模型(最新版教程)
  • 程序员必备的5个宝藏导航网站:从开发工具到摸鱼神器一网打尽
  • 3步搞定视频转PPT:效率提升80%的智能提取方案
  • 基于YOLOv5和RexUniNLU的多模态商品识别系统
  • PyTorch新手必看:如何正确使用softmax的dim参数(附常见错误示例)
  • PAT 乙级 1040
  • Python 3.12 MagicMethods - 65 - __neg__
  • MAA智能助手:如何用图像识别技术自动化明日方舟日常任务
  • nofx 前端自己build 镜像脚本
  • 快速内容创作:Wan2.2-T2V-A5B在社交媒体视频中的应用
  • 亿百特E22 LoRa模块透明传输与定点传输实战指南
  • STK船舶航线规划避坑指南:用Python自动添加航路点的5个关键细节
  • ClearerVoice-Studio语音分离功能体验:轻松分离多人对话,识别超准
  • 【前沿解析】2026年3月19日:AI自主化演进的双重突破——MiniMax M2.7自我进化模型与小鹏第二代VLA端到端自动驾驶
  • Temu核价自动化实战:凌风工具箱智能核价参数详解与配置指南
  • 视频中间件协议转换揭秘:如何用1个H5接口对接大华所有设备(RTSP/GB28181/ONVIF互转)
  • 中国香港中文大学深圳分校全球首创视频广告植入新技术
  • PLC控制箱出问题?这套排查逻辑更高效
  • SAM3部署实战:在CUDA 11.8环境下绕过官方高版本限制
  • DAMO-YOLO作品集:多张图片识别效果展示,感受AI视觉魅力
  • Windows Cleaner:如何彻底解决C盘爆红问题?
  • AD9361 CMOS双端口TDD模式实战:如何实现64Msps基带I/Q数据接收(含增益优化技巧)
  • 大模型时代的职业风口,2026年最值得入局的AI新职业:从训练师到算法研究员
  • Blender3mfFormat深度解析:技术原理与应用实践指南
  • 北京交通大学等机构推出3D场景编辑新方法
  • 仅限首批200名开发者获取:存算一体芯片C语言指令集封装黄金模板(含IEEE 1801-UPF电源域感知接口)