用 Claude 3.5 Sonnet 搭建个人知识库:从 Prompt 优化到代码实现全记录

摄影爱好者Tom 初级 2026/4/30 289 浏览 2 点赞 约 1 分钟

要把一个简单的 PDF/Markdown 文件夹变成能精准问答的知识库,最难的不是写 RAG 流程,而是怎么让 Claude 3.5 Sonnet 别在检索结果里“一本正经地胡说八道”。

我这次尝试用 Python + LangChain + ChromaDB 快速搭了一个本地 Demo,在处理复杂技术文档时,直接喂内容给 LLM 经常会出现幻觉,核心在于检索阶段的噪声太高。

1. 关键的 Prompt 调优
我尝试了多种 System Prompt,发现最有效的不是告诉它“请根据上下文回答”,而是给它一个明确的拒绝机制引用要求

你是一个严谨的知识库助手。回答时必须遵循:
1. 仅使用提供的上下文信息。如果上下文中没有答案,直接回答“知识库中未记录相关信息”,严禁自行脑补。
2. 每一段结论后必须标注来源,格式为 [文档名-页码/行号]。
3. 如果上下文存在矛盾,请同时列出两种观点并标注来源。

2. 代码实现中的坑:分块策略
刚开始用默认的 CharacterTextSplitter,结果检索出来的片段经常断在句子一半,导致 Claude 理解偏差。后来改用 RecursiveCharacterTextSplitter 并设置了 chunk_overlap,这样能保证语义连续。

from langchain.text_splitter import RecursiveCharacterTextSplitter

# 经验值:chunk_size 500, overlap 50 比较稳
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500, 
    chunk_overlap=50,
    length_function=len,
    separators=["\n\n", "\n", "。", "!", "?", " ", ""]
)
docs = text_splitter.split_documents(raw_documents)

3. 效率提升技巧:利用 Cursor 的 Composer 模式
在写这个项目时,我直接用 Cursor 的 Ctrl+I (Composer) 模式。我把整个 requirements.txt 和目前的 main.py 丢给它,直接下指令:「把目前的向量存储改为持久化存储,并增加一个检查向量数据库是否已加载的逻辑,避免每次启动都重新 Embedding」。

它直接帮我写好了 persist_directory 的配置和 if os.path.exists() 的判断,省去了手动查文档的时间。

4. 避坑指南:Embedding 模型的选择
千万别在本地跑那种极小的 Embedding 模型,检索精度极差。建议直接用 text-embedding-3-small,虽然花几分钱,但配合 Claude 3.5 的推理能力,问答的准确率从 60% 提升到了 90% 以上。

核心配置清单:

  • LLM: Claude 3.5 Sonnet (Via API)
  • Vector Store: ChromaDB (Local)
  • Framework: LangChain
  • Embedding: OpenAI text-embedding-3-small
用 Claude 3.5 Sonnet 搭建个人知识库:从 Prompt 优化到代码实现全记录

全部回复 (0)

还没有回复,来发第一条吧!

发表回复

支持 Markdown 格式