乐于分享
好东西不私藏

Day 17: 知识库自动更新:新增文档自动入库

Day 17: 知识库自动更新:新增文档自动入库

一句话概括:配置 cron 任务,每周扫描指定文件夹,把新文件自动加入知识库
预计耗时:15 分钟 · 方向:知识库更新

0|先聊两句

昨天搭好了 RAG 知识库,AI 终于能读懂你的笔记了。但有个场景马上就会遇到:

你写了一篇新笔记,保存到文件夹 → 然后呢?

打开 AnythingLLM → 找到工作区 → 点击 Upload → 选中文件 → 等它处理完。

操作上也就几步,但如果天天写笔记、天天收藏文章,每次都手动上传就烦了。

今天的目标是:把"我放文件进去"→"知识库自动更新"这两个步骤连起来。

↑ cron 定时触发扫描脚本,新文件自动进入知识库


1|思路

整个自动化流程分三层:

定时触发器(cron / systemd-timer)
    ↓ 每周日 10:00
扫描脚本(bash / python)
    ↓ 发现新文件或变更文件
AnythingLLM API / 文件系统操作
    ↓ 新文件入库

AnythingLLM 目前没有官方的 CLI 批量导入接口,但有两种方式实现自动更新:

  1. 简单方案
    :用 Docker volume 直接共享文件夹 → AnythingLLM 的文档目录
  2. API 方案
    :通过 AnythingLLM 的内部 API 批量上传(需要反代)

今天我们用方案 1——最简单、最可靠、不需要研究 API 文档。


2|方案:共享文件夹

AnythingLLM 的 Docker 容器启动时,已经把数据目录挂载到了 ~/anythingllm-data。但上传的文档存在容器内部,不方便直接操作。

更好的做法:在宿主机上指定一个"观察文件夹",AnythingLLM 的文档存储目录指向这里:

# 创建观察文件夹
mkdir -p ~/kb-watch

# 停止并移除旧容器
docker stop anythingllm
docker rm anythingllm

# 重新运行,挂载观察文件夹
docker run -d \
  --name anythingllm \
  --restart unless-stopped \
  -p 3001:3001 \
  -v ~/anythingllm-data:/app/server/storage \
  -v ~/kb-watch:/app/server/storage/documents/watch \
  mintplexlabs/anythingllm

然后在 AnythingLLM 的设置里,找到 "Document Watcher" 或 "Watch Directory",把路径设为 /app/server/storage/documents/watch

⚠️ 不同版本的 AnythingLLM 对 Watch Directory 的支持不一样
。如果你的版本没有这个功能,可以用下面的脚本方案——cron 定时把新文件复制到 AnythingLLM 的 uploads 目录,然后触发重新处理。

如果 Watch Directory 不生效,可以用更直接的方法:脚本检测到新文件后,通过 AnythingLLM 的 /api/document/upload 接口上传。我们继续往下看。


3|脚本方案:检测 + 上传

创建一个脚本 ~/scripts/update-kb.sh

#!/bin/bash
# 知识库自动更新脚本
# 用法:放到 cron 里,定期扫描并上传新文件

WATCH_DIR="$HOME/kb-watch"
PROCESSED_LOG="$HOME/kb-watch/.processed.log"
ANYTHINGLLM_URL="http://localhost:3001"
WORKSPACE_ID="your-workspace-id"  # 替换为你的工作区 ID

# 确保 watch 目录存在
mkdir -p "$WATCH_DIR"
touch "$PROCESSED_LOG"

# 遍历所有文件(排除隐藏文件)
find "$WATCH_DIR" -type f ! -name ".*" | while read file; do
  basename=$(basename "$file")

  # 检查是否已经处理过
  if grep -q "^$basename$" "$PROCESSED_LOG" 2>/dev/null; then
    continue
  fi

  echo "[$(date)] Processing: $basename"

  # 通过 AnythingLLM API 上传
  curl -s -X POST "$ANYTHINGLLM_URL/api/document/upload" \
    -F "file=@$file" \
    -F "workspace_id=$WORKSPACE_ID" > /dev/null

  if [ $? -eq 0 ]; then
    echo "$basename" >> "$PROCESSED_LOG"
    echo "[$(date)] Uploaded: $basename"
  else
    echo "[$(date)] Failed: $basename"
  fi
done

给脚本执行权限:

chmod +x ~/scripts/update-kb.sh

4|配置 cron

编辑当前用户的 crontab:

crontab -e

添加一行:

# 每周日 10:00 同步知识库
0 10 * * 0 /home/zgt/scripts/update-kb.sh >> /home/zgt/logs/kb-update.log 2>&1

如果你希望每天跑一次(比如你每天都会写笔记):

# 每天 10:00 同步知识库
0 10 * * * /home/zgt/scripts/update-kb.sh >> /home/zgt/logs/kb-update.log 2>&1

保存后 cron 自动生效。验证:

crontab -l
# 应该能看到你刚添加的那一行

确保日志目录存在:

mkdir -p ~/logs

5|手动测试

放一个测试文件到观察目录,然后手动跑一次脚本:

echo "这是一条测试知识库自动更新的笔记。" > ~/kb-watch/测试文件.md
bash ~/scripts/update-kb.sh

检查日志:

cat ~/logs/kb-update.log

去 AnythingLLM 的工作区确认文档是否出现。


6|另一种方案:systemd-timer

如果你觉得 cron 不太方便调试,也可以使用 systemd-timer。它优势是日志天然的 systemd 集成(用 journalctl 查看):

创建 service 文件:

sudo nano /etc/systemd/system/kb-update.service
[Unit]
Description=知识库自动更新服务

[Service]
Type=oneshot
ExecStart=/home/zgt/scripts/update-kb.sh
User=zgt
StandardOutput=journal
StandardError=journal

创建 timer 文件:

sudo nano /etc/systemd/system/kb-update.timer
[Unit]
Description=每周扫描知识库

[Timer]
OnCalendar=Sun *-*-* 10:00:00
Persistent=true

[Install]
WantedBy=timers.target

启用:

sudo systemctl daemon-reload
sudo systemctl enable --now kb-update.timer

查看状态:

systemctl list-timers kb-update.timer
journalctl -u kb-update.service -f  # 查看运行日志

7|快速检查清单

[ ] 创建观察文件夹:mkdir -p ~/kb-watch
[ ] 创建脚本:~/scripts/update-kb.sh(记得替换 WORKSPACE_ID)
[ ] 给权限:chmod +x ~/scripts/update-kb.sh
[ ] 测试:放文件 → 手动跑脚本 → 确认入库
[ ] 配置 cron:crontab -e 添加 0 10 * * 0 ...
[ ] (或改用 systemd-timer)
[ ] 验证:crontab -l 确认任务存在
[ ] 长期:偶尔检查日志:cat ~/logs/kb-update.log

8|今日小结

步骤
做了什么
效果
✅ 创建观察文件夹
~/kb-watch 放新文件
统一入口
✅ 编写更新脚本
检测新文件 → 自动入库
不需要手动上传
✅ 配置 cron
每周日 10:00 自动执行
一劳永逸
✅ 日志跟踪
记录每次运行的结果
出了问题可查

现在你的知识库能做到"写完笔记自动入库,不用人工介入"。放一个新的 Markdown 文件到 ~/kb-watch,等到下一次 cron 触发,AI 就能在新笔记的基础上回答问题了。

明天和后天是两个 AI 编程专题——不需要会写代码,让 AI 帮你写脚本、读代码。


📌 小预告
Day 18:AI 帮你写脚本——以文件整理器为例。说一句需求,AI 生成 Python 脚本,你复制保存就能用。

Day 17 完 · 下一篇:AI 帮你写脚本——以文件整理器为例


⚠️ 如果你卡住了
• cron 没执行 → 检查 cron 是否在运行:systemctl status cron
• 脚本跑起来没反应 → 日志里看错误:cat ~/logs/kb-update.log,大概率是 WORKSPACE_ID 没填对
• 怎么找到 WORKSPACE_ID? → 在 AnythingLLM 打开工作区,地址栏 URL 里有类似 /workspace/abc123 的 ID
• 不想用 API → 最简单方法:每周末手动上传一次,也不费事