目录

从文档管理到可对话知识库:个人知识库最佳实践方案


1. RAG个人知识库和文档管理

  • 很多人都会遇到以下的问题:

    • 个人的技术资料和工作上累积的文档越来越多

    • PDF、图片、文档散落在各个目录

    • 想找一份资料时只能靠文件名或全文搜索

    • 知道“某份文档里有答案”,但找不到在哪

一般来说,有大量资料和技术文档的资产的管理,要么放本地要么丢同步盘,可持久化好一些的解决方案就是部署文档管理系统管理(如paperless-ngx等).

/40f448c2-1bf7-4d69-83bd-d9a3600ffc3d/776.png

那么当文档越来越多的情况下,自己已经几乎完全忘记文档内容时,如何查询和检索便成为了一个新的挑战.

随着现在大语言模型的发展,一个新的解决方向变得可行:

让电脑“读懂”你的文档,并且可以直接用自然语言提问

这就是RAG知识库,目前这类方案中,anythingllm算是在强大和简单易用性中平衡的最好的产品了,而且最重要的是,部署简单和免费.

但anythingllm目前专注于RAG方向,对于原始文档的管理查找的功能有缺失,当我想在anythingllm中查看和管理原文档时,发现几乎难以实现,那么今天我这里探索总结的一个方案就是:

查看管理原始文档资产,并且同时同步成AI时代可对话、可推理的知识库

这篇文章,就是我最终探索出来的一套结合文档管理和RAG知识库优点个人知识库部署实践.可以方便的在Linux的个人服务器或者NAS上运行和部署.

2. 我选择了哪些组件

Paperless-ngx:文档资产管理

选择 Paperless-ngx 的原因非常明确:

  • 成熟稳定

  • 多文档格式支持, 有 OCR 能力(Tesseract)

  • 有完整的API接口

  • 支持规则化归档(document type / correspondent / tags)

  • 完全私有化

AnythingLLM: RAG 与 Workspace 的结合体

AnythingLLM 的优势在于:

  • Workspace 抽象非常适合“知识域”

  • 文档在Workspace中embedding后即可依赖LLM实现检索

  • 可对接本地 Ollama

  • 简单易上手

  • 完全私有化

Ollama:本地LLM模型以及Embedder

大名鼎鼎的Ollama就不用多介绍了,这里我们跑两个模型,qwen3-embedding:0.6b和qwen3:4b,供AnythingLLM做Embedder和LLM使用(更加强大的LLM提供商很多,可以自行选择)

paper2anything:我开发的一款开源的同步工具

这个工具是我为解决以上问题开发的依据paperless-ngx的tag同步到anythingllm的workspace的工具,支持多tag增改删的同步,项目内有详细说明,没花几天时间写代码,只是共享一下方法并不是想要推广自己的项目,但还是欢迎使用并提issue,求star

项目地址:

👉 https://github.com/oserz/paper2anything

它做的事情包括:

  • 调用 Paperless API 获取文档元数据

  • 根据tag映射到Workspace

  • 通过 AnythingLLM API 上传文档和embedding到Workspace

  • 做增量同步(新增 / 修改 / 删除)

  • 本地保存同步状态

3. 部署方法和 Docker Compose 示例

  • Paperless-ngx的部署,这是一份相对较齐全的可用配置(省略映射路径等选项):
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

version: "3.9"

services:
  broker:
    image: redis:7
    container_name: paperless-redis
    restart: unless-stopped
    volumes:
      - /your-path/redis:/data

  db:
    image: postgres:15
    container_name: paperless-postgres
    restart: unless-stopped
    environment:
      POSTGRES_DB: paperless
      POSTGRES_USER: paperless
      POSTGRES_PASSWORD: paperless
    volumes:
      - /your-path/pgdata:/var/lib/postgresql/data

  paperless:
    image: ghcr.io/paperless-ngx/paperless-ngx:latest
    container_name: paperless-ngx
    restart: unless-stopped
    depends_on:
      - db
      - broker

    ports:
      - "8888:8000"

    environment:
      # === 基础 ===
      PAPERLESS_REDIS: redis://broker:6379
      PAPERLESS_DBHOST: db
      PAPERLESS_DBNAME: paperless
      PAPERLESS_DBUSER: paperless
      PAPERLESS_DBPASS: paperless

      # === 管理员(首次启动)===
      PAPERLESS_ADMIN_USER: admin
      PAPERLESS_ADMIN_PASSWORD: admin123
      PAPERLESS_ADMIN_EMAIL: admin@example.com

      # === 时区 & 语言 ===
      PAPERLESS_TIME_ZONE: Asia/Shanghai
      PAPERLESS_DEFAULT_LANGUAGE: zh-hans

      # === OCR(屏蔽可能中文的OCR下载失败)===
      PAPERLESS_OCR_LANGUAGE: eng #chi_sim+eng
      PAPERLESS_OCR_CLEAN: clean
      PAPERLESS_OCR_MODE: skip
      # PAPERLESS_OCR_LANGUAGES: chi_sim

      # === 文件命名(新语法)===
      PAPERLESS_FILENAME_FORMAT: "{{ created_year }}/{{ correspondent }}/{{ title }}"

      # === 性能 ===
      PAPERLESS_TASK_WORKERS: 2
      PAPERLESS_THREADS_PER_WORKER: 2

      PAPERLESS_URL: (your domain address)

    volumes:
      - /your-path/data:/usr/src/paperless/data
      - /your-path/media:/usr/src/paperless/media
      - /your-path/consume:/usr/src/paperless/consume
  • 在 Paperless 中做的事情

    完成部署后,你需要做三件事:

    1. 创建管理员账号

    2. 上传文档

    3. 给文档设置或者分配标签

    这些信息将直接决定后续知识库的结构

  • anythingLLM的docker compose示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

version: "3.9"

services:
  anythingllm:
    image: mintplexlabs/anythingllm:latest
    container_name: anythingllm
    restart: unless-stopped

    ports:
      - "3001:3001"

    environment:
      # === 基础配置 ===
      - STORAGE_DIR=/app/server/storage
      - JWT_SECRET=your_password
      - LLM_PROVIDER=ollama
      - EMBEDDING_ENGINE=ollama

      # === Ollama 配置(本机或同一 Docker 网络)===
      - OLLAMA_BASE_URL=http://your-domain-addr:11434

      # === 日志 ===
      - LOG_LEVEL=info

    volumes:
      # === 核心数据(必须迁移)===
      - /your-path/data/storage:/app/server/storage

    networks:
      - anythingllm-net
  
networks:
  anythingllm-net:
    driver: bridge
  • ollama的部署和设置说明

    这部分比较简单,就略过不说了,推荐ollama拉取qwen3-embedding:0.6b的模型设置到anythingLLM的embedder中,这算是embedding的最强模型了.

    LLM模型设置可以根据自己的条件来,本人测试qwen3:4b在markdown文档下可用,但pdf文档基本上就是乱答了,国内用收费模型如deepseek都体验不错.

    /40f448c2-1bf7-4d69-83bd-d9a3600ffc3d/777.png

  • 同步设置和说明

    同步工具下载地址: https://github.com/oserz/paper2anything/releases/

    在同步之前,一定要先设置好anythingllm中的embedder等选项再开始同步

    根据config.json.example中填入url地址,和token和api_key,改名成config.json运行p2a即可

    anythingllm的api_key在设置 –> 开发者API

    paperless-ngx的token在账户信息 –> API认证字符串

    或者运行./sync_loop.sh即可按半小时一次更新同步内容

  • 最终运行效果图:

/40f448c2-1bf7-4d69-83bd-d9a3600ffc3d/778.jpg

/40f448c2-1bf7-4d69-83bd-d9a3600ffc3d/779.jpg