📎 配套脚本附件正文未内嵌 · 共 4 个 · 点开可在线查看
📚 另需公共库(正文未重复内嵌,点名字直接看):_agent_cfg.py、_bootstrap.py、_config.py、_plugin_util.py
📂 查看全部 761 个脚本附件 →
⚠️ 脚本内含明文凭据(与本页正文一致),请勿在公网环境直接运行。
总纲 · 汇总

内部智能体配置文档专题汇总

理论流程、完整代码、CPU/GPU 双路径、实战问题总表与专题索引。

内部智能体配置文档 · 专题汇总(理论 + 操作 + 实战记录)

本文定位:把 docs/md_cursor/ 下全部 Cursor 专题、手册、SOP、作业的理论框架、执行流程、完整代码、CPU/GPU 建议、实战问题解法汇总成一份「配置总纲」。

适用环境:192.168.110.207(Dify 1.16.1 + Xinference CPU + Langfuse + Weaviate)+ 116.62.10.183(vLLM Qwen3.6-27B,H20 共享 GPU)。

阅读方式:先读本文第二、五部分建立全局图;具体操作打开对应专题 md/html;跑代码只改 /opt/workbuddy/scripts_cursor/内部智能体配置文档专题汇总/_config.py。

HTML 成品:docs/html_cursor/内部智能体配置文档专题汇总_cursor.html

运行环境:业务脚本均在 207 固定目录 /opt/workbuddy 执行,Python 为 /usr/bin/python3。 Windows 开发机仅保留 _probe_* 调试脚本;同步命令:python scripts_cursor/完整代码约定/00_部署_workbuddy到207.py。


目录

  1. 第一部分 文档体系与阅读地图
  2. 第二部分 系统架构与执行流程(理论)
  3. 第三部分 环境常量与服务器角色
  4. 第四部分 主线三步:理论 + 操作步骤
  5. 第五部分 CPU 与 GPU 双路径建议(本系统 + 未来扩展)
  6. 第六部分 完整代码程序(可直接运行)
  7. 第七部分 实战问题与解决方案总表
  8. 第八部分 对本系统的专业建议
  9. 第九部分 全部专题 md / html 对照索引

第一部分 文档体系与阅读地图

1.1 这套文档解决什么

目标不是「只装 Dify」,而是在本机搭一套可运维的企业内部智能体:

能力典型产物对应文档
制度 / 知识库问答播城行政问答智能体手册 + 专题十五
观测 Trace / TokenLangfuse 4.12Langfuse 部署 + 连接
检索排序更准Rerank Top-1 变答题条款专题十三
工具调用运维巡检 Agent(HTTP 工具)作业 1
意图路由客服 Workflow(知识库/工单/人工)作业 2
日常排障搜不到 / 答偏 / 变慢企业 AI 排错 SOP + 专题十四
SLA 大盘Prometheus :9092 + Grafana :3001集成环境部署 + 作业 8

1.2 推荐阅读顺序(不要从专题三看到十五)

text
① 安装手册 + 专题十五        → 平台、模型、知识库、新 Agent 能问能答
② Langfuse 部署 + 连接       → 每轮问答能在 Langfuse 点开 Trace
③ 专题十三 Rerank            → 命中测试排序变准;对话引用关键数字
④ 按症状查排障专题 / SOP     → 出问题再查,不要改主线正文
⑤ 作业 1                     → 第一个 HTTP 工具 Agent
⑥ 作业 2                     → Workflow 意图路由(知识库 + HTTP + 模板)

口诀(创建和改配置时必记):

工作室里没有的开关 → 工作区「设置 → 模型供应商」或 dify_api.py API。

改 Agent 快照后 → 不要点「构建 / 发布」(会把 max_tokens 写回 null)。

1.3 代码与文档约定

目录内容
docs/md_cursor/Markdown 专题,文件名 *_cursor.md
docs/html_cursor/HTML 成品,文件名 *_cursor.html
/opt/workbuddy/scripts_cursor/完整 Python(每步一个 .py)
scripts_bash_cursor/完整 Bash
patches_cursor/完整补丁 / OpenAPI / env

维护命令:

bash
python tools/sync_doc_code.py --all   # 展开本文等文档里的完整代码嵌入
python gen_all_html.py                # 批量 md → html
python gen_index_html.py              # 更新索引页

第二部分 系统架构与执行流程(理论)

2.1 总体拓扑

text
                    ┌─────────────────────────────────────────┐
                    │  用户浏览器 / 业务方                      │
                    └──────────────────┬──────────────────────┘
                                       │ HTTP
                    ┌──────────────────▼──────────────────────┐
                    │  192.168.110.207                         │
                    │  ┌─────────┐  ┌──────────┐  ┌──────────┐  │
                    │  │ Dify    │  │Langfuse  │  │Xinference│  │
                    │  │ 1.16.1  │  │ :3000    │  │ :9997    │  │
                    │  │ :80/443 │  │          │  │ CPU 推理 │  │
                    │  └────┬────┘  └────▲─────┘  └────┬─────┘  │
                    │       │            │ Trace         │        │
                    │       │     bge-m3 / rerank        │        │
                    │       │                            │        │
                    │  ┌────▼────┐  Weaviate(:8088中继)  │        │
                    │  │ Postgres│◄──────────────────────┘        │
                    │  │ Redis   │                                 │
                    │  └─────────┘                                 │
                    └──────────────────┬──────────────────────────┘
                                       │ OpenAI 兼容 API
                    ┌──────────────────▼──────────────────────┐
                    │  116.62.10.183(GPU 机)                   │
                    │  vLLM Qwen3.6-27B :8000                   │
                    │  H20 96GB,与 mxh_env/mxh_live 共享        │
                    │  max-num-seqs=8, gpu-mem-util=0.75        │
                    └──────────────────────────────────────────┘

角色分工:

机器当前职责未来有 GPU 时可扩展
207Dify 全家桶、Xinference(CPU)、Langfuse、Weaviate、作业 1 模拟 API可继续只做控制面;或把 Xinference 迁到 116
116仅 vLLM 大模型推理可同时跑 Xinference GPU(Embedding + Rerank)

2.2 知识库问答完整执行流程(新 Agent)

这是「播城行政问答」每一轮对话在后台的实际路径。理论部分必须理解:界面显示的工具名 ≠ 当前正在执行的层。

text
【阶段 0】用户在新对话输入问句
    │
    ▼
【阶段 1】docker-api-1 接收
    POST /console/api/agent/<agent_id>/chat-messages
    读取 agent_config_snapshots(不是知识库页的实时配置)
    │
    ▼
【阶段 2】docker-agent_backend-1 编排
    加载快照:model / prompt / knowledge.sets[].retrieval / tools
    │
    ▼
【阶段 3】第一次 LLM 调用(116 vLLM)
    模型决定:是否调用 knowledge_base_search
    界面出现「思考中」或工具框
    │
    ▼
【阶段 4】知识检索(207 本机)
    4a. Embedding:Xinference bge-m3 → 向量
    4b. Weaviate:Top-N 召回(经 8088 中继,避免 IPv6 偶发失败)
    4c. Rerank(若快照开启):Xinference bge-reranker-v2-m3 重排
    4d. 取 Top-K 片段写入 Prompt
    │   ※ 界面可能仍显示 knowledge_base_search,但 4 可能 2 秒就结束
    ▼
【阶段 5】第二次 LLM 调用(116 vLLM)
    Prompt = system + 历史 + Top-K 制度片段 + 用户问句
    Qwen3.6 先 thinking(计入 max_tokens),再输出正文
    │   ※ thinking 吃满 max_tokens → 空泡 / token limit 8192(专题十二)
    ▼
【阶段 6】写 messages 表 + 可选 Langfuse
    status=normal / error
    Celery worker 推 Trace(若已配置 trace-config)

配置生效的三层(不要找错):

text
工作区「设置 → 模型供应商」     ← Qwen / bge-m3 / Rerank 凭据、默认模型
        │
知识库页 retrieval_model       ← 命中测试用这套
        │
Agent 快照 + 草稿              ← 对话真正用的 Top-K / Rerank / max_tokens / 绑库

只改知识库页 → 命中测试变好,对话可能仍按旧检索跑(专题十三·问题 7)。

2.3 HTTP 工具 Agent 执行流程(作业 1)

text
用户:「帮我看看 gpu-server-01 的状态」
    │
    ▼
第一次 LLM → 决定调用 getServerStatus(server_name=...)
    │
    ▼
Dify API 工具层(OpenAPI 导入)
    GET http://192.168.110.207:8777/server/status?server_name=gpu-server-01
    (经 ssrf_proxy 出网)
    │
    ▼
FastAPI 模拟服务返回 JSON
    │
    ▼
第二次 LLM → 按 system_prompt 格式化为中文汇报

关键配置点:

2.4 Langfuse 观测链路

text
用户发问 → Dify 对话完成
    │
    ▼
docker-worker-1(Celery 队列 ops_trace)
    读 apps.tracing + trace_app_config
    │
    ▼
POST Langfuse /api/public/ingestion(需 dual 模式)
    │
    ▼
langfuse-clickhouse 存 Trace / Generation / Token

反直觉事实:

  1. Dify 1.16 不读全局 LANGFUSE_* 环境变量,必须走应用级 API 配 trace-config。
  2. Generation Input 往往只有用户原话,看不到逐条 chunk → 召回看命中测试,不是 Langfuse。
  3. Langfuse 4 默认 events_only 会拒收旧 ingestion → web/worker 都要 LANGFUSE_INGESTION_MODE=dual。

2.5 故障定性四分类(排障理论入口)

类型页面messages.status含义
还在跑思考、时间在涨尚无最终行看日志确认卡在哪一层
已失败未刷新空泡、3/3error新开对话,别继续点
成功但慢有正文normal,latency 大性能 / 排队,不是功能坏
明确报错红字 / 400error 有原文对号入座第七部分

第三部分 环境常量与服务器角色

换机器 / 换应用时只改这一处,所有脚本共用。

完整程序:/opt/workbuddy/scripts_cursor/内部智能体配置文档专题汇总/_config.py(常量文件,不是可执行脚本)

编辑/引用:/opt/workbuddy/scripts_cursor/内部智能体配置文档专题汇总/_config.py(换环境时只改此文件)

python
# -*- coding: utf-8 -*-
"""各专题脚本共用的环境常量。换机器/换应用时只改这一处。"""

# Dify 控制台
DIFY_EMAIL = "38205036@qq.com"
DIFY_PASSWORD = "Difyai123456"
DIFY_BASE = "http://192.168.110.207"

# 播城行政问答(专题十三 / 十四 / 十五 / Langfuse 等)
APP_ID = "40e95fd3-e7f5-44f2-a03b-dc3e60413540"
AGENT_ID = "01a012e7-bed3-7574-b0d1-a5cc79a0d3de"
SNAP_ID = "01a0135c-320e-79dc-97a0-94da9b904c13"
DRAFT_ID = "01a012e7-bf60-7673-a894-64551d984a23"
DS_ID = "ee2495bf-c370-49d1-8268-10c51f650fa6"
DS_NAME = "播城内部行政管理知识库"

# Xinference
XF_KEY = "xf-K8H3LiS27H4188XdOyWJj74MWMOlIR9tZbiybDbxbSas7eAI"
XF_URL = "http://192.168.110.207:9997"
XF_ADMIN_USER = "admin"
XF_ADMIN_PASS = "admin1234"
XF_CONTAINER = "xinference"

# 模型
EMBED_MODEL = "bge-m3"
RERANK_MODEL = "bge-reranker-v2-m3"
XINFERENCE_PROVIDER = "langgenius/xinference/xinference"

# vLLM / Qwen(专题一 / 手册 / 十五)
VLLM_BASE = "http://116.62.10.183:8000/v1"
VLLM_KEY = "123456"
QWEN_MODEL = "qwen3.6-27b"
OPENAI_PROVIDER = "langgenius/openai/openai"
QWEN_CTX = 64000
MAX_TOKENS = 32768

# Langfuse
LANGFUSE_PK = "pk-lf-84a76d89-b6b4-4943-b4ea-2dee48d4cda7"
LANGFUSE_SK = "sk-lf-24aa6d73-ed36-4447-9eb6-3ebd446fb298"
LANGFUSE_URL = "http://192.168.110.207:3000"
LANGFUSE_HEALTH = "http://192.168.110.207:3000/api/public/health"

# GPU 机 Xinference(路径 B 时用)
XF_GPU_URL = "http://116.62.10.183:9997"
XF_GPU_CONTAINER = "xinference-gpu"

# Docker 容器名(207)
PG_CONTAINER = "docker-db_postgres-1"
PLUGIN_CONTAINER = "docker-plugin_daemon-1"
DIFY_WORKER = "docker-worker-1"
DIFY_API_CTR = "docker-api-1"
DIFY_DOCKER_DIR = "/dify/dify-main/docker"

# 专题十五 · 新建应用时的工作名(按需改)
NEW_APP_NAME = "播城行政问答智能体"

# 作业 1 · 第一个 Agent 工具调用
SERVER_STATUS_PORT = 8777
SERVER_STATUS_BASE = "http://192.168.110.207:8777"
SERVER_STATUS_PROVIDER = "server_status"
SERVER_STATUS_PROVIDER_ID = "021a4445-098d-4821-81fe-ff0ebc660ecc"
HOMEWORK1_APP_NAME = "运维巡检 Agent"
HOMEWORK1_PROBE_QUERY = "帮我看看 gpu-server-01 的状态"
HOMEWORK1_APP_ID = "d00d0382-ca3f-4cf2-9cc9-0cb5aed9404d"
HOMEWORK1_AGENT_ID = "01a0189c-7d7e-742f-83d1-74c5c16878da"
HOMEWORK1_SNAP_ID = "01a0189c-7d82-777e-9f1a-8af87e14ae38"
HOMEWORK1_DRAFT_ID = "01a0189d-44b0-7191-9b51-44b257b97459"

# 作业 2 · 客服意图路由 Workflow
TICKET_API_PORT = 8778
TICKET_API_BASE = "http://192.168.110.207:8778"
HOMEWORK2_APP_NAME = "客服意图路由工作流"
HOMEWORK2_APP_ID = "f0e82c66-e324-4df7-a1fe-44d6ce6ec7cf"
HOMEWORK2_PROBE_KB = "怎么请假"
HOMEWORK2_PROBE_TICKET = "帮我报修设备"
HOMEWORK2_PROBE_HUMAN = "我要投诉"

# 验收用问句
PROBE_QUERY_KB = "管理人员需要钉钉打卡吗"
PROBE_QUERY_OVERTIME = "法定假日加班的制度是什么,加班费怎么算?"
PROBE_QUERY_LANGFUSE = "请用一两句话说明公司请假流程,这是 Langfuse 完整链路验收。"

3.1 本环境 ID 速查

项值用途
行政问答 app_id40e95fd3-e7f5-44f2-a03b-dc3e60413540Langfuse trace-config
行政 agent_id01a012e7-bed3-7574-b0d1-a5cc79a0d3de对话 API
知识库 IDee2495bf-c370-49d1-8268-10c51f650fa6绑库 / 命中测试
运维巡检 agent_id01a0189c-7d7e-742f-83d1-74c5c16878da作业 1
意图路由 app_idf0e82c66-e324-4df7-a1fe-44d6ce6ec7cf作业 2
vLLMhttp://116.62.10.183:8000/v1Qwen3.6-27B
Xinferencehttp://192.168.110.207:9997bge-m3 + rerank(CPU)
Langfusehttp://192.168.110.207:3000Trace

第四部分 主线三步:理论 + 操作步骤

4.1 第一步 · 部署 Dify(模型 + 知识库 + Agent)

理论目标

结束时:能基于知识库问答;不必已有 Langfuse 或 Rerank。

操作步骤(按序,不可跳)

步做什么文档脚本
0创建前检查:LLM 列表、Xinference、知识库 available专题十五专题十五_00_创建前检查.py
1git clone Dify、docker compose、接 vLLM安装手册 + 专题一手册内 bash
2Xinference 起 bge-m3专题二专题二脚本
3建知识库、分段、等 available手册—
4POST /agent 创建新 Agent 空壳专题十五专题十五_01_创建应用空壳.py(需改为 /agent)
5查 app/agent/snap/draft ID专题十五专题十五_02_查三个ID.py
6绑知识库 + 写 system_prompt专题十五专题十五_05_改Agent快照绑库与Rerank.py
7设 max_tokens=32768(制度+thinking)专题十一/十二专题十五_06_改max_tokens.py
8新开对话验收专题十五专题十五_09_Agent对话验收.py

第一步验收标准

第一步典型卡点(实战汇总,不替代专题正文)

卡点常见现象优先处理
平台未就绪Dify 容器 unhealthy安装手册 二;专题六 weaviate
向量未真跑/v1/models 无 bge-m3专题二 launch
LLM 不可选「不兼容」/ 列表空专题一、专题十
绑库失败Agent 选不到知识库专题三;确认库 available
对话 400 system多条 system 未合并手册 八 chat.py;专题四
空泡/无正文thinking 占满 max_tokens专题十一/十二
配置页 500OpenAPI UUID 当 builtin作业1/专题十六 的 06 修复脚本

上表是路由索引:具体改哪行代码、贴哪段 patch,仍以安装手册 + 对应专题为准,此处不删改原文。


4.2 第二步 · 接上 Langfuse

理论目标

Dify 问一句 → Langfuse 能看到 Trace + Prompt + Token。

操作步骤

步做什么文档
1207 上 docker compose 起 Langfuse 4Langfuse_部署教程_cursor
2.env 写 INIT pk/sk;compose 设 dual部署教程 + 连接专题第八章
3Dify API:POST trace-config + POST trace连接专题
4插件补丁:Generation 带 UUID(worker 内)连接专题
5问一句知识库问题,打开 Trace 验收连接专题

Host 必须写 http://192.168.110.207:3000,不能写 localhost(容器内 localhost ≠ 宿主机)。

第二步典型卡点

卡点常见现象优先处理
Langfuse 起不来compose 拉镜像超时Langfuse_部署教程 镜像加速章
Trace 开关不生效Dify 里看不到 Trace连接专题:按 app 配 trace-config,非全局 env
Host 写 localhost容器内上报失败Host 改为 http://192.168.110.207:3000
只有 Generation 无 Tool Span补丁未打到 worker连接专题步骤 2;作业 3 验收脚本
traceId 对不上查到旧 trace连接专题问题 2;用最新 conversation

4.3 第三步 · 开启 Rerank

理论目标

以前排第 3 的「加班费 300%」条款排到第 1;对话能引用关键数字。

理论流程

text
用户问句
  → Embedding 召回 Top-N(如 20)
  → Rerank 交叉编码器重打分
  → 取 Top-K(如 5)进 Prompt
  → LLM 生成

必须改两处 JSON(字段名不同):

位置Rerank 字段名
知识库 retrieval_modelreranking_provider_name / reranking_model_name
Agent 快照 knowledge.sets[].retrievalprovider / model

操作步骤

步做什么文档脚本
1Xinference login + launch reranker专题十三 3.1(CPU)或 3.2(GPU)专题十三_02_launch_rerank*.py
2Dify 添加 Rerank 凭据专题十三—
3PATCH 知识库 retrieval_model专题十三专题十五_04_改知识库检索.py
4改 Agent 快照+草稿 retrieval专题十三专题十五_05_改Agent快照绑库与Rerank.py
5命中测试对比 + 新开对话专题十三专题十五_08 / 09

改完 不要点发布。

第三步典型卡点

卡点常见现象优先处理
Rerank 模型未 launchDify 无 rerank 供应商专题十三 3.1/3.2
只改库未改 Agent对话仍用旧排序快照+草稿两处 JSON 字段名不同
命中测试变了、对话不变用了旧会话缓存新开对话验收
Top-1 仍不对rerank 模型弱或 Top-N 太小专题十三调 Top-N/K;换 bge-reranker
变慢明显CPU rerank + 大 Top-N专题十四容量;GPU 路径 3.2

第五部分 CPU 与 GPU 双路径建议(本系统 + 未来扩展)

现状:207 无 GPU,Embedding + Rerank 在 CPU;116 有 H20,只跑 vLLM。

文档写法:CPU 路径 = 当前生产实录;GPU 路径 = 有卡后的推荐做法,避免以后重复踩坑。

5.1 组件 × CPU / GPU 对照总表

组件当前(207 CPU + 116 GPU)仅 CPU 最小可跑有 GPU 推荐
LLM Qwen3.6-27B116 vLLM,BF16,~50GB 权重❌ 不建议 27B 纯 CPU单卡 ≥80GB 或量化到 24–48GB 卡
Embedding bge-m3207 Xinference CPU8 核 + 8Gi 可跑GPU 4–8GB 显存,QPS 高时必须
Rerank bge-reranker-v2-m3207 Xinference CPU,Top-K=5 约 2–16s能跑,长文/高并发慢GPU 2–4GB,生产推荐
Weaviate207,8088 中继吃 CPU + 内存与 Dify 同机即可
Dify 栈207,31Gi 内存偏紧16Gi 很紧,32Gi 起控制面与推理分离

5.2 CPU 路径(当前 207 实录)

适用场景

CPU 路径 launch 规则(专题十三·问题 4)

规则说明
容器 不要 加 --gpus207 无 NVIDIA
launch 不要 传 --n-gpu尤其 禁止 --n-gpu 0(会 ValueError)
不传则 accelerators: []正常走 CPU,与 bge-m3 一致
重启后实例丢失必须重新 xinference login + launch

CPU 路径 Rerank 性能预期

条件耗时量级建议
Top-K=5,短块(400–800 字)2–5s当前配置可接受
Top-K=10,长块(2000+ 字)10–20s+降 K、缩短切块,或迁 GPU
多人同时命中测试CPU 打满错峰;长期迁 GPU

CPU 路径 Dify / 主机资源建议

资源当前 207建议
内存 31GiDify + Weaviate + Postgres + Xinference + Langfuse 同机监控 docker stats;Langfuse 与 Xinference 峰值叠加
CPURerank + Weaviate 争抢16 核+ 更稳;100 人以上考虑把 Xinference 迁出
磁盘模型权重 + 向量库SSD / NVMe

5.3 GPU 路径(未来有卡时)

何时应该从 CPU 迁到 GPU

text
命中测试经常 >10s?
  ├─ 是 → 优先 Rerank 上 GPU
  └─ 否 → 继续观察

高峰同时提问 >15 人?
  ├─ 是 → Embedding + Rerank 都应 GPU;vLLM 加 max-num-seqs 或加卡
  └─ 否 → CPU 仍可维持

116 上 nvidia-smi 有余量(>10GB 空闲)?
  ├─ 是 → 路径 A:本机 Xinference 加 --gpus all
  └─ 否 → 路径 B:独立 GPU 机或降 vLLM 显存占用

路径 A · 本机 Xinference 已有 GPU 容器

① 确认容器能见到 GPU

bash
docker inspect xinference --format '{{json .HostConfig.DeviceRequests}}'
docker exec xinference nvidia-smi

DeviceRequests 不能为 null;否则需 --gpus all 重建容器。

② launch(有 GPU 时必须指定 n_gpu)

bash
docker exec xinference bash -lc '
xinference login -e http://127.0.0.1:9997 -u admin -p admin1234
xinference launch -e http://127.0.0.1:9997 -n bge-m3 -t embedding -u bge-m3 --n-gpu auto
xinference launch -e http://127.0.0.1:9997 -n bge-reranker-v2-m3 -t rerank -u bge-reranker-v2-m3 --n-gpu auto
'

③ 验收:GET /v1/models 里 accelerators 非空;Rerank 同问句明显快于 CPU。

路径 B · 把 Xinference 迁到 116(与 vLLM 同机)

与安装手册步骤 9.1 同思路:Embedding 和 Rerank 必须在同一套 Xinference,Dify 只改供应商 URL(两处凭据一致)。

步操作
1116 上 nvidia-smi 确认余量(勿挤 mxh_env / mxh_live)
2docker run --gpus all 起 xinference-gpu
3login + launch bge-m3 + reranker(均 --n-gpu auto)
4207 上 curl 116:9997 验网
5Dify 工作区改 Xinference URL → http://116.62.10.183:9997
6不必重建知识库;命中测试复测

完整脚本:/opt/workbuddy/scripts_cursor/Dify_专题十三_知识库Rerank重排序/专题十三_03B_改Dify凭据_GPU路径.py

GPU 路径 vLLM 参数(116 当前 + 扩展)

参数当前值含义扩展建议
--max-num-seqs8同时生成路数100 人公司够用;200+ 需 16–32 或加卡
--gpu-memory-utilization0.75显存占用上限共享卡必须保守;独占卡可 0.90
--max-model-len65536上下文上限与 Dify context_size=64000 对齐
--tool-call-parserqwen3_xml工具调用解析不能用 qwen3(不存在)
--reasoning-parserqwen3thinking 解析与 max_tokens 预算联动

排队判断(全员变慢时):

bash
# 116 GPU 机
nvidia-smi
curl -s http://116.62.10.183:8000/metrics | grep vllm_num_requests
docker logs <vllm容器> 2>&1 | tail -50

vllm_num_requests_waiting > 0 → vLLM 排队,不是检索慢。

5.4 按公司人数的容量规划(专题十四提炼)

在职人数高峰同时提问vLLM 规划并发Rerank主机建议
~1002–6max-num-seqs 8CPU 可接受207 31Gi 勉强;116 共享 H20
200–3006–1516 路建议 GPUXinference 迁 GPU 机
300–50010–2524–32 路必须 GPUDify 与推理分离
500+20–50+水平扩展独立检索集群勿单机堆所有组件

5.5 生成参数建议(与 CPU/GPU 无关,但必须设)

参数本环境推荐原因
max_tokens32768Qwen3.6 thinking 计入同一预算;Prompt 可达 14k+
Top-K3–5K 越大 Prompt 越长,越容易 token 耗尽
切块400–800 汉字,重叠 10–15%避免单块几千字
max_tokens + Prompt< 65536小于 vLLM max-model-len

5.6 CPU → GPU 迁移检查单(留给未来)


第六部分 完整代码程序(可直接运行)

以下均为完整程序,不是片段。换环境只改 /opt/workbuddy/scripts_cursor/内部智能体配置文档专题汇总/_config.py。

6.1 环境常量(必改)

见 第三部分 已嵌入完整 _config.py。

6.2 创建前检查(第一步步骤 0)

运行:/usr/bin/python3 /opt/workbuddy/scripts_cursor/内部智能体配置文档专题汇总/专题十五_00_创建前检查.py

完整程序:/opt/workbuddy/scripts_cursor/内部智能体配置文档专题汇总/专题十五_00_创建前检查.py

运行/引用:/usr/bin/python3 /opt/workbuddy/scripts_cursor/内部智能体配置文档专题汇总/专题十五_00_创建前检查.py

python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""专题十五 · 步骤 0:创建前检查 LLM / Embedding / Rerank / 知识库 / 外部探针。"""
from __future__ import annotations

import sys

import _bootstrap  # noqa: F401
import _config as C
from dify_api import Dify, pp


def main() -> int:
    d = Dify(C.DIFY_EMAIL, C.DIFY_PASSWORD)
    try:
        d.login()
        pp("llm", d.get("/workspaces/current/models/model-types/llm"))
        pp("emb", d.get("/workspaces/current/models/model-types/text-embedding"))
        pp("rerank", d.get("/workspaces/current/models/model-types/rerank"))
        pp("datasets", d.get("/datasets?page=1&limit=20"))

        print("\n=== vLLM ===")
        out, err = d.sh(
            "curl -s -m 10 -H 'Authorization: Bearer %s' %s/models"
            % (C.VLLM_KEY, C.VLLM_BASE)
        )
        print(out or err)

        print("\n=== Xinference ===")
        out2, err2 = d.sh(
            "curl -s -m 15 -H 'Authorization: Bearer %s' %s/v1/models"
            % (C.XF_KEY, C.XF_URL)
        )
        print(out2 or err2)
        return 0
    finally:
        d.close()


if __name__ == "__main__":
    sys.exit(main())

6.3 分层健康探针(LLM / Embedding / Rerank / vLLM)

运行:/usr/bin/python3 /opt/workbuddy/scripts_cursor/内部智能体配置文档专题汇总/专题十四_03_分层探针.py

完整程序:/opt/workbuddy/scripts_cursor/内部智能体配置文档专题汇总/专题十四_03_分层探针.py

运行/引用:/usr/bin/python3 /opt/workbuddy/scripts_cursor/内部智能体配置文档专题汇总/专题十四_03_分层探针.py

python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""专题十四 · 步骤 3:分层探针(Xinference / Rerank / vLLM / 最短对话)。"""
from __future__ import annotations

import json
import sys

import _bootstrap  # noqa: F401
import _config as C
from dify_api import Dify


def main() -> int:
    d = Dify(C.DIFY_EMAIL, C.DIFY_PASSWORD)
    try:
        probes = [
            ("1) Xinference /v1/models", (
                "curl -s -m 15 -H 'Authorization: Bearer %s' %s/v1/models"
                % (C.XF_KEY, C.XF_URL)
            )),
            ("2) Xinference /v1/rerank", (
                "curl -s -m 30 -H 'Authorization: Bearer %s' -H 'Content-Type: application/json' "
                "-d '{\"model\":\"%s\",\"query\":\"%s\",\"documents\":[\"管理人员应通过钉钉打卡。\",\"班车时间以通知为准。\"]}' "
                "%s/v1/rerank"
                % (C.XF_KEY, C.RERANK_MODEL, C.PROBE_QUERY_KB, C.XF_URL)
            )),
            ("3) vLLM /v1/models", (
                "curl -s -m 10 -H 'Authorization: Bearer %s' %s/models"
                % (C.VLLM_KEY, C.VLLM_BASE)
            )),
            ("4) vLLM 最短对话", (
                "curl -s -m 60 -X POST %s/chat/completions "
                "-H 'Authorization: Bearer %s' -H 'Content-Type: application/json' "
                "-d '{\"model\":\"%s\",\"messages\":[{\"role\":\"user\",\"content\":\"只回:pong\"}],\"max_tokens\":16}'"
                % (C.VLLM_BASE, C.VLLM_KEY, C.QWEN_MODEL)
            )),
        ]
        for title, cmd in probes:
            print("\n=== %s ===" % title)
            out, err = d.sh(cmd)
            text = out or err
            print(text[:1500] if len(text) > 1500 else text)
        return 0
    finally:
        d.close()


if __name__ == "__main__":
    sys.exit(main())

6.4 作业 1 · 工具调用验收

运行:/usr/bin/python3 /opt/workbuddy/scripts_cursor/内部智能体配置文档专题汇总/作业1_05_对话验收.py

完整程序:/opt/workbuddy/scripts_cursor/内部智能体配置文档专题汇总/作业1_05_对话验收.py

运行/引用:/usr/bin/python3 /opt/workbuddy/scripts_cursor/内部智能体配置文档专题汇总/作业1_05_对话验收.py

python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""作业 1 · 步骤 5:对话验收 —— 问 gpu-server-01 状态,应触发工具并返回指标。"""
from __future__ import annotations

import sys

import _bootstrap  # noqa: F401
import _config as C
from dify_api import Dify, pp


def resolve_agent_id(d: Dify) -> str:
    aid = getattr(C, "HOMEWORK1_AGENT_ID", "") or ""
    if aid:
        return aid
    sql = (
        "SELECT a.id FROM apps ap JOIN agents a ON a.app_id=ap.id "
        "WHERE ap.name='%s' ORDER BY ap.created_at DESC LIMIT 1;"
        % C.HOMEWORK1_APP_NAME.replace("'", "''")
    )
    out, err = d.sh(
        'docker exec %s psql -U postgres -d dify -t -A -c "%s"'
        % (C.PG_CONTAINER, sql)
    )
    aid = (out or "").strip()
    if not aid:
        raise RuntimeError("找不到 Agent: %s %s" % (out, err))
    return aid


def main() -> int:
    d = Dify(C.DIFY_EMAIL, C.DIFY_PASSWORD)
    try:
        d.login()
        agent_id = resolve_agent_id(d)
        print("agent_id", agent_id)
        r = d.post(
            "/agent/%s/chat-messages" % agent_id,
            body={
                "inputs": {},
                "query": C.HOMEWORK1_PROBE_QUERY,
                "response_mode": "streaming",
                "files": [],
                "conversation_id": "",
            },
            extra="-m 420 --max-time 420",
            t=450,
        )
        pp("chat", r, limit=4000)
        text = r.get("text") or ""
        ok_markers = ("45%", "62%", "78%", "18.2", "gpu-server-01", "getServerStatus")
        hits = [m for m in ok_markers if m in text]
        print("\n匹配到的验收关键词:", hits)
        if r.get("code") not in ("200",) or len(hits) < 2:
            print("\n[FAIL] 未看到工具返回的模拟指标,请检查工具挂载与 SSRF 出网。")
            return 1
        print("\n[PASS] Agent 已调用工具并返回状态信息。")
        return 0
    finally:
        d.close()


if __name__ == "__main__":
    sys.exit(main())

6.5 作业 1 · FastAPI 模拟服务

运行(207 上):uvicorn 作业1_server_status_api:app --host 0.0.0.0 --port 8777

完整程序:/opt/workbuddy/scripts_cursor/内部智能体配置文档专题汇总/作业1_server_status_api.py

运行/引用:/usr/bin/python3 /opt/workbuddy/scripts_cursor/内部智能体配置文档专题汇总/作业1_server_status_api.py

python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""作业 1 · 模拟「查询服务器状态」HTTP 工具(FastAPI)。

启动(207 上):
  pip3 install fastapi uvicorn -q
  uvicorn 作业1_server_status_api:app --host 0.0.0.0 --port 8777

或:bash /opt/workbuddy/scripts_bash_cursor/作业1_带工具调用的Agent_服务器状态/作业1_启动_server_status.sh
"""
from __future__ import annotations

from fastapi import FastAPI

app = FastAPI(
    title="Server Status API",
    version="1.0.0",
    description="Dify Agent 作业 1:模拟查询服务器 CPU / 内存 / GPU 状态",
)


@app.get("/server/status", operation_id="getServerStatus", summary="查询服务器状态")
def get_status(server_name: str) -> dict[str, str]:
    """根据 server_name 返回模拟监控指标(本服务不连真实监控)。"""
    return {
        "server": server_name,
        "cpu": "45%",
        "memory": "62%",
        "gpu_util": "78%",
        "gpu_memory": "18.2/24 GB",
    }


@app.get("/health")
def health() -> dict[str, str]:
    return {"status": "ok"}


if __name__ == "__main__":
    import uvicorn

    uvicorn.run("作业1_server_status_api:app", host="0.0.0.0", port=8777, reload=False)

6.6 Xinference 重启后恢复(CPU 路径,完整 Bash)

运行(207 上):bash /opt/workbuddy/scripts_bash_cursor/Dify_专题十四_知识库问答变慢卡住失败排查与容量规划/专题十四_内联_12.sh

完整脚本:scripts_bash_cursor/Dify_专题十四_知识库问答变慢卡住失败排查与容量规划/专题十四_内联_12.sh

运行/引用:bash /opt/workbuddy/scripts_bash_cursor/Dify_专题十四_知识库问答变慢卡住失败排查与容量规划/专题十四_内联_12.sh

bash
#!/usr/bin/env bash
set -euo pipefail

docker exec xinference bash -lc '
xinference login -e http://127.0.0.1:9997 --username admin --password admin1234
xinference launch -e http://127.0.0.1:9997 -n bge-m3 -t embedding -u bge-m3
xinference launch -e http://127.0.0.1:9997 -n bge-reranker-v2-m3 -t rerank -u bge-reranker-v2-m3
'

6.7 OpenAPI 工具 Schema(作业 1)

完整补丁:patches_cursor/内部智能体配置文档专题汇总/作业1_server_status_openapi.yaml

运行/引用:见 patches_cursor/内部智能体配置文档专题汇总/作业1_server_status_openapi.yaml

python
openapi: 3.0.0
info:
  title: Server Status API
  version: 1.0.0
  description: 作业 1 · 模拟查询服务器 CPU / 内存 / GPU 状态
servers:
  - url: http://192.168.110.207:8777
paths:
  /server/status:
    get:
      operationId: getServerStatus
      summary: 查询服务器状态
      description: 根据服务器名称返回 CPU、内存、GPU 利用率等模拟指标
      parameters:
        - name: server_name
          in: query
          required: true
          description: 服务器名称,例如 gpu-server-01
          schema:
            type: string
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                type: object
                properties:
                  server:
                    type: string
                  cpu:
                    type: string
                  memory:
                    type: string
                  gpu_util:
                    type: string
                  gpu_memory:
                    type: string

6.8 更多完整程序索引

场景程序
改 Agent 快照绑库+Rerank专题十五_05_改Agent快照绑库与Rerank.py
改 max_tokens专题十五_06_改max_tokens.py
注册 OpenAPI 工具作业1_02_注册OpenAPI工具.py
挂工具到 Agent作业1_04_查ID并挂工具.py
GPU 路径改 Dify 凭据专题十三_03B_改Dify凭据_GPU路径.py
Weaviate 中继scripts_bash_cursor/Dify_专题六_weaviate中继/专题六_01_启动weaviate中继.sh
Shell 工具排障专题七_01_检查沙箱服务.py

全部列表见 docs/md_cursor/完整代码约定_cursor.md 与各专题文末「程序一览」。


第七部分 实战问题与解决方案总表

汇总各专题「本次实战」记录。现象 → 根因 → 解法 → 对应专题。

7.1 模型与接入

#现象根因解法专题
M1Dify 模型列表空 / 创建 Agent 报 schema插件 schema 克隆 bug补丁 llm.py;专题十专题十
M2vLLM Up,Dify curl 不通API Base 漏 /v1、防火墙、模型名不一致七层排查;116:8000/v1专题五
M3KeyError: invalid tool call parser: qwen3vLLM 无 qym3 解析器名改 --tool-call-parser qwen3_xml专题四/九
M4控制台登录 403密码未 base64、缺 CSRF用 dify_api.py 登录专题九
M5context_size 与 max-model-len 差数量级Dify 校验失败LLM 64000,vLLM 65536专题九

7.2 知识库与检索

#现象根因解法专题
K1Agent 选不到知识库,库页仍 availableXinference 重启,bge-m3 实例丢login + launch bge-m3专题三
K2命中测试时好时坏Weaviate IPv6/IPv48088 中继专题六
K3命中测试排序差未开 Rerank专题十三 两处 JSON专题十三
K4命中测试好了,对话仍差只改知识库,未改 Agent 快照改 snapshots + drafts专题十三·7
K5Rerank JSON 被拒绝两套字段名混用知识库用 reranking_*,Agent 用 provider/model专题十三·8
K6--n-gpu 0 ValueError无 GPU 不能传 0不传 --n-gpu专题十三·4
K7403 launch / 401 列模型用推理 Key 做管理操作容器内 admin login 再 launch专题十三·1–3
K8CLI 100% 但列表无 rerankworker 异步失败以 /v1/models 为准专题十三·11
K9重启后检索全挂launch 不持久化见第六部分 6.6 relaunch 脚本专题十三·12 / 十四·G

7.3 问答与 Agent 配置

#现象根因解法专题
A1System message must be at the beginningQwen3 只接受一条 system 在最前补丁合并 system(chat.py)专题四
A2空泡 / token limit 2048 / 8192max_tokens 太小;thinking 吃预算快照设 32768;Top-K 3–5专题十一/十二/十四·B
A3改完 Max Tokens 又变 8192点「发布」写回 null不要发布;API/SQL 改快照+草稿专题十一
A4界面停 knowledge_base_search检索已结束,LLM 在 thinking看 agent_backend 时间线专题十四
A5POST /apps mode=agent 4001.16 创建口改为 /agent用 POST /agent作业 1
A6invalid uuid: server_statusprovider_id 写了名称非 UUID查 tool_api_providers.id作业 1
A7Shell / no available nodesandbox 未起或 SANDBOX_URL 错compose 服务名,非 localhost专题七
A8插件 SyntaxError futurepatch 顺序专题八 apply 脚本专题八

7.4 Langfuse

#现象根因解法专题
L1Dify .env 配 Langfuse 无效1.16 应用级 trace-configConsole API 写入Langfuse 连接·坑1
L2Langfuse 无 API Key缺 INIT pk/sk.env + 重建 web坑2
L3Celery success 但后台空events_only 拒 ingestiondual 模式坑3–4
L4无 Token 面板Generation 缺 UUID补丁 langfuse_trace.py坑5
L5Host localhost 连错容器 localhost ≠ 宿主机http://192.168.110.207:3000坑7
L6Trace 无 chunk 列表上报链路限制召回看命中测试专题十三·10 / 十四·J

7.5 性能与容量

#现象根因解法专题
P1全员慢,命中测试快vLLM 排队 max-num-seqs=8nvidia-smi + metrics waiting专题十四·I / SOP
P2Rerank 16s+CPU 交叉编码器降 K / 短块 / 迁 GPU专题十三 / 十四·C
P3GPU OOM显存被多进程占满降 utilization;勿盲目加 seq专题九

7.6 场景速查(一线运维用)

你看到的先做打开
搜不到命中测试 + available + bge-m3SOP §1 / 专题三
答偏命中测试 Top1 + Langfuse TraceSOP §2 / 专题十三
很慢分层探针 + vLLM 排队SOP §3 / 专题十四
空泡 8192message_tokens vs max_tokens专题十二
重启后全挂relaunch embedding+rerank§6.6

第八部分 对本系统的专业建议

8.1 架构建议

  1. 控制面与推理面分离:207 跑 Dify + 观测 +(当前)CPU 检索;116 跑 vLLM。公司到 200 人时,把 Xinference 迁到 116 或第三台 GPU 机,避免 207 内存成为瓶颈。
  2. 配置单一真相源:运行期以 agent_config_snapshots + agent_config_drafts 为准;知识库页只影响命中测试,除非同步改快照。
  3. 补丁清单化:plugin_daemon / worker 内补丁(system 合并、Langfuse UUID、schema 克隆)在容器重建后会丢——维护一份 patches_cursor/ apply 脚本顺序,重建后按序重打。
  4. Weaviate 中继长期保留:8088 中继解决 IPv6 偶发,不要「修好了就删」。

8.2 运维建议

  1. Xinference 重启 SOP:任何 docker restart xinference 后,执行 §6.6 relaunch,再测命中测试。
  2. 验收永远新开对话:conversation_id="";失败会话 status=error 不要继续点。
  3. 禁止随意点发布:新 Agent 改库后只强刷页面。
  4. 监控最小集:116 nvidia-smi + vLLM metrics;207 docker stats xinference + Weaviate 8088 探活。
  5. Langfuse 仅作观测:不作为检索调试工具;召回问题回 Dify 命中测试。

8.3 安全建议

  1. _config.py 含控制台与 API 密钥——勿提交公网仓库;换密钥后同步改脚本常量。
  2. 自定义 HTTP 工具走 ssrf_proxy——模拟 API 不要暴露内网敏感接口无鉴权。
  3. Langfuse / Dify 控制台限制内网访问或加 SSO。

8.4 演进路线(建议优先级)

阶段动作触发条件
现在维持 CPU Rerank + 116 vLLM;max_tokens=32768已验收
短期作业 2+ 更多 HTTP 工具 / 工作流业务要动数据
中期116 加 Xinference GPU(路径 B)命中测试常 >10s 或人数 >150
长期vLLM 第二副本 / 小模型分流waiting 长期 >0

第九部分 全部专题 md / html 对照索引

分类文档MarkdownHTML
总入口文档索引首页内部智能体搭建_文档索引首页_cursor.md.html
本文配置专题汇总内部智能体配置文档专题汇总_cursor.md.html
第一步安装手册Dify_Qwen安装配置手册_cursor.md.html
第一步新 Agent 创建Dify_专题十五_新Agent从零创建完整教程_cursor.md.html
第一步Qwen 接入Dify_专题一_集成Qwen3.6-27B_cursor.md.html
第一步bge-m3Dify_专题二_Xinference运行bge-m3_cursor.md.html
第一步模型不通Dify_专题五_大模型运行成功但Dify仍不可用_cursor.md.html
第一步其它配置Dify_专题九_其它配置问题解决_cursor.md.html
第一步Shell 工具Dify_专题七_Agent_shell_provider修复_cursor.md.html
第二步Langfuse 部署Langfuse_部署教程_cursor.md.html
第二步Langfuse 连接Langfuse_连接Dify专题_cursor.md.html
第三步RerankDify_专题十三_知识库Rerank重排序_cursor.md.html
排障知识库选不到Dify_专题三_Agent知识库选择_cursor.md.html
排障问答报错Dify_专题四_Agent问答报错_cursor.md.html
排障weaviateDify_专题六_weaviate中继_cursor.md.html
排障插件 patchDify_专题八_插件patch_future顺序子坑_cursor.md.html
排障模型列表空Dify_专题十_模型列表为空Agent创建报错_cursor.md.html
排障max_tokens 不落库Dify_专题十一_新Agent类型max_tokens不持久化_cursor.md.html
排障空泡 2048Dify_专题十二_max_tokens过小导致空泡卡住_cursor.md.html
排障变慢/容量Dify_专题十四_知识库问答变慢卡住失败排查与容量规划_cursor.md.html
培训排错 SOP企业AI助手排错SOP_培训与赋能_cursor.md.html
集成环境Prometheus/Grafana/SLA集成环境部署_Prometheus_Grafana_SLA_cursor.md.html
作业工具调用 Agent作业1_带工具调用的Agent_服务器状态_cursor.md.html
作业汇报 PPT 模版作业9_汇报PPT模版_cursor.md.html
作业企业使用手册作业10_企业AI平台使用手册_cursor.md.html
作业企业白皮书作业11_企业AI平台白皮书_cursor.md.html
作业意图路由 Workflow作业2_客服意图路由工作流_cursor.md.html
约定完整代码完整代码约定_cursor.md.html

*汇总文档版本:与 207 实战环境同步;细节变更以各专题正文为准,本文提供总纲与索引。*