---
title: youdao
canonical_url: "https://www.modelscope.cn/studios/YD8888/youdao"
md_url: "https://www.modelscope.cn/studios/YD8888/youdao.md"
repository: YD8888/youdao
last_updated: 2026-10-17
sdk_type: docker
sdk_version: 6.17.3
downloads: 0
stars: 0
---

# youdao

> youdao - YD8888 在 ModelScope 创建的在线 Demo。有道企业知识库 面向团队内部管理 Skill 的第一阶段知识库问答系统。生产部署使用魔搭 ModelScope 创空间，团队成员通过网页访问，主电脑不需要保持开机。 架构

YD8888/youdao 是 ModelScope 魔搭社区上的在线可交互 Demo（创空间），基于 docker 6.17.3 构建。

- **Repository**: YD8888/youdao
- **SDK**: docker
- **SDK version**: 6.17.3
- **Downloads**: 0
- **Stars**: 0
- **Last updated**: 2026-10-17

Source: https://www.modelscope.cn/studios/YD8888/youdao

---

# 有道企业知识库

面向团队内部管理 Skill 的第一阶段知识库问答系统。生产部署使用魔搭 ModelScope 创空间，团队成员通过网页访问，主电脑不需要保持开机。

## 架构

```text
ModelScope 创空间（Docker + FastAPI + React）
  -> 私有 ModelScope Dataset（精炼后的 .md / .txt Skill）
  -> ModelScope Embedding（AI-ModelScope/bge-small-zh-v1.5）+ Chroma
  -> 外部大模型 API（唯一 Token 费用）
  -> 飞书多维表格（脱敏问答；点赞/点踩更新原问答行的“评价”字段）
```

## 本地开发

1. 将 `.env.example` 复制为 `.env` 并填写本地配置。
2. 将测试 Skill 放入 `data/docs`。
3. 执行 `python -m pip install -r requirements.txt`。
4. 执行 `python app.py`。

如果本地 7860 已被旧进程占用，可以显式设置 `PORT` 使用其他端口；创空间部署时会严格使用平台提供的 `PORT`。

### 稳定性参数

`API_TIMEOUT_SECONDS`、`API_MAX_RETRIES` 和 `API_RETRY_BACKOFF_SECONDS` 用于控制 API 超时与有限重试，启动时会传入 RAG 请求。没有产生有效回答的失败或取消请求不会占用每日次数和预算。

### 本地测试

项目测试位于 `tests` 目录，可执行：

```text
python -m unittest discover -s tests -p "test_*.py" -v
```

未配置 ModelScope Dataset 时，程序仅读取本地 `data/docs`。未配置大模型 API 时，只用于验证界面与检索链路，不能作为正式问答服务。

登录页的账号框可直接输入，也可记住本机最近使用的账号。生产环境会话 Cookie 使用 `HttpOnly`、`Secure`、`SameSite=None`；在部分手机浏览器或嵌入式网页中，如果跨站 Cookie 未被保留，前端会把服务端返回的短期 Bearer 回退令牌保存在当前标签页的 `sessionStorage`，用于恢复同一账号会话。令牌不会写入 `localStorage`，退出登录、认证失效或账号切换时会清除；浏览器中不保存密码。管理员既可以手动添加成员，也可以审核账号申请，并批量启用、禁用、修改角色或删除成员。

如果部署在 HTTPS 反向代理后方，只有在容器不能被公网绕过直连时才设置 `TRUST_PROXY_HEADERS=true`，并用 `TRUSTED_PROXY_HOSTS` 限定可信代理来源；ModelScope 这类托管 Docker Space 可按平台网络边界配置为 `*`。未启用时，CSRF 来源校验只使用 Uvicorn 收到的直接请求 origin。

本地开发默认使用关键词检索，避免启动时加载较重的向量模型；创空间生产环境默认启用向量检索。如需在本地验证完整向量链路，将 `RAG_VECTOR_ENABLED=true` 后重启程序。

## 可选联网补充

配置 `WEB_SEARCH_ENABLED=true` 和 `TAVILY_API_KEY` 后，系统会在内部检索内容不足时查询公开网络，并将处理后的摘要用于补充回答。联网内容不会替代内部内容确定的回答方向，也不会向用户展示搜索来源或链接。

## 回答边界

- 与已上传 Skill 相关的问题，必须沿着相关 Skill 的核心方向、判断顺序和适用边界进行分析。
- 可以结合业务场景补充执行细节，也可以适度拓展，但拓展方向必须与相关 Skill 同向。
- 没有匹配的 Skill 时，不使用通用经验或联网内容替代，系统会返回“无法回答，请联系管理员反馈”。
- 不向使用者展示 Skill 名称、原文、知识库内容、检索过程或内部方法名称。
- 用户未说明身份时，默认按网易有道课程顾问理解；员工、团队、绩效和人员管理问题默认使用网易有道 C 端销售管理者视角。用户明确说明其他身份时，以用户说明为准。该策略只影响表达视角，不改变 RAG 检索、排序和 Skill 证据边界。
- 聊天输入框使用 `Enter` 发送，`Shift + Enter` 换行。

## 界面与权限

- 所有工作台页面都要求先登录；未登录访问问答或管理地址会返回登录页。
- 普通成员只使用“智能问答”、个人历史和输入框旁的“回答设置”，不会看到管理控制台、Skill 文件路径或原文。
- “选择专家”支持组合多个业务分类；“全部专家”与具体专家互斥。空数组表示全库匹配，选择结果随会话保存。
- 输入框上方直接显示“简洁 / 标准 / 详细”三档切换和账号上限，无需先打开设置；“回答设置”仍保留专家搜索、默认范围、选择数量限制及完整档位说明。默认“标准”，三档均保留必要解释；档位只控制展开程度和单次回答输出上限，不改变 P1-P4 的 Skill 访问权限。
- 管理员可在成员管理中设置每个账号的“回答详细度上限”；服务端每次请求按最新账号上限封顶，输出上限分别不超过当前系统 `api_max_tokens` 的 50% / 75% / 100%。旧成员记录默认“标准”。这不是总费用保证，输入、检索精筛及其他模型调用仍可能产生 Token 费用。
- 单次请求的自动续写共用上述输出预算，达到上限即停止自动追加；中断时只有服务商回传可信剩余额度才自动续写，否则保守视为当前预算已用完，保留文字供手动续写。手动再次提问另计，并继续受现有每日调用和预算规则约束；未回传的隐藏生成无法准确计量。
- 当前浏览器按用户名保存详细度偏好；该偏好项只保存档位，不含密码、令牌或对话。存储损坏或不可用时回退“标准”，仍受管理员上限约束。权限在页面重新聚焦、重新可见及可见期间每 60 秒刷新，服务端不等待前端刷新才执行限制。
- 单次问题最多 9,000 个 Unicode 字符，超限明确提示并保留原文，不会静默截断。浏览器只发送服务端实际使用的最近 12 条、每条最多 1,200 字符的历史上下文，完整对话仍照常保存。
- 管理端保留全部页面与解说，运行参数按“基础 / 高级”分层；系统五级展开风格与成员三级详细度分别管理。刷新状态不重置参数草稿；未保存的参数和 Skill 内容在离开时提醒。
- 管理员额外看到“管理控制台”，可进入工作台概览、专家与 Skill、成员管理、账号申请和系统状态。
- 管理导航按“日常管理”和“分析与系统”分组，仍保留调用统计、问题洞察及全部原有管理入口和解说。概览各区域独立加载和重试，局部失败不清空其他成功数据；刷新失败的旧健康结果不会显示为当前正常。
- 桌面端使用顶部主导航，移动端使用导航抽屉；新建对话入口只保留在最近对话侧栏。

## 账号与成员管理

通过 `GRADIO_USERNAME`、`GRADIO_PASSWORD` 和可选的 `GRADIO_USER_ROLE` 配置启动账号；角色支持 `admin` 和 `user`，未填写角色时默认为普通用户。显式配置时，列表中第一个 `admin` 是系统恢复管理员：其密码、管理员角色和启用状态始终以创空间私密变量为准，网页端不能重置密码、停用、降级或删除；修改该账号密码后需重启创空间。其他成员仍由 `data/accounts.json` 或飞书成员表持久化。生产环境需持久保存 `DATA_DIR`。

系统恢复管理员也可在网页中单独调整回答详细度上限；此操作只保存回答上限，不放开其身份、密码、启停或删除保护。

管理员在“管理控制台 → 成员管理”查看、添加、编辑、启停、重置密码或删除普通成员；重置密码要求两次输入一致且至少 6 个字符。列表先即时呈现操作结果，保存失败会恢复原状态并显示错误。批量操作会保留仍存在的选中成员，不允许降级、停用或删除当前管理员，并始终至少保留一名启用的管理员。角色变化会立即反映到已有会话的权限校验。普通用户不能通过隐藏界面或伪造账号获得管理权限。

账号文件损坏时会明确报错并停止加载，不会悄悄丢弃记录或回退初始化权限。请先停服并恢复有效备份，不要删除账号文件来重置登录。

管理员还可以在“管理控制台 → 专家与 Skill”按专家文件夹查看当前文件、点击文件预览内容、上传 `.md`/`.txt` Skill、移动或删除 Skill、维护分类并重载知识库。配置私有 ModelScope Dataset 后，上传和删除直接作用于该 Dataset；未配置时仅作用于本地 `data/docs`。文件或分类变更成功后，列表立即更新，检索索引在响应后自动重建；需要确认索引已生效时可点击“重新加载 Skills”。

每日请求次数会保存到 `CIRCUIT_STATE_PATH`，服务重启不会重置当天的用户次数。未配置飞书数据 Base 时，会话历史保存到 `data/conversations.json`；生产环境配置 `FEISHU_DATA_APP_TOKEN` 后，成员、账号申请、用户个人会话、`Skill权限`、`Skill选择配置` 和 `系统设置` 改由独立飞书表持久化，用户删除只删除自己的会话记录，管理员问答日志不提供删除路径。应用会自动发现或创建这些业务表；在“系统状态”看到“跨设备数据已启用”后，再进行桌面与手机读回验收。若生产环境显示“仅当前实例可见”，说明数据仍依赖当前实例，不应认定跨设备或重部署恢复已就绪。生产环境仍建议为 `DATA_DIR` 配置持久化存储，用于缓存、计数和本地日志。

## 魔搭 Docker 创空间部署

完整的云端小白操作指南见：[有道项目-创空间云端使用说明书](docs/有道项目-创空间云端使用说明书.md)；需要直接浏览或打印 PDF 时打开：[HTML 版说明书](docs/有道项目-创空间云端使用说明书.html)。本说明书以创空间云端为唯一正式基准，本地版本只用于调试和打包。

本轮在原有最新发布包 `有道项目-创空间上传版-20261005-v10.zip` 对应源码上增量优化，不使用此前基于较旧源码生成的 `youdaokb-docker-react-stability-ui-20261015.zip`。已使用普通 Docker 创空间时，先备份业务数据、记录回退版本，再更新运行代码并重新构建；保留原 Secrets、私有 Dataset、飞书 Base 和各表 ID，无需重建账号、申请或历史。只有首次部署或从旧 Gradio 迁移时才新建空间。

保持单实例、单 Web worker。新增 `/livez` 表示 Web 进程可响应；`/readyz` 就绪时返回 200、未就绪时返回 503，不替代真实模型与飞书操作验收。原 `/health` 和前端冷启动等待保持兼容；生产 Cookie、短期会话回退和持久自动登录均沿用新版实现，不因本轮优化降级。

上传前建议使用仓库自带的安全打包命令，避免把本地账号、飞书数据和旧版本压缩包一并上传：

```text
python tools/build_upload_package.py
```

命令会在 `artifacts/` 中创建一个带 UTC 时间和 Git 短提交号的新 ZIP，不覆盖旧包，并打印整包 SHA-256。指定文件名时可使用 `--output`，但目标已存在时仍会拒绝覆盖。ZIP 内的 `release-manifest.txt` 列出必需运行文件，`release-metadata.json` 记录 Git HEAD、UTC 打包时间及逐文件 SHA-256。旧的 `20260930-Skill管理检索规则版` 包仅作回滚保留。

上传命令输出的最新 ZIP 解压后的内容即可，必须让 `Dockerfile` 位于创空间代码根目录。构建器只收集运行源码和必要说明，并自动排除 `.env`、`data/`、`.git/`、`tests/`、缓存、验证截图和旧 ZIP；发现运行文件中存在非空敏感配置，或发布清单中的必需文件缺失时，会拒绝生成包。文件上传完成不等于新版本已经生效：还必须确认新镜像构建完成、运行实例更新时间晚于源码提交，并在 `/health` 恢复后，分别用全新桌面和 390px 手机页面验证首次登录、首次提问均无需刷新，再验证同账号历史、重命名、续聊和权限同步。

1. 在 ModelScope 创建私有 Dataset，手动上传经过脱敏和精炼的 `.md`、`.txt` Skill 文件。
2. 在 ModelScope 创建一个用于网页访问的普通 Docker Space，不要选择 API 服务或 MCP Server，也不要直接覆盖旧 Gradio Space。
   如果现有页面标记为 `programmatic` 或 `MCP Server`，必须新建/改用普通 Docker Space；上传源码不能修改空间类型。
3. 上传解压后的包内容，确认 `Dockerfile`、`app.py`、`requirements.txt`、`frontend/package-lock.json`、`src/`、`frontend/` 位于 Space 根目录。
4. 在新 Docker Space 的 Secrets 中配置现有生产 Secret 名称，至少包括：
   `APP_MODE=prod`、账号、`MODELSCOPE_DATASET_REPO`、`MODELSCOPE_TOKEN`、大模型 API 配置，以及飞书配置。
5. 构建并启动新 Space；服务会先监听端口，再在后台下载模型并建立索引。`/health` 暂时返回 `{"ok":false,"message":"initializing"}` 属于正常预热，变为 `ok: true` 后再测试管理员登录、普通成员登录、一次查询、历史恢复和管理入口权限。
6. 旧 Gradio Space 保持运行到新 Docker Space 完成验收；只有验收通过后再切换团队入口。

### 云端数据归属

- 私有 ModelScope Dataset：保存和读取生产 Skill。创空间重启不会依赖实例磁盘上的 Skill 缓存。
- 飞书数据 Base：保存成员账号、账号申请、用户个人会话；管理员问答日志仍写入日志表。重新部署代码不会自动清空这些表。
- 创空间本地磁盘：只保存运行缓存、向量索引和临时文件，不能作为成员、会话或 Skill 的唯一存储。

因此，更新代码时只上传新的运行文件并重新部署，不删除 Dataset 或飞书 Base；更新 Skill 时直接在私有 Dataset 中上传并刷新知识库。

每月更新时：上传新 Skill 到私有 Dataset，创建版本 Tag，在低峰期重启创空间，确认健康检查与业务测试通过。管理员在网页上传同名本地 Skill 时会原子更新原文件，不会继续生成 `-1`、`-2` 等旧版本副本。

## 空壳启动

如果暂时没有 Skill，可以先不配置 `MODELSCOPE_DATASET_REPO` 和 `MODELSCOPE_TOKEN`，直接启动空壳页面。登录和聊天界面可以先联调，但由于没有匹配的内部内容，正式问答会返回“无法回答，请联系管理员反馈”。

## 安全边界

- 原始录音和完整转写稿不进入数据集。
- 仅上传精炼后的 Skill 文本；普通用户没有 Dataset 访问入口。
- 手机号和身份证号在写日志前脱敏。
- 系统对每位用户限流，并在达到每日预算上限时暂停 API 调用。
- 飞书只保存脱敏问答与反馈，不保存 Skill 原文；反馈更新原问答行的“评价”字段，不额外占用一行。
