📋 目录
一、引言:为什么我要造一个"数据孪生体"
人的大脑是有限的。工作这些年,我积累了大量经验、笔记、决策案例,但记忆会衰减,检索会迟钝。我需要一个外接大脑——一个本地部署的AI系统,断网运行,不消耗API token,只用电,却能承载我大脑的一部分,帮我存储所有经验与智慧,最终成为提高效率的工具。
这篇文章记录了我从产生想法,到选型硬件,再到真正跑通RAG(检索增强生成)系统的完整过程。包括那些我踩过的概念坑,以及最终梳理清楚的全流程。
二、什么配置能达到"大学生反应速度"
我最初的核心问题是:要达到和正常人、大学生相当的反应速度,需要什么模型?什么配置?
2.1 定义"反应速度"
大模型有两个速度指标:
- TTFT(首字延迟):从提问到第一个字出现的时间。人类对"秒回"的感知阈值是 << 500ms-1秒。
- TPS(每秒生成token数):后续输出速度。人类阅读中文的极限约 10-15 tokens/s。超过30 tokens/s,人眼已经跟不上。
所以,"大学生反应速度" = TTFT < 1秒 + TPS > 15 tokens/s。这个门槛并不高。
2.2 硬件与模型匹配方案
| 目标 | 推荐模型 | 显存需求 | 推荐硬件 | 预算 |
|---|---|---|---|---|
| 基础对话 | Qwen3.5-9B / Llama-3-8B | 6-8G | RTX 3060 12G / Mac Mini M4 16G | <5000元 |
| 大学生水平(推荐) | Qwen3.5-32B / DeepSeek-R1-32B | 18-20G | RTX 3090 24G 或 RTX 4090 24G | 10000-15000元 |
| 研究生/专家水平 | Qwen-72B / Llama-3-70B | 40-48G | 双卡3090 / Mac Studio M4 Max 128G | 20000-40000元 |
三、不联网能自己迭代升级模型吗
直接结论:可以局部迭代,但无法完全自主升级。
3.1 完全从头训练 → 不可能
训练一个7B模型需要数万张A100跑数周,个人硬件无法实现。
3.2 轻量化微调(LoRA/QLoRA)→ 完全可行
这是个人迭代的核心路径:
- 原理:冻结原模型99%参数,只训练少量"适配器"(通常几百MB)。
- 数据:用你的对话记录、笔记、决策案例作为训练数据。
- 硬件:24G显存可以微调7B-14B模型;48G显存可以微调32B模型。
- 效果:模型会学习你的语言风格、决策偏好、知识盲区。
3.3 知识库迭代(RAG)→ 最推荐
不需要动模型权重,只需持续投喂新文档:
- 写新笔记 → 自动切片 → 向量化 → 存入本地向量库
- 模型本身不变,但"可检索的记忆"实时更新
- 这是构建"数据孪生体"最务实的底座
四、架构设计:数据孪生体的双层结构
我最终确定的"数据孪生体"采用 RAG + 个性化微调 的双层架构:
第一层:外显记忆(RAG知识库)
承载所有文档、笔记、经验、项目资料。技术栈为 Ollama(模型服务)+ Chroma(向量数据库)+ BGE-large(嵌入模型)+ Cherry Studio(前端)。
数据流如下:
你的笔记/PDF/聊天记录 → 文本清洗 → 切分Chunk → Embedding向量化 → 存入本地向量库
↑
用户提问 → 问题向量化 → 相似度检索TopK → 拼接进Prompt → 本地大模型生成回答
第二层:内隐记忆(LoRA微调)
承载思维模式、决策风格、语言习惯。建议每3-6个月,用积累的对话数据训练一个新的LoRA适配器,与基础模型合并。
五、关键认知:知识库和模型是两个独立部分
在实践过程中,我产生了一个重要疑问:喂养(知识库)和模型是两个部分吗?换模型对同样的文档有什么影响?喂养必须是PDF吗?
5.1 架构上的三个独立组件
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 你的文档 │────→│ 嵌入模型 │────→│ 向量数据库 │
│ (PDF/TXT等) │ │(把文字转向量) │ │ (本地存储) │
└─────────────┘ └─────────────┘ └─────────────┘
↑
│ 相似度检索
↓
提问 ──→ 本地大模型(LLM) ←── 检索到的相关片段 ←─┘
- 大模型(LLM):负责理解问题和生成回答。
- 嵌入模型(Embedding):负责把文档转成向量指纹,通常只有几百MB,用CPU跑。
- 向量数据库:本地文件,存着所有文档的向量索引。
5.2 模型规模对同样文档的影响
| 维度 | 3B小模型(如我的配置) | 更大的模型(14B/32B) |
|---|---|---|
| 理解深度 | 能处理简单问答,遇到专业术语、逻辑推理时容易答非所问 | 能读懂隐含逻辑、因果关系、专业细节 |
| 上下文利用 | 通常只支持8K上下文,检索片段太长会"看后面忘前面" | 支持32K-128K,能消化更多片段并交叉比对 |
| 幻觉控制 | 更容易"脑补",检索没提的内容可能瞎编 | 更忠实于原文,不确定会直接说不知道 |
| 回答风格 | 比较机械、简短,像"学生念笔记" | 更自然、有层次,像"老师在讲解" |
| 检索质量依赖 | 极高。理解力弱,检索不准则回答质量断崖下跌 | 中等。即使检索到边缘信息,也能筛选整合 |
结论:同样的喂养文档,3B模型能当"快速查字典"用;大模型能当"深度研究助手"用。
5.3 文档格式:PDF不是唯一选择
最佳格式排序:
- TXT / Markdown:纯文本,无格式干扰,切片最干净
- JSON / CSV:结构化数据,可精确控制字段映射
- DOCX / Word:多数工具支持,复杂表格可能解析错乱
- PDF(文字版):需要是"可选中文字"的PDF,不是扫描图片
- PDF(扫描版/图片):必须先OCR,否则系统看到的是空白
六、实践:跑通第一个RAG系统
前天,我终于跑通了第一个完整的RAG流程。这是我的运行记录:
PS D:\Projects\ByLifeCycle-Personal\smarttools> .env\Scripts\python.exe src/backend/generation/simple_ask.py
请输入问题: 林远睁开眼睛时看到了什么?
Loading weights: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 71/71 [00:00<00:00, 29195.65it/s]
回答: 林远睁开眼睛时看到的是手术室的蓝光已经熄灭了。
引用片段:
1. 《副本》
林远睁开眼睛时,手术室的蓝光已经熄灭了。
"上传完成。"AI 的声音像是从很远的地方传来,"您的意识副本已入驻'方舟'服务器,编号
7,291,004。"
他试着抬起手,却发现自己没有了手。视野里只有无尽的数据流和漂浮的虚拟城市。这就是
永生吗?他想着,向城市的中心飘去。
然后他在广场中央看到了另一个人。
那个人有着和他一样的脸,一样的记忆,一样地在五分钟前死去。那个"林远"转过头,对他…
虽然跑通了,但我意识到:跑通不等于搞懂。如果我不能说清楚数据是怎么流动的,那这个东西就不是我的工具,而是一个黑盒。于是我决定今天把全流程彻底梳理清楚。
七、深度解析:RAG系统的五大核心模块
通过阅读代码和反复验证,我梳理出了完整的数据流和五个核心模块:
7.1 项目结构对照
smarttools/
├── src/
│ ├── backend/
│ │ ├── generation/ ← simple_ask.py:加载模型 + 检索 + 生成
│ │ ├── embedding/ ← 文本转向量
│ │ ├── vector_store/ ← 向量数据库(Chroma/FAISS)
│ │ └── document_loader/ ← 文档解析
│ └── data/ ← 原始文档(如《副本》.txt)
└── venv/
7.2 完整数据流
原始文档 → 文档解析/切片 → 文本块(Chunk) → Embedding模型 → 向量数据库(本地持久化)
↑
提问 → Embedding → 问题向量 → 相似度搜索(TopK) → 检索到的上下文 ──┘
↓
本地LLM(71/71权重加载)
↓
生成回答 + 引用片段
7.3 五大核心模块详解
模块1:文档加载与切片
- Chunk Size:每块多少字(如512字、1024字)
- Chunk Overlap:块与块之间重叠多少字,防止关键信息被切在边界
- 切片策略:按段落切、按固定长度切、按语义切
模块2:Embedding(文本向量化)
- 使用
bge-small-zh或GTE等模型,把文字变成768维或1024维的向量 - 语义相近的文字,向量距离就相近
- 这个模型通常比LLM小很多,用CPU跑即可
模块3:向量数据库
- Chroma:轻量,纯本地文件,适合个人项目
- FAISS:纯内存,速度快但重启需重新加载
- Milvus:重型,适合海量数据
模块4:检索与重排序
- 向量检索:先粗筛,找出50个可能相关的
- 重排序(Rerank):用
bge-reranker等精细模型重新打分,选出最准的5个送给LLM - 简单项目可能跳过Rerank,直接向量检索TopK就送给LLM
模块5:生成(LLM)
Loading weights: 71/71表示模型权重层数(transformer block数量)- 3B模型被量化成Q4后,能在小显存/内存里跑
- 生成时,系统把"问题 + 检索到的片段"拼成Prompt,模型自回归生成回答
Prompt大致结构:
基于以下参考信息回答问题:
---
参考1:林远睁开眼睛时,手术室的蓝光已经熄灭了...
---
问题:林远睁开眼睛时看到了什么?
回答:
八、针对现有配置的优化建议
我的配置是 i7-12700H + 16GB内存 + 4GB显存 + qwen2.5-3b-q4:
- LLM:3B Q4量化在4GB显存上能跑,但16GB内存会被挤压。建议用Ollama时设置
num_gpu 20左右,把大部分层放显存,剩余放内存。 - Embedding模型:不要放显存,用CPU跑(如
bge-small-zh),几百MB,i7-12700H很快。 - 知识库规模:16GB内存同时跑LLM + Embedding + 向量库,建议总文档控制在500MB纯文本以内。文档很多可以按项目分库。
- 模型升级路径:后续换更大的模型(如7B/8B),4GB显存不够,需要纯CPU跑(速度慢但可行),或者等硬件升级。
九、学习路径与自查清单
为了把"跑通"变成"搞懂",我制定了今天的学习计划:
- 阅读配置文件:找到
config.py或.env,确认Embedding模型、向量库、LLM的路径。 - 手动走一遍喂文档流程:单步运行加载→切片→打印Chunk→Embedding→入库。
- 理解检索过程:在代码里找到检索逻辑,打印
retrieved_chunks,看送给LLM的上下文到底是什么。 - 理解生成过程:找到模型加载和
generate()调用点,理解Prompt是如何拼接的。 - 动手改参数看效果:把
top_k从3改成1,把chunk_size从512改成1024,把temperature从0.7改成0.1,观察输出变化。
- 我知道向量数据库文件存在硬盘的哪个路径
- 我能说出Embedding模型叫什么名字、多大体积
- 我能说出LLM模型叫什么名字、多大体积、量化方式
- 我知道文档是怎么被切成块的,每块多大
- 我能找到代码里"把检索到的片段拼进Prompt"的那一行
- 我知道怎么往知识库里加一个新文档,不需要重新跑整个系统
十、总结:现实边界与正确预期
经过这一轮的探索,我对这个"数据孪生体"有了清醒的认知:
它能做什么:
- 无限容量的笔记本,会主动检索的助手
- 存储你的经验、笔记、决策记录,随时调取
- 通过LoRA微调模仿你的语言风格和思维偏好
它不能做什么:
- 个人硬件只能做轻量微调,无法创造模型没见过的新知识
- 无法复制你的直觉、情绪和潜意识
- RAG检索可能漏掉关键信息,知识库质量完全由你负责