01

Claude Context 概览

理解向量数据库如何增强 LLM 的上下文管理能力——从基础概念到实际应用

什么是 Claude Context?

当你在使用大语言模型(LLM)时,最常遇到的限制是什么?是 上下文窗口 的限制。即使 Claude 支持 200K token,在处理大量文档、长期对话或复杂知识库时,仍然会遇到"忘记前面说了什么"的问题。

Claude Context 项目通过结合 Zilliz/Milvus 向量数据库 和 Claude API,构建了一个智能的上下文管理系统。它能将大量信息编码为向量并存储,在需要时精准检索最相关的内容,从而突破上下文窗口的限制。

💡
为什么上下文管理很重要?

研究表明,LLM 在长上下文中存在"迷失在中间"(Lost in the Middle)现象:位于上下文中间的信息最容易被忽略。通过向量检索只提供最相关的上下文片段,可以显著提升回答质量,同时降低 API 成本(减少不必要的 token 消耗)。

🔎

语义搜索

将文档转换为向量表示,通过相似度搜索找到最相关的内容。不需要精确的关键词匹配,而是理解查询的语义含义,返回真正有用的上下文。

🧠

智能分块

将长文档智能分割为语义完整的块(Chunk),每个块独立编码为向量。分块策略直接影响检索质量——太大会包含无关信息,太小会丢失上下文。

📈

动态注入

在用户提问时,实时检索最相关的上下文片段,注入到 prompt 中。Claude 基于这些精准的上下文生成回答,效果远优于将所有文档塞入 prompt。

💾

知识持久化

将知识存储在向量数据库中,不受对话轮次限制。一次索引,多次使用。支持增量更新,知识库可以持续扩展而不会降低性能。

Claude Context 技术架构

理解系统架构是掌握 Claude Context 的关键。以下是整个系统从数据输入到回答生成的完整数据流。

数据摄入层 — 将知识转化为向量

📄
文档解析器
智能分块引擎

向量化层 — 语义编码

🧠
Embedding 模型
🗃
Milvus 向量数据库

检索生成层 — RAG 管道

🔎
检索引擎
💬
Claude 生成器
点击组件了解 Claude Context 架构的每一层

课程路线图

📁 课程路线图
📚 模块 1:概览与架构(当前位置)
上下文管理挑战、向量数据库基础、RAG 架构
🧠 模块 2:核心概念
向量嵌入、Milvus 集合、索引类型、相似度度量
🛠 模块 3:实践应用
文档摄入管道、RAG 查询、上下文注入策略
🚀 模块 4:进阶主题
混合搜索、重排序、性能优化、生产部署
✅ 模块 5:总结与练习
RAG 最佳实践、综合练习、扩展方向

Claude Context 主要解决 LLM 的什么问题?

02

核心概念

向量嵌入、Milvus 集合管理、索引类型和相似度度量——RAG 系统的技术基石

向量嵌入:将文本转化为数学表示

向量嵌入(Vector Embedding)是整个 RAG 系统的基础。它将人类语言转化为机器可以计算的数学向量,保留了语义信息——含义相近的文本在向量空间中距离更近。

🧠
嵌入模型的直觉理解

想象一个三维空间,X 轴代表"动物性",Y 轴代表"大小",Z 轴代表"家养程度"。在这个空间中,"猫"和"狗"会非常接近(小动物、家养),而"鲸鱼"会在完全不同的区域。实际的嵌入模型使用 768-3072 维空间来捕捉更丰富的语义特征。

Python
from pymilvus import model

# 使用 OpenAI 嵌入模型
embed_fn = model.dense.OpenAIEmbeddingFunction(
    model_name="text-embedding-3-small",
    api_key="your-api-key"
)

# 将文本转换为向量
texts = [
    "Milvus 是一个开源的向量数据库",
    "Claude 是 Anthropic 开发的 AI 助手",
    "向量搜索在 AI 应用中非常重要"
]

vectors = embed_fn.encode_documents(texts)

# 每个向量是 1536 维的浮点数组
print(f"向量维度: {len(vectors[0])}")  # 1536
print(f"向量示例: {vectors[0][:5]}")   # [0.012, -0.034, ...]
解读

向量嵌入的核心概念:

  • Embedding Function:封装了嵌入模型的调用逻辑
  • 1536 维向量:每个文本被转换为一个 1536 维的浮点数组
  • 语义编码:含义相近的文本产生数值接近的向量
  • encode_documents:专门用于文档编码的方法(与查询编码不同)

Milvus 集合:向量数据的容器

在 Milvus 中,向量数据存储在 Collection 中。理解集合的创建、配置和管理是使用向量数据库的基础。

🗃

向量字段

存储嵌入向量的核心字段。需要指定维度(dim=1536)和度量类型(COSINE/L2/IP)。这是集合中最重要的字段,检索操作基于此字段进行。

📄

标量字段

存储文本内容、文档 ID、元数据等非向量信息。支持 VARCHAR、INT64、BOOL、JSON 等类型。用于过滤和返回结果。

🔍

索引类型

加速向量检索的数据结构。常用:IVF_FLAT(快速构建)、HNSW(高精度)、DISKANN(大规模)。不同索引在速度、精度和内存之间权衡。

📈

相似度度量

定义向量之间的距离计算方式:COSINE(余弦相似度,最常用)、L2(欧几里得距离)、IP(内积)。度量类型必须在创建集合时确定。

Python
from pymilvus import MilvusClient, DataType

client = MilvusClient("./milvus_demo.db")

# 创建集合 Schema
schema = client.create_schema(auto_id=True)
schema.add_field("id", DataType.INT64, is_primary=True)
schema.add_field("vector", DataType.FLOAT_VECTOR, dim=1536)
schema.add_field("text", DataType.VARCHAR, max_length=65535)
schema.add_field("source", DataType.VARCHAR, max_length=256)

# 创建集合
client.create_collection(
    collection_name="knowledge_base",
    schema=schema,
)

# 插入数据
data = [{
    "vector": vectors[0],
    "text": "Milvus 是一个开源的向量数据库",
    "source": "milvus_docs.md"
}]
client.insert("knowledge_base", data)
解读

Milvus 集合创建和使用的核心步骤:

  • Schema 定义:指定字段类型——向量字段需要维度参数
  • auto_id:自动生成主键 ID,简化数据插入
  • source 字段:记录文档来源,支持溯源和过滤
  • insert:将向量和元数据一起插入集合

RAG 检索流程

RAG(Retrieval-Augmented Generation,检索增强生成)是 Claude Context 的核心工作模式。理解检索流程的每个环节,对优化系统性能至关重要。

👤
用户查询
🧠
查询嵌入
🔎
Milvus检索
📦
上下文组装
💬
Claude生成
📣
回答输出

在 RAG 流程中,Milvus 向量数据库的主要作用是什么?

03

实践应用

构建完整的 RAG 管道——从文档摄入到智能问答

文档摄入管道

文档摄入是 RAG 系统的第一步。一个高质量的摄入管道能确保知识库中的信息准确、完整、易于检索。

🛠
摄入管道设计原则

好的摄入管道遵循三个原则:完整性(不丢失重要信息)、准确性(分块边界不破坏语义)、可追溯性(每个块能追溯到源文档)。分块策略是最大的变量——通常 512 token + 50 token 重叠是不错的起点。

Python
from pymilvus import MilvusClient, model
from langchain.text_splitter import RecursiveCharacterTextSplitter

class DocumentIngestion:
    """文档摄入管道"""

    def __init__(self, milvus_client: MilvusClient):
        self.client = milvus_client
        self.embed_fn = model.dense.OpenAIEmbeddingFunction(
            model_name="text-embedding-3-small"
        )
        self.splitter = RecursiveCharacterTextSplitter(
            chunk_size=512,
            chunk_overlap=50,
            separators=["\n\n", "\n", "。", ".", " "]
        )

    def ingest(self, documents: list[dict]) -> int:
        """摄入一批文档,返回插入的块数"""
        chunks = []
        for doc in documents:
            # 1. 分块
            text_chunks = self.splitter.split_text(doc["content"])

            # 2. 嵌入
            vectors = self.embed_fn.encode_documents(text_chunks)

            # 3. 组装数据
            for i, (text, vec) in enumerate(
                zip(text_chunks, vectors)
            ):
                chunks.append({
                    "vector": vec,
                    "text": text,
                    "source": doc["source"],
                    "chunk_index": i
                })

        # 4. 批量插入
        self.client.insert("knowledge_base", chunks)
        return len(chunks)
解读

文档摄入管道的四个步骤:

  • RecursiveCharacterTextSplitter:LangChain 的递归分块器,优先在段落边界分割
  • chunk_size=512:每个块最多 512 个字符
  • chunk_overlap=50:相邻块重叠 50 个字符,保留上下文连续性
  • 批量插入:一次性插入所有块,比逐条插入效率高 10 倍以上

RAG 查询:从检索到生成

现在让我们实现 RAG 的查询部分——将用户的问题转化为查询向量,检索相关文档,然后用 Claude 生成精准回答。

Python
import anthropic

class RAGQueryEngine:
    """RAG 查询引擎"""

    def __init__(self, milvus_client, embed_fn):
        self.milvus = milvus_client
        self.embed_fn = embed_fn
        self.claude = anthropic.Anthropic()

    def query(self, question: str, top_k: int = 5) -> dict:
        # 1. 将问题转化为向量
        query_vec = self.embed_fn.encode_queries([question])[0]

        # 2. 在 Milvus 中检索最相关的文档块
        results = self.milvus.search(
            collection_name="knowledge_base",
            data=[query_vec],
            limit=top_k,
            output_fields=["text", "source"]
        )

        # 3. 组装上下文
        context = "\n\n".join([
            hit["entity"]["text"]]
            for hit in results[0]
        ])

        # 4. 调用 Claude 生成回答
        response = self.claude.messages.create(
            model="claude-sonnet-4-20250514",
            max_tokens=2048,
            system="基于以下上下文回答问题。如果上下文中没有相关信息,请说明。",
            messages=[{"role": "user", "content": f"上下文:{context}\n\n问题:{question}"}]
        )

        return {
            "answer": response.content[0].text,
            "sources": [hit["entity"]["source"] for hit in results[0]]
        }
解读

RAG 查询引擎的四步流程:

  • encode_queries:注意查询编码和文档编码使用不同的方法,某些模型针对查询有特殊优化
  • milvus.search:传入查询向量和 Top-K 参数,返回最相似的文档块
  • 上下文组装:将检索到的文档块拼接为连续的上下文字符串
  • Claude 生成:系统提示要求基于上下文回答,避免幻觉

上下文注入策略

如何将检索到的上下文注入 prompt,直接影响回答质量。不同的注入策略适用于不同的场景。

📄

简单拼接(Naive Concatenation)

最基础的策略:将所有检索到的文档块直接拼接成上下文字符串。优点是实现简单;缺点是可能包含无关信息,浪费 token 配额。适合小规模知识库。

📊

按相关性排序(Relevance Ranking)

利用交叉编码器(Cross-Encoder)对检索结果重新排序,将最相关的片段放在前面。Claude 对 prompt 前部的内容关注度更高,排序可以提升关键信息的利用率。

📦

压缩摘要(Context Compression)

先用 Claude 对检索到的文档块进行摘要压缩,去除冗余信息,再将压缩后的上下文用于最终回答。适合文档量大、冗余信息多的场景。

在 RAG 查询中,为什么查询编码(encode_queries)和文档编码(encode_documents)使用不同的方法?

04

进阶主题

混合搜索、重排序优化和生产级部署——打造企业级 RAG 系统

混合搜索:结合向量与关键词

纯向量搜索在处理精确关键词匹配(如产品编号、人名、错误代码)时表现不佳。混合搜索(Hybrid Search)结合向量搜索和全文搜索的优势,显著提升检索质量。

🔎
为什么需要混合搜索?

考虑查询"查找 error code E4042 的解决方案"。纯向量搜索会返回语义相关但编号不同的错误方案;纯关键词搜索可能找不到用不同措辞描述的同一问题。混合搜索同时考虑语义相似性和关键词匹配度,通过加权融合(如 Reciprocal Rank Fusion)合并两种搜索结果。

Python
from pymilvus import AnnSearchRequest, WeightedRanker

# 向量搜索请求
vector_search = AnnSearchRequest(
    data=[query_vector],
    anns_field="vector",
    param={"metric_type": "COSINE", "params": {"nprobe": 10}},
    limit=20
)

# 全文搜索请求(Milvus 2.4+)
text_search = AnnSearchRequest(
    data=[query_sparse_vector],
    anns_field="sparse_vector",
    param={"metric_type": "IP"},
    limit=20
)

# 混合搜索:加权融合两种结果
results = client.hybrid_search(
    collection_name="knowledge_base",
    reqs=[vector_search, text_search],
    ranker=WeightedRanker(0.7, 0.3),  # 向量70% + 关键词30%
    limit=10
)
解读

混合搜索的实现细节:

  • 稠密向量(Dense Vector):标准嵌入向量,捕捉语义信息
  • 稀疏向量(Sparse Vector):BM25/SPLADE 等生成的稀疏表示,捕捉关键词
  • WeightedRanker(0.7, 0.3):向量搜索权重 70%,关键词权重 30%
  • 两阶段检索:各自返回 Top-20,融合后取最终 Top-10

重排序与性能优化

检索到的文档块可能相关性参差不齐。重排序(Reranking)使用更精确(但更慢)的模型对初步检索结果重新评分,确保最相关的内容排在前面。

📈

交叉编码器重排序

使用 Cross-Encoder(如 bge-reranker-v2-m3)同时编码查询和文档,计算精确的相关性分数。比双塔模型(Bi-Encoder)更准确,但速度慢 10-100 倍。适合对精度要求高的场景。

🧠

LLM 重排序

用 Claude 直接评估每个文档块与查询的相关性。最精确但成本最高。适合关键业务场景,如医疗问答、法律咨询等对准确性要求极高的应用。

性能优化策略

批量嵌入(减少 API 调用)、向量缓存(相似查询复用结果)、预计算热门查询、HNSW 索引调优(ef_search 参数)。合理的优化可以将 P99 延迟从秒级降到毫秒级。

生产级部署架构

将 RAG 系统从原型推向生产环境,需要考虑可用性、可扩展性和成本优化。

接入层 — API 网关

🌐
REST API 服务
查询缓存

计算层 — RAG 引擎

🗃
Zilliz Cloud 向量数据库
🧠
Claude API 生成层

数据层 — 知识管理

📄
文档元数据库
📦
异步摄入队列
点击组件了解生产级 RAG 部署的架构细节

混合搜索中,为什么向量和关键词搜索的权重设为 0.7 和 0.3?

05

总结与练习

回顾 RAG 系统的核心知识,通过综合练习巩固技能,规划下一步学习

核心知识回顾

🧠

向量嵌入

文本 → 1536维浮点数组,保留语义信息。查询编码和文档编码可能使用不同的方法。选择合适的嵌入模型是 RAG 质量的基础。

🗃

Milvus 集合管理

Schema(向量字段 + 标量字段)→ 索引(IVF_FLAT/HNSW/DISKANN)→ 相似度度量(COSINE/L2/IP)。合理的集合设计直接影响检索性能。

🛠

RAG 管道

分块(512 token + 50 overlap)→ 嵌入 → 存储 → 检索 → 注入 → 生成。分块策略是最大的质量变量,需要根据文档类型调整。

🔎

混合搜索 + 重排序

向量搜索(语义)+ 全文搜索(关键词)= 混合搜索。交叉编码器或 LLM 重排序进一步提升精度。生产系统的标配。

RAG 系统最佳实践

📄 RAG 最佳实践清单
📦 数据摄入
1. 分块大小从 512 token 开始,根据效果调优
2. 设置 10% 的重叠以保留上下文连续性
3. 保留文档元数据(来源、时间、类型)用于过滤
4. 增量更新而非全量重建索引
🔎 检索优化
5. 使用混合搜索处理语义 + 关键词双重需求
6. Top-K 设为 5-20,过少遗漏信息,过多引入噪声
7. 关键场景使用重排序提升精度
8. 缓存热门查询的检索结果
💬 生成策略
9. System Prompt 明确要求基于上下文回答
10. 要求模型在无法回答时明确说明
11. 返回信息来源,提升可信度和可审计性

综合练习:构建知识库问答系统

设计一个能够回答技术文档问题的 RAG 系统。需要综合运用文档摄入、向量检索和上下文注入策略。

🎯
练习目标

构建一个系统,能够:1) 摄入一组 Markdown 技术文档;2) 将文档分块并嵌入到 Milvus;3) 接受自然语言查询并检索相关文档;4) 使用 Claude 基于检索结果生成精准回答;5) 返回信息来源。

Python — 练习模板
class KnowledgeQA:
    """知识库问答系统 — 请补充完整实现"""

    def __init__(self):
        # TODO: 初始化 Milvus 客户端和嵌入模型
        pass

    # TODO 1: 实现文档摄入
    def ingest_docs(self, folder_path: str) -> int:
        # 提示:遍历文件夹,分块,嵌入,插入
        pass

    # TODO 2: 实现混合检索
    def search(self, query: str, top_k: int = 5) -> list:
        # 提示:查询嵌入 + Milvus search
        pass

    # TODO 3: 实现 RAG 生成
    def answer(self, question: str) -> dict:
        # 提示:search → 组装上下文 → Claude 生成
pass
练习提示

完成这个练习的建议步骤:

  • TODO 1:使用 glob 遍历文件夹,RecursiveCharacterTextSplitter 分块
  • TODO 2:encode_queries 生成查询向量,milvus.search 检索
  • TODO 3:拼接上下文,调用 Claude,返回 answer + sources

下一步学习方向

🤖

Agentic RAG

让 AI Agent 自主决定何时检索、检索什么、如何组合。多步推理 + 工具调用,构建能自主解决问题的 AI 系统。RAG 的未来方向。

📊

RAG 评估框架

学习 RAGAS、TruLens 等评估框架,量化 RAG 系统的检索精度、回答质量和忠实度。没有评估就无法优化。

📚

多模态 RAG

扩展到图片、视频、音频的检索增强生成。使用 CLIP 等多模态嵌入模型,构建跨模态的知识检索系统。

在 RAG 系统中,什么情况下应该考虑使用重排序(Reranking)?

文档分块时为什么要设置重叠(Overlap)?