# 阶段二记录：RAG 问答链路骨架

日期：2026-07-06

## 本次目标

把用户端 `/chat/completions` 从单一 mock 回复，升级为可替换的问答服务链路。当前仍不接真实飞书和真实大模型，但先把知识库开放范围过滤、检索、Prompt、模型调用和 AI 请求日志的职责拆出来。

## 已完成

- 新增知识库访问范围服务 `KnowledgeAccessService`：
  - 按最新需求读取全部已开放、未禁用的知识库。
  - 已开放知识库默认所有用户可见，不再按单个用户授权过滤。
  - 开发阶段如果没有配置开放知识库，允许通过 `MOCK_RAG_ENABLED=true` 使用默认 mock 知识库，方便本地演示。
- 新增 RAG 服务 `RagService`：
  - 负责构建用户可访问知识库范围。
  - 负责调用 mock 飞书知识库检索。
  - 负责组装 Prompt。
- 新增模型服务 `ModelClientService`：
  - 优先读取当前启用模型配置。
  - 当前返回 mock 模型答案，后续替换为真实大模型流式调用。
- 新增 AI 请求日志服务 `AiRequestLogService`：
  - 每次问答记录 session、message、user、model、prompt、knowledge_ids、命中数、token 估算、耗时和状态。
- 更新聊天服务：
  - `/chat/completions` 已接入 RAG 骨架。
  - 提问前校验用户每日额度。
  - 提问成功后增加 `daily_chat_used`。
  - 保存用户消息、助手消息和 AI 请求日志。

## 当前 mock 规则

- 问题命中 mock 文档关键词时，返回基于知识片段整理的 Markdown 文本。
- 问题没有命中任何知识片段时，固定返回：

```text
当前知识库中未检索到相关内容，请联系管理员补充相关知识。
```

## 当前边界

- 真实飞书知识库 API 尚未接入。
- 真实大模型 API 尚未接入。
- 每日额度目前使用 `sys_user.daily_chat_used` 简单计数，尚未做按自然日自动重置。
- 停止生成接口仍是占位能力，后续接真实流式模型时再实现中断状态。

## 后续建议

1. 补前端 Markdown 渲染，让 mock RAG 的结构化回答在手机端可读。
2. 做飞书知识库接口技术验证脚本，确认 SpaceID、NodeID、权限和返回结构。
3. 接入后台 Prompt 和模型配置管理页面。
4. 把每日额度改为按日期维度统计，避免长期累加。

## 验证记录

- `python -m compileall app` 已通过。
- FastAPI OpenAPI 导入检查已通过，当前仍为 13 个接口路径。
- Alembic MySQL 静态迁移 SQL 生成已通过。
- RAG/模型服务级验证已通过：
  - 命中问题可以返回带来源的 mock 回答。
  - 无命中问题会返回固定兜底文案。
- SQLite 内存库不适合完整模拟当前 MySQL `BIGINT AUTO_INCREMENT` 主键行为，因此本次未使用 SQLite 做完整聊天端到端写库测试。
