从零到一搭建个人AI知识库

为什么要搭建个人AI知识库?

电脑里存了几百个文档,却怎么也找不到上周写的那份技术方案; 收藏了无数篇优质文章,等到想用时却像大海捞针。 在这个信息过载的时代,我们每个人都在知识管理的泥潭中挣扎。

AI知识库,正在改变这一切。想象一下:当你需要某个资料时,不用在十几个软件间来回切换,只需在一个搜索框里输入问题,AI就能立即从所有文档中精准定位,不仅给出答案,还会把相关内容整理好放在你面前。

本篇将介绍从零开始,一步步搭建一个属于自己的AI知识库。

一、理解核心概念:什么是RAG?

RAG(检索增强生成,Retrieval-Augmented Generation)

传统的AI大模型(如GPT)虽然知识渊博,但它们有一个致命缺陷:知识是固定的,且可能产生“幻觉”(编造出看似合理但完全错误的信息)

RAG的出现完美解决了这个问题。它的核心思想可以形象地理解为“给AI递小抄”——在回答问题前,先从外部知识库中检索出最相关的信息,然后将这些信息连同问题一起“喂”给AI,让它基于给定的材料进行回答。这就像一场开卷考试:AI不再是凭记忆瞎编,而是有参考资料可以查阅。

一个完整的RAG系统包含两个阶段:

阶段一:索引构建(离线) ——把文档“搬进”知识库

  1. 加载:读取PDF、Word、Markdown等各种格式的文档
  2. 切分:将长文档切成语义完整的小块
  3. 向量化:通过嵌入模型将文本块转换成高维数字向量
  4. 存储:将向量存入专门的向量数据库

阶段二:检索生成(在线) ——回答用户问题

  1. 用户提问 → 将问题也转换成向量
  2. 检索:在向量数据库中找最相似的Top K个文本块
  3. 增强:将检索结果与问题组合成提示词
  4. 生成:AI基于参考资料生成准确回答

这个流程听着复杂,但现在有大量开源工具帮你自动完成这一切。

二、选择工具链

搭建AI知识库,你不需要从零写代码。以下几类工具可以大幅降低门槛:

2.1 大模型(AI的大脑)

  • Ollama + DeepSeek:本地部署方案。Ollama是一个模型管理工具,设计思路类似于Docker,专门针对AI模型进行了优化。执行 ollama run deepseek-r1 就能自动下载并运行模型。数据完全留在本地,隐私无忧。
  • 云API(DeepSeek API、OpenAI等) :无需本地显卡,按调用量付费,开箱即用。

对于个人知识库,推荐先从Ollama + DeepSeek入手——免费、隐私保护、够用。

2.2 向量数据库(知识的仓库)

向量数据库是RAG系统的核心存储组件。以下是主流选择:

数据库特点适合场景
Chroma轻量级,Python原生,上手最快快速原型、个人项目
Qdrant性能优秀(5-8ms),单服务部署简单中小规模生产项目
Milvus性能最强(4-6ms),但需3个服务(etcd+MinIO)大规模、企业级
PgVectorPostgreSQL扩展已有PostgreSQL的项目

个人项目推荐从Chroma或Qdrant开始,资源占用低,部署简单。

2.3 一站式平台

如果你不想自己拼装各个组件,这些开源平台可以一站式搞定:

  • AnythingLLM:开箱即用,支持多种文档格式,可本地部署.
  • Dify:功能全面的开源LLM应用开发平台,支持可视化工作流
  • FastGPT:国产开源,知识库功能强大,高性能RAG框架
  • MaxKB:轻量级,知识库优先的垂直解决方案

三、动手搭建:两种路径

路径一:零代码/低代码

步骤1:安装Ollama并下载模型

# 安装Ollama(Mac/Linux)
curl -fsSL https://ollama.com/install.sh | sh

# 下载DeepSeek模型(7B版本,约4GB)
ollama pull deepseek-r1:7b

# 下载嵌入模型(用于向量化)
ollama pull nomic-embed-text

步骤2:安装AnythingLLM

从 anythingllm.com 下载对应系统的安装包并安装。

步骤3:配置并创建知识库

打开AnythingLLM后:

  1. 在设置中选择LLM提供商为Ollama,指定DeepSeek模型
  2. 选择向量数据库(默认LanceDB即可)
  3. 选择嵌入引擎为Ollama,选用nomic-embed-text
  4. 创建工作区,上传你的文档(PDF、Word、Markdown等)
  5. 等待向量化完成(300页文档约需2分钟)

完成后,你就可以在工作区提问了——AI的回答将基于你上传的文档

路径二:开发者自定义(适合有编程需求)

适合想把AI知识库能力集成到自己现有的项目中的场景

这里开发语言以PHP,项目以诗词API为例,这里主要理解实现流程

步骤1:部署Qdrant向量数据库

# 使用Docker一键启动

docker run -d --name qdrant \
  -p 6333:6333 \
  -v $(pwd)/qdrant_storage:/qdrant/storage \
  qdrant/qdrant

启动后,通过 http://localhost:6333/dashboard 可以访问Web管理界面。

步骤2:安装PHP客户端

composer require tenqz/qdrant

步骤3:将数据向量化并写入Qdrant

<?php
use Tenqz\Qdrant\QdrantClient;
use Tenqz\Qdrant\Transport\Infrastructure\Factory\CurlHttpClientFactory;

// 连接Qdrant
$factory = new CurlHttpClientFactory();
$httpClient = $factory->create('localhost', 6333);
$client = new QdrantClient($httpClient);

// 创建集合(需指定向量维度,如768或1536)
$client->createCollection('poems', 1536, 'Cosine');

// 从MySQL读取诗词,生成向量,写入Qdrant
// 假设$poems是从MySQL取出的诗词数组
foreach ($poems as $poem) {
    $vector = callEmbeddingAPI($poem['title'] . $poem['content']);
    $client->upsertPoints('poems', [[
        'id' => $poem['id'],
        'vector' => $vector,
        'payload' => ['title' => $poem['title'], 'author' => $poem['author']]
    ]]);
}

步骤4:实现问答接口 (调用大模型API生成回答)

用户提问时的完整流程:

// 1. 接收用户问题
$question = $_POST['question'];

// 2. 将问题向量化(使用相同的嵌入模型)
$queryVector = callEmbeddingAPI($question);

// 3. 在Qdrant中检索最相似的5首诗词
$results = $client->search('poems', $queryVector, 5);

// 4. 根据返回的ID从MySQL查询完整诗词内容
$poemIds = array_column($results, 'id');
$poems = $db->query("SELECT ... FROM poems WHERE id IN (...)");

// 5. 构建Prompt
$context = "【参考诗词】\n";
foreach ($poems as $poem) {
    $context .= "《{$poem['title']}{$poem['author']}{$poem['content']}\n";
}

$prompt = "你是一位古诗词专家。请根据以下参考资料回答用户的问题。\n\n";
$prompt .= $context . "\n用户问题:{$question}\n";
$prompt .= "注意:请基于参考资料回答,严禁编造不存在的诗句。";

// 6. 调用大模型API生成回答
$reply = callLLMAPI($prompt);

// 7. 返回给前端
echo json_encode(['answer' => $reply]);

// 流式返回前端:接收LLM返回的流式数据,通过SSE或WebSocket实时推送给用户页面(打字机效果)。

步骤5:存储对话记录(可选)

可将用户问题和AI回答存入MySQL,用于后续优化或历史记录。

四、注意事项

4.1 嵌入模型必须一致

写入和查询时向量化必须使用同一个嵌入模型,否则向量空间不对齐,检索结果会完全错误

4.2 数据质量决定一切

上传前建议:

  • 去除重复内容
  • 统一术语(如“AI”与“人工智能”)
  • 修正格式错误

4.3 切片策略要合理

将长文档切成小块时,建议按段落或标题切分(语义切分),而非简单按固定字数切分。每个切片建议保留10%-20%的重叠,避免切断完整语义。

4.4 Top K值不宜过大

检索时返回的文档块数量(K值)建议设为3-5。太多会让AI的上下文过长,既增加Token费用又容易丢失重点。

4.5 硬件门槛参考

  • 最低配置:2核CPU、4GB内存
  • 推荐配置:4核8GB以上
  • 本地模型:如需运行7B以上模型,建议16GB内存+8GB显存GPU

五、一些误区解释

5.1 什么需要向量数据库?

假设业务使用了MySQL(主数据源),只能回答“作者是李白的诗”或“标题带‘月’字的诗”。而 Qdrant(语义搜索):能回答“描写孤独寂寥心情的诗”。即使诗里没有“孤独”二字,只要向量相似度匹配,它也能把“举杯邀明月,对影成三人”找出来。

向量搜索引擎将文本转换成高维空间中的“坐标”,把“语义相似”转化为“空间距离近”。

通常会配合使用:

  • MySQL(主数据源):负责存储诗词的完整信息(ID、标题、作者、全文),作为你的唯一事实来源

  • Qdrant(索引引擎):只存储向量元数据指针(如 poem_id)。

  • 协同流程

    • 写入时:存数据进 MySQL,同时生成向量存进 Qdrant。
    • 查询时:用户问“表达壮志难酬的诗” -> Qdrant 快速算出最相似的 Top 5 poem_id -> PHP 拿着这 5 个 ID 去 MySQL 查完整内容 -> 返回给前端。

5.2 数据用Qdrant向量查询,AI 参与的意义是什么?

如果只查 Qdrant,那你得到的是一个“搜索引擎”;AI 的参与,是把这个“搜索结果”变成“智能对话”。

AI 让你从“给数据”升级成了“给答案”。

AI 具体参与的三大环节

  1. 意图润色(可选):用户口语化提问(如“有没有那种特别惨的诗”),AI 可先将其改写为 Qdrant 更容易匹配的正式查询(如“表达悲惨境遇的古诗”),提高检索命中率。
  2. 答案合成(核心):Qdrant 查出 Top 5 首诗的 ID 后,你从 MySQL 取出全文,将这些诗文作为“参考资料”塞进 Prompt,让大模型阅读后,用自然、流畅的人话来回答用户。它还能做到“只参考资料,不知道就说不知道”,杜绝幻觉。
  3. 后续交互:用户追问“第一首是谁写的”,AI 会基于刚才的上下文直接回答,不再需要查 Qdrant。这靠的是大模型的记忆(上下文)能力