Day 120 — LangChain 与 RAG 图解
1. RAG 系统架构图
┌──────────────────────────────────────────────────────────────┐
│ RAG 系统架构 │
├──────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 文档源 │ │ 处理管道 │ │ 向量存储 │ │
│ │ │ │ │ │ │ │
│ │ 📄 PDF │ ──→ │ Loader │ ──→ │ Embedding │ │
│ │ 📝 Text │ │ Splitter │ │ FAISS/ │ │
│ │ 🌐 Web │ │ │ │ Chroma │ │
│ │ 📊 CSV │ │ │ │ │ │
│ └─────────────┘ └──────────────┘ └──────┬───────┘ │
│ │ │
│ ═══════════════ 离线索引阶段 ═════════════════════╪═══════ │
│ ═══════════════ 在线查询阶段 ═════════════════════╪═══════ │
│ │ │
│ ┌─────────────┐ ┌──────────────┐ ┌──────▼───────┐ │
│ │ 用户问题 │ │ 检索引擎 │ │ 检索结果 │ │
│ │ │ ──→ │ 向量相似度 │ ──→ │ Top-K │ │
│ │ "装饰器是 │ │ 搜索 │ │ 文档片段 │ │
│ │ 什么?" │ │ │ │ │ │
│ └─────────────┘ └──────────────┘ └──────┬───────┘ │
│ │ │
│ ┌─────────────┐ ┌──────────────┐ ┌──────▼───────┐ │
│ │ 最终回答 │ ←── │ LLM 生成 │ ←── │ Prompt 组装 │ │
│ │ │ │ GPT-4 │ │ 上下文+问题 │ │
│ │ "装饰器是 │ │ │ │ │ │
│ │ Python中 │ │ │ │ │ │
│ │ 的设计模式" │ │ │ │ │ │
│ └─────────────┘ └──────────────┘ └──────────────┘ │
│ │
└──────────────────────────────────────────────────────────────┘
2. LangChain LCEL 链流程
输入 组件1 组件2 组件3
│ │ │ │
▼ ▼ ▼ ▼
┌────────┐ ┌─────────────────┐ ┌────────────┐ ┌──────────────┐
│ │ │ Prompt Template │ │ LLM │ │ Output │
│ 用户 │→ │ │→ │ GPT-4 │→ │ Parser │→ 文本
│ 问题 │ │ {context} │ │ │ │ │
│ │ │ {question} │ │ │ │ │
└────────┘ └─────────────────┘ └────────────┘ └──────────────┘
│ ▲
│ │
▼ │
┌────────┐ ┌─────────────────┐
│Retriever│ │ format_docs │
│ 检索 │ │ 格式化文档 │
└────────┘ └─────────────────┘
▲
│
┌────────┐
│Vector │
│Store │
└────────┘
3. 向量检索原理
查询向量 向量空间
│ (高维空间中的点)
│ │
▼ ▼
┌─────────┐ ┌──────────────────┐
│ "装饰器" │ │ │
│ embedding│──→ │ ● v1(装饰器) │ ← 最近
│ [0.2, │ 距离 │ │ 距离
│ -0.4, │←──计算──→ │ ● v3(迭代器) │ ← 中等
│ 0.6, │ │ │
│ ...] │ │ ● v2 │ ← 远
└─────────┘ │ (猫) │
└──────────────────┘
距离度量: 余弦相似度 / 欧氏距离 / 内积
4. 文档分割策略
原始文档(1000 字符):
┌──────────────────────────────────────────────────────────────┐
│ Python 装饰器是一种设计模式...装饰器本质上是一个高阶函数... │
│ Python 生成器使用 yield 关键字...生成器的优势在于惰性求值... │
│ Python 上下文管理器通过 __enter__ 和 __right__ 方法... │
└──────────────────────────────────────────────────────────────┘
chunk_size=300, chunk_overlap=50 分割后:
┌─────────────────────────┐
│ chunk 1: 装饰器相关 │
│ (300字符) │
└──────────┬──────────────┘
│ 重叠 50 字符
┌──────────▼──────────────┐
│ chunk 2: 生成器相关 │
│ (300字符) │
└──────────┬──────────────┘
│ 重叠 50 字符
┌──────────▼──────────────┐
│ chunk 3: 上下文管理器 │
│ (300字符) │
└─────────────────────────┘