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 的关键。以下是整个系统从数据输入到回答生成的完整数据流。
数据摄入层 — 将知识转化为向量
向量化层 — 语义编码
检索生成层 — RAG 管道
课程路线图
Claude Context 主要解决 LLM 的什么问题?
核心概念
向量嵌入、Milvus 集合管理、索引类型和相似度度量——RAG 系统的技术基石
向量嵌入:将文本转化为数学表示
向量嵌入(Vector Embedding)是整个 RAG 系统的基础。它将人类语言转化为机器可以计算的数学向量,保留了语义信息——含义相近的文本在向量空间中距离更近。
想象一个三维空间,X 轴代表"动物性",Y 轴代表"大小",Z 轴代表"家养程度"。在这个空间中,"猫"和"狗"会非常接近(小动物、家养),而"鲸鱼"会在完全不同的区域。实际的嵌入模型使用 768-3072 维空间来捕捉更丰富的语义特征。
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(内积)。度量类型必须在创建集合时确定。
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 的核心工作模式。理解检索流程的每个环节,对优化系统性能至关重要。
在 RAG 流程中,Milvus 向量数据库的主要作用是什么?
实践应用
构建完整的 RAG 管道——从文档摄入到智能问答
文档摄入管道
文档摄入是 RAG 系统的第一步。一个高质量的摄入管道能确保知识库中的信息准确、完整、易于检索。
好的摄入管道遵循三个原则:完整性(不丢失重要信息)、准确性(分块边界不破坏语义)、可追溯性(每个块能追溯到源文档)。分块策略是最大的变量——通常 512 token + 50 token 重叠是不错的起点。
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 生成精准回答。
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)使用不同的方法?
进阶主题
混合搜索、重排序优化和生产级部署——打造企业级 RAG 系统
混合搜索:结合向量与关键词
纯向量搜索在处理精确关键词匹配(如产品编号、人名、错误代码)时表现不佳。混合搜索(Hybrid Search)结合向量搜索和全文搜索的优势,显著提升检索质量。
考虑查询"查找 error code E4042 的解决方案"。纯向量搜索会返回语义相关但编号不同的错误方案;纯关键词搜索可能找不到用不同措辞描述的同一问题。混合搜索同时考虑语义相似性和关键词匹配度,通过加权融合(如 Reciprocal Rank Fusion)合并两种搜索结果。
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 网关
计算层 — RAG 引擎
数据层 — 知识管理
混合搜索中,为什么向量和关键词搜索的权重设为 0.7 和 0.3?
总结与练习
回顾 RAG 系统的核心知识,通过综合练习巩固技能,规划下一步学习
核心知识回顾
向量嵌入
文本 → 1536维浮点数组,保留语义信息。查询编码和文档编码可能使用不同的方法。选择合适的嵌入模型是 RAG 质量的基础。
Milvus 集合管理
Schema(向量字段 + 标量字段)→ 索引(IVF_FLAT/HNSW/DISKANN)→ 相似度度量(COSINE/L2/IP)。合理的集合设计直接影响检索性能。
RAG 管道
分块(512 token + 50 overlap)→ 嵌入 → 存储 → 检索 → 注入 → 生成。分块策略是最大的质量变量,需要根据文档类型调整。
混合搜索 + 重排序
向量搜索(语义)+ 全文搜索(关键词)= 混合搜索。交叉编码器或 LLM 重排序进一步提升精度。生产系统的标配。
RAG 系统最佳实践
综合练习:构建知识库问答系统
设计一个能够回答技术文档问题的 RAG 系统。需要综合运用文档摄入、向量检索和上下文注入策略。
构建一个系统,能够:1) 摄入一组 Markdown 技术文档;2) 将文档分块并嵌入到 Milvus;3) 接受自然语言查询并检索相关文档;4) 使用 Claude 基于检索结果生成精准回答;5) 返回信息来源。
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)?