1. 项目背景与设计思路
作为一名长期从事AI系统开发的工程师,我最近在探索RAG(检索增强生成)技术时遇到了一个典型的学习困境:市面上的教程和开源项目往往一上来就是完整的解决方案栈,抽象层级太高,导致新手很难理解底层核心机制。这就像学做菜时,师傅直接给你看满汉全席的菜谱,却从不解释为什么要先热锅再下油。
我的解决思路是回归工程本质——先搭建一个最小可行系统。这个v0.1版本的目标非常明确:
- 剥离所有非核心依赖:不使用LangChain等框架,避免向量数据库和embedding模型,仅用Python标准库实现
- 聚焦三个核心问题:
- 文档如何被切分成有意义的片段
- 查询如何匹配到相关文本证据
- 系统如何判断何时应该回答或拒绝
这种"减法思维"在工程实践中尤为重要。就像调试电路时,我们会先检查每个元器件是否正常工作,而不是直接排查整个系统的故障。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心模块实现解析
2.1 文档切分模块设计
在chunking.py中,我采用了基于固定长度的文本切分策略。虽然这不是最优方案,但符合"先跑通再优化"的原则:
python复制def split_text(text, max_length=300):
chunks = []
for i in range(0, len(text), max_length):
chunk = text[i:i+max_length]
chunks.append({
"id": f"p1-c{len(chunks)+1}", # 页码-块号
"page": 1,
"text": chunk.strip()
})
return chunks
关键设计考量:
- 每个块都携带完整的元数据(ID、页码等),方便后续追踪
- 固定长度切分虽然可能破坏句子完整性,但保证了可预测性
- 保留原始文本不做预处理,避免引入额外的复杂度
注意:实际项目中应根据文档特性选择切分策略。技术文档适合按章节切分,而连续文本(如小说)可能需要重叠窗口策略。
2.2 轻量级检索实现
`ret
