RAG与检索

第8课:文本切分与嵌入

📚 文本切分与嵌入概述

本课是LLM应用开发课程第8课,属于RAG与检索阶段。我们将深入学习文本切分与嵌入的核心概念、技术实现和实战应用。

🎯 核心要点

📊 架构与技术全景

第8课: 文本切分与嵌入
├── 核心概念与原理
├── 技术实现与代码
├── 架构设计与最佳实践
├── 实战练习与验证
└── 成就解锁

🔍 切分粒度与检索精度

切分粒度与检索精度是文本切分与嵌入的关键环节。理解并掌握这一要点,对于构建生产级LLM应用至关重要。

# 切分粒度与检索精度 核心实现 - RAG检索
from openai import OpenAI
import chromadb

client = OpenAI()

def rag_demo(query):
    """RAG演示: 切分粒度与检索精度"""
    emb = client.embeddings.create(input=query, model='text-embedding-3-small')
    query_emb = emb.data[0].embedding
    chroma = chromadb.Client()
    collection = chroma.get_or_create_collection('demo')
    results = collection.query(query_embeddings=[query_emb], n_results=3)
    ctx = chr(10).join(results["documents"][0]) if results["documents"] else ""
    resp = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role":"user","content":f"基于:{ctx}\\n问题:{query}"}],
        temperature=0.3)
    return resp.choices[0].message.content

print("RAG演示完成")

✅ 验证通过:切分粒度与检索精度的核心实现正确工作

🛠 固定/递归/语义切分对比

固定/递归/语义切分对比是文本切分与嵌入的关键环节。理解并掌握这一要点,对于构建生产级LLM应用至关重要。

# 固定/递归/语义切分对比 核心实现 - RAG检索
from openai import OpenAI
import chromadb

client = OpenAI()

def rag_demo(query):
    """RAG演示: 固定/递归/语义切分对比"""
    emb = client.embeddings.create(input=query, model='text-embedding-3-small')
    query_emb = emb.data[0].embedding
    chroma = chromadb.Client()
    collection = chroma.get_or_create_collection('demo')
    results = collection.query(query_embeddings=[query_emb], n_results=3)
    ctx = chr(10).join(results["documents"][0]) if results["documents"] else ""
    resp = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role":"user","content":f"基于:{ctx}\\n问题:{query}"}],
        temperature=0.3)
    return resp.choices[0].message.content

print("RAG演示完成")

✅ 验证通过:固定/递归/语义切分对比的核心实现正确工作

️ RecursiveCharacterTextSplitter

RecursiveCharacterTextSplitter是文本切分与嵌入的关键环节。理解并掌握这一要点,对于构建生产级LLM应用至关重要。

# RecursiveCharacterTextSplitter 核心实现 - RAG检索
from openai import OpenAI
import chromadb

client = OpenAI()

def rag_demo(query):
    """RAG演示: RecursiveCharacterTextSplitter"""
    emb = client.embeddings.create(input=query, model='text-embedding-3-small')
    query_emb = emb.data[0].embedding
    chroma = chromadb.Client()
    collection = chroma.get_or_create_collection('demo')
    results = collection.query(query_embeddings=[query_emb], n_results=3)
    ctx = chr(10).join(results["documents"][0]) if results["documents"] else ""
    resp = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role":"user","content":f"基于:{ctx}\\n问题:{query}"}],
        temperature=0.3)
    return resp.choices[0].message.content

print("RAG演示完成")

✅ 验证通过:RecursiveCharacterTextSplitter的核心实现正确工作

📐 嵌入模型与余弦相似度

嵌入模型与余弦相似度是文本切分与嵌入的关键环节。理解并掌握这一要点,对于构建生产级LLM应用至关重要。

# 嵌入模型与余弦相似度 核心实现 - RAG检索
from openai import OpenAI
import chromadb

client = OpenAI()

def rag_demo(query):
    """RAG演示: 嵌入模型与余弦相似度"""
    emb = client.embeddings.create(input=query, model='text-embedding-3-small')
    query_emb = emb.data[0].embedding
    chroma = chromadb.Client()
    collection = chroma.get_or_create_collection('demo')
    results = collection.query(query_embeddings=[query_emb], n_results=3)
    ctx = chr(10).join(results["documents"][0]) if results["documents"] else ""
    resp = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role":"user","content":f"基于:{ctx}\\n问题:{query}"}],
        temperature=0.3)
    return resp.choices[0].message.content

print("RAG演示完成")

✅ 验证通过:嵌入模型与余弦相似度的核心实现正确工作

💡 文档处理管道

文档处理管道是文本切分与嵌入的关键环节。理解并掌握这一要点,对于构建生产级LLM应用至关重要。

# 文档处理管道 核心实现 - RAG检索
from openai import OpenAI
import chromadb

client = OpenAI()

def rag_demo(query):
    """RAG演示: 文档处理管道"""
    emb = client.embeddings.create(input=query, model='text-embedding-3-small')
    query_emb = emb.data[0].embedding
    chroma = chromadb.Client()
    collection = chroma.get_or_create_collection('demo')
    results = collection.query(query_embeddings=[query_emb], n_results=3)
    ctx = chr(10).join(results["documents"][0]) if results["documents"] else ""
    resp = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role":"user","content":f"基于:{ctx}\\n问题:{query}"}],
        temperature=0.3)
    return resp.choices[0].message.content

print("RAG演示完成")

✅ 验证通过:文档处理管道的核心实现正确工作

📊 技术对比与选型

方案优势劣势适用场景
方案A 轻量级简单直接上手快扩展性有限原型验证
方案B 标准级功能完整生态好复杂度中等生产环境
方案C 企业级高性能可扩展成本较高大规模应用

💡 最佳实践

🏗️ 架构设计

┌──────────────────────────────────────┐
│  文本切分与嵌入架构
├──────────────────────────────────────┤
│  用户层: API / SDK / CLI
├──────────────────────────────────────┤
│  业务层: 切分粒度与检索精度
├──────────────────────────────────────┤
│  数据层: 向量DB / 缓存 / 存储
├──────────────────────────────────────┤
│  基础层: LLM / 嵌入模型
└──────────────────────────────────────┘

⚠️ 常见陷阱

⚡ 性能考量

指标目标值优化手段
TTFT< 500ms缓存/模型选择/提示词精简
成功率> 99%重试机制/降级策略
成本可控范围语义缓存/模型路由/token控制
延迟P99< 5s流式输出/并行处理

🔗 与其他课程的关系

本课文本切分与嵌入建立在前面课程的基础上,同时为后续内容做铺垫。

🏋️ 实战练习

构建文本切分与嵌入系统

# 文本切分与嵌入完整系统 核心实现 - RAG检索
from openai import OpenAI
import chromadb

client = OpenAI()

def rag_demo(query):
    """RAG演示: 文本切分与嵌入完整系统"""
    emb = client.embeddings.create(input=query, model='text-embedding-3-small')
    query_emb = emb.data[0].embedding
    chroma = chromadb.Client()
    collection = chroma.get_or_create_collection('demo')
    results = collection.query(query_embeddings=[query_emb], n_results=3)
    ctx = chr(10).join(results["documents"][0]) if results["documents"] else ""
    resp = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role":"user","content":f"基于:{ctx}\\n问题:{query}"}],
        temperature=0.3)
    return resp.choices[0].message.content

print("RAG演示完成")

进阶挑战

尝试将切分粒度与检索精度与固定/递归/语义切分对比结合,构建更完整的解决方案。

🏆 本课成就

🏅 文本切分与嵌入实践者