文件出现在文档列表里,Query回答却没有引用,不能直接判断模型读不懂中文。AnythingLLM的文档库、工作区和嵌入是三层状态。本文从完整Docker部署开始,用一份模拟FAQ走到带来源的回答,再按这三层定位断点。配置根据官方资料整理,未运行Docker、下载模型或实测问答,示例不含真实业务资料。
1. 用完整Compose建立资料问答环境
AnythingLLM可把FAQ、产品手册放入工作区,供客服、开发按资料查询。10月26日发布的1.19.0加入Docker内置LLM,本例用单容器CPU推理,不另部署Ollama,也不使用付费API密钥。
在Linux Docker主机的Bash检查:
bash
docker version
docker compose version
curl --version
free -h
df -h "$HOME"
Docker需有服务端信息,Compose需为V2。内存、磁盘还要容纳模型与运行开销;x86主机核AVX2,ARM64不套用此要求。缺工具、服务无权限或资源不足时先处理,再继续。
bash
mkdir -p "$HOME/anythingllm-demo/storage"
cd "$HOME/anythingllm-demo"
touch storage/.env
sudo chown -R 1000:1000 storage
sudo chmod 700 storage
sudo chmod 600 storage/.env
cat > compose.yaml <<'YAML'
name: anythingllm-faq-demo
services:
app:
image: ghcr.1ms.run/mintplex-labs/anything-llm:1.19.0
ports:
- "127.0.0.1:3001:3001"
environment:
STORAGE_DIR: /app/server/storage
ENABLE_BUILT_IN_LLM: "true"
EMBEDDED_LEMONADE_REGISTRY: modelscope
volumes:
- ./storage:/app/server/storage
- ./storage/.env:/app/server/.env
restart: unless-stopped
YAML
docker compose config --quiet
这里使用新建演示目录。镜像按UID/GID1000运行,.env要先创建为文件;配置校验报错就按行号修正,不继续启动。命名空间和固定标签完整保留,通过毫秒镜像获取GHCR应用镜像:
bash
docker compose pull
拉取失败先处理仓库、权限或网络报错;成功后执行:
bash
docker compose up -d
docker compose ps
curl -I http://127.0.0.1:3001/
应有运行中的服务和HTTP响应。持续连接失败、5xx、反复退出时先查看docker compose logs --tail=100 app;数据库打开失败查storage权限,不以容器running替代应用验收。
2. 先区分推理模型与中文嵌入
在主机浏览器打开http://127.0.0.1:3001/。首次选Just me,启用Would you like to set up a password?并设置Instance Password。若跳过,到Settings → Security打开Password Protection,保存后验证重新进入需要密码。
远程部署时,在自己电脑另开终端,将占位地址换为自己的主机:
bash
ssh -N -L 3001:127.0.0.1:3001 用户名@主机地址
保持隧道打开,在电脑浏览器访问同一回环地址;端口占用先释放,连接失败先修SSH,不改成公网监听。
LLM选Built-in,在Show all models下载并选用Qwen3.5-2B。这是短FAQ的示例选择,文件大小不代表总内存需求;不够时换小模型或增加资源。嵌入提供者选AnythingLLM Default、模型选multilingual-e5-small,向量库用LanceDB。中文检索不要直接把英文默认MiniLM当已适配;换嵌入模型后需要重新嵌入。
ModelScope配置只用于内置LLM模型仓库。引擎、首次聊天可能需要的推理运行时、权重和嵌入模型分别下载;嵌入仍从其官方分发源获取,失败可回官方CDN。某一项下载失败,就停在对应步骤看进度与日志;镜像到位不代表模型齐全,也不代表默认断网可用。
3. 创建能核对原文的中文FAQ
在打开浏览器的电脑上执行下面命令;浏览器就在Docker主机时,可仍在主机执行。Linux/macOS终端可用:
bash
mkdir -p "$HOME/anythingllm-demo-input"
cat > "$HOME/anythingllm-demo-input/faq-demo.md" <<'FAQ'
# 模拟活动FAQ
资料版本:DEMO-20261029-r1。以下全部为虚构演示规则。
## 规则A:报名截止
演示活动报名于2026年10月30日18:00截止,时区为北京时间。
## 规则B:优惠叠加
演示活动的体验券不能与会员折扣叠加使用。
FAQ
cat "$HOME/anythingllm-demo-input/faq-demo.md"
确认版本号和两条规则都存在。远程主机只运行应用,网页文件选择框读的是自己电脑,不能填写远程文件路径代替上传。

4. 核对上传、归属和嵌入三层状态
点New Workspace建立faq-demo并保存。悬停工作区名,点上传箭头进入文档管理,使用Click to upload or drag and drop上传文件。选中它,点Move to Workspace,然后点右侧Save and Embed,等待完成。
| 检查位置 | 目前能证明什么 | 下一步 |
|---|---|---|
| 文档库看到文件 | 已上传,尚不能证明这个工作区可检索 | 选中并移入当前工作区 |
| 工作区侧列出文件 | 归属已选,尚需完成嵌入 | Save and Embed,等待无错误完成 |
| 嵌入完成 | 可以进入问答验证,不代表答案正确 | 切Query,检查Sources原文 |
嵌入下载或处理报错时先看错误和应用日志,不反复上传同名文件掩盖问题。工作区不符就回到正确工作区操作;嵌入模型刚改过,则重新嵌入当前资料。
5. 用资料内外两题检查检索结果
打开工作区齿轮的Chat Settings,切到Query,等待自动保存,重新打开确认。先问:"这份模拟活动什么时候截止报名?请给出资料依据。"
预期应对应2026年10月30日18:00及北京时间。点Sources打开来源片段,核对faq-demo.md、版本号和规则A。日期对而没有匹配来源,仍不能交付为本次验收通过;先回查上一节三层状态,再核Query和模型设置。
新开对话问:"这份模拟活动退款几天到账?"原文没有退款规定,应说明资料不足。若给出具体天数,停止业务使用,回查检索和模式;Query不能保证模型没有幻觉。记录问题、回答与来源,比凭聊天流畅程度判断是否可用更直接。
排查时固定FAQ和两道问题,一次只调整一项。先记录原有模型、嵌入名称和错误位置,再改设置;不要同时换LLM、嵌入和文档。否则下一次即便答对,也无法判断是哪项修正起作用。Sources若出现旧文件或其它版本,先查资料归属与来源,不以一次正确日期排除旧资料干扰。
6. 重建后复查同一份资料
回到Docker主机原目录执行:
bash
cd "$HOME/anythingllm-demo"
docker compose up -d --force-recreate
docker compose ps
服务恢复后查看工作区、文档和设置,再重复两题。资料丢失先检查原目录及storage、.env两条挂载;引用不符回查工作区和嵌入,不要立即重新上传。
bash
docker compose down
停止后本地storage和.env保留,原目录再次启动可继续检查;持久化仍需另做备份。一次短FAQ验证通过后,再逐步增加真实手册,并持续核对来源与资料外问题。