Files
gochat/docs/product/08-ai-roadmap.md
T

600 lines
29 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# GoChat AI 功能支持评估与开发路线图
> Copilot 配置中心的新命名、参数和存储定义以
> `docs/plans/2026-07-12-copilot-configuration.md` 为准:Copilot 始终启用,
> 不提供总开关,不定义 Captain/Copilot 环境变量或 YAML Provider 配置;Provider、
> Base URL、API Key 与模型仅通过页面写入数据库。API Key 明文存储,API/UI 仅返回配置状态和掩码。
> 调研日期:2026-07-08(初版)/ 2026-07-12 更新
> 基于代码库:2026-07-12 Copilot 配置中心实现状态
> 对标项目:Chatwoot Captain AI (enterprise edition)
> 注:2026-07-12 状态更新 — 数据库驱动的运行时配置链路使用协议原生
> `OpenAIProvider`/`AnthropicProvider`;`EinoProvider` 适配器仍可供显式构造的 Eino
> ChatModel/Embedder 使用,但不承载 Copilot 配置中心的 Provider 热切换。Function Calling、
> Help Center pgvector 语义搜索和 AutoReplyRule 消息流程均已接入。
---
## 目录
1. [评估摘要](#1-评估摘要)
2. [当前 AI 基础设施盘点](#2-当前-ai-基础设施盘点)
3. [Chatwoot AI 功能对照表](#3-chatwoot-ai-功能对照表)
4. [关键缺口分析](#4-关键缺口分析)
5. [开发路线图](#5-开发路线图)
6. [风险评估与依赖](#6-风险评估与依赖)
7. [附录:关键文件索引](#7-附录关键文件索引)
---
## 1. 评估摘要
GoChat 已搭建一套对标 Chatwoot Captain AI 的完整基础设施,覆盖 LLM Provider 抽象层、
数据库驱动的 Copilot 配置中心、数据模型、Service、Handler/路由、前端 UI 和后台 Worker。
Provider 配置与运行链路已闭环,保存后无需重启即可生效。
核心结论:
- **已闭环**:Copilot 配置中心、OpenAI/Anthropic/OpenAI-compatible、Chat/Embedding 分离、
运行时热切换、账户功能模型、回复行为、连接测试、Embedding 重建和无密钥审计。
- **可用功能**:Copilot 对话、回复建议、摘要、改写、标签/跟进、RAG、帮助中心语义搜索、
自动回复规则、Captain Conversation、AgentBot + Captain、Function Calling、文档同步和 AI 翻译。
- **后续重点**:Token 用量/配额、调用级可观测性与质量评估、动态模型发现、多 Provider fallback、
独立语音转写 Provider。
整体评估:基础设施成熟度高,核心功能已进入可配置、可验证、可热更新状态;后续工作以运营、
成本、质量与容灾能力为主。
---
## 2. 当前 AI 基础设施盘点
### 2.1 LLM Provider 层
**文件**:`backend/internal/llm/provider.go`、`openai_provider.go`、`anthropic_provider.go`、
`provider_manager.go`
- `Provider` 接口定义三个核心能力:
- `ChatCompletion` — 同步对话补全
- `CreateEmbedding` — 文本向量化
- `ChatCompletionStream` — SSE 流式对话补全(callback 模式)
- `OpenAIProvider` 实现完整:
- 支持自定义 `baseURL`(兼容国内厂商如火山引擎/豆包/通义千问)
- SSE 流式解析(自研 `sseReader` + `sseLineScanner`,处理 `[DONE]` 信号)
- 指数退避重试(1s→2s→4s,最多 3 次,429/5xx 可重试)
- API 错误结构化解析(`APIError` 类型)
- 数据结构:`ChatRequest`/`ChatResponse`/`ChatMessage`/`EmbeddingRequest`/`EmbeddingResponse`/
`StreamChunk`/`ToolDefinition`/`ToolFunction`
- `ProviderManager` 原子替换 Chat/Embedding Provider Snapshot;账户模型按功能解析后进入请求。
- 配置中心按协议直接构造 `OpenAIProvider`/`AnthropicProvider`;OpenAI-compatible 复用
`OpenAIProvider` 并使用自定义 Base URL,Eino 适配器不在该运行时链路中。
- `ToolExecutionService` 已将 Custom Tool 转为 `ToolDefinition`,执行 tool-call 循环并回传结果。
### 2.2 数据模型层
**文件**:`backend/internal/model/captain_models.go` + `copilot_models.go` + `auto_reply_rule_models.go` + `article_embedding.go`
| 模型 | 表名 | 说明 |
|------|------|------|
| `CaptainAssistant` | `captain_assistants` | AI 助手核心实体(config/guardrails/response_guidelines JSONB) |
| `CaptainDocument` | `captain_documents` | 知识库文档(网页/PDF,含 content_fingerprint 去重) |
| `CaptainAssistantResponse` | `captain_assistant_responses` | FAQ 条目,带 pgvector 1536 维 embedding |
| `CaptainScenario` | `captain_scenarios` | 多场景 agent 配置(instruction + tools JSONB) |
| `CaptainCustomTool` | `captain_custom_tools` | 自定义 HTTP 工具(endpoint/auth/param_schema/request_template) |
| `CaptainInbox` | `captain_inboxes` | 助手↔收件箱绑定 |
| `CaptainPreference` | `captain_preferences` | 账户级 AI 偏好(tone/language/auto_label/auto_reply 等) |
| `CaptainAutoReplyRule` | `captain_auto_reply_rules` | 自动回复规则(static/llm/mixed 三模式) |
| `CopilotThread` | `copilot_threads` | Copilot 对话线程(account_id + user_id + assistant_id) |
| `CopilotMessage` | `copilot_messages` | 线程消息(JSONB content,支持 thinking/tool_result) |
| `CopilotSuggestionMessage` | `copilot_suggestion_messages` | 会话级建议(reply/suggestion/summary,pending/accepted/rejected) |
| `ArticleEmbedding` | `article_embeddings` | 帮助中心文章向量嵌入(JSONB 存储向量) |
- `CopilotThread.PreviousHistory()` 方法将消息历史转为 LLM `[]ChatMessage` 格式
- `CopilotMessage.BeforeSave()` 验证 JSONB key 白名单(content/reasoning/function_name/reply_suggestion)
### 2.3 Service 层
| Service | 文件 | 职责 | LLM 依赖 |
|---------|------|------|----------|
| `CaptainAssistantService` | `captain_assistant_service.go` | 助手 CRUD + Playground 对话 + `GenerateResponse` RAG 问答 | ✅ |
| `CaptainTaskService` | `captain_task_service.go` | 回复建议 / 摘要 / 改写(含 Stream 版本) | ✅ |
| `CaptainTaskExtendedService` | `captain_task_extended_service.go` | 批量标签建议 + 跟进任务 | ✅ |
| `CopilotService` | `copilot_service.go` | Copilot 线程管理 + 异步响应生成 | ✅ |
| `CopilotContextService` | `copilot_context_service.go` | 会话上下文组装(消息/联系人/历史) | ✅ |
| `RAGService` | `rag_service.go` | RAG 全流程:embedding→pgvector 搜索→LLM 生成 | ✅ |
| `ConversationInsightService` | `conversation_insight_service.go` | 参与者分析 / 行动项 / 标签建议 | ✅ |
| `CaptainConversationService` | `captain_conversation_service.go` | 会话级 AI 自动响应(handoff 模式) | ✅ |
| `CaptainDocumentService` | `captain_document_service.go` | 文档爬取/同步/embedding 生成 | ✅ |
| `CaptainBulkActionService` | `captain_bulk_action_service.go` | 批量 AI 操作 | ✅ |
| `CaptainAssistantResponseService` | `captain_assistant_response_service.go` | FAQ 生成与处理 | ✅ |
| `SystemPromptBuilder` | `system_prompt_builder.go` | 统一 prompt 构建 | — |
| `LLMArticleTranslationBackend` | `article_service.go` | 帮助中心文章 AI 翻译 | ✅ |
### 2.4 Handler + 路由层
**已注册路由**(`/api/v1/accounts/:account_id/captain/`):
```
# Assistant CRUD + 关联
assistants GET/POST/PUT/DELETE
assistants/:id/inboxes GET/POST/DELETE
assistants/:id/playground POST
assistants/:id/documents POST/GET/DELETE
assistants/:id/scenarios POST/GET/PUT/DELETE
# Document / Scenario / CustomTool
documents GET/POST/DELETE + /:id/sync
scenarios GET/POST/PUT/DELETE
custom_tools GET/POST/PUT/DELETE
# Copilot
copilot_threads GET/POST/GET/:id/DELETE/:id
copilot_threads/:id/copilot_messages GET/POST
copilot_threads/:id/messages POST
copilot_messages GET/POST
copilot/suggest_replies POST
copilot/summarize POST
copilot/translate POST
copilot/stream GET (SSE)
# Tasks (AI 任务)
tasks/reply_suggestion POST (+ /stream SSE)
tasks/summarize POST (+ /stream SSE)
tasks/rewrite POST (+ /stream SSE)
tasks/label_suggestion GET
tasks/follow_up GET
# Insight
conversation_insights/:id/analyze_participants POST
conversation_insights/:id/extract_action_items POST
conversation_insights/:id/suggest_labels POST
# Preference / Response / Bulk
preferences GET/PUT
assistant_responses CRUD + /process
bulk_actions POST
```
### 2.5 前端层
| 组件/文件 | 路径 | 说明 |
|-----------|------|------|
| Copilot 配置页 | `routes/dashboard/settings/captain/Index.vue` | 平台 Provider、账户模型/功能、回复行为、连接测试与 Embedding 重建 |
| ModelSelector | `routes/dashboard/settings/captain/components/ModelSelector.vue` | 按 feature 选择 LLM 模型 |
| FeatureToggle | `routes/dashboard/settings/captain/components/FeatureToggle.vue` | AI 功能开关 |
| CopilotContainer | `components/copilot/CopilotContainer.vue` | 侧边栏 Copilot 聊天面板 |
| Copilot (next) | `components-next/copilot/Copilot.vue` | 新版 Copilot 组件 |
| useCaptain | `composables/useCaptain.js` | Captain 功能开关/配额/错误处理 |
| useCopilotReply | `composables/useCopilotReply.js` | 回复建议/改写/摘要的 composable |
| useLabelSuggestions | `composables/useLabelSuggestions.js` | 标签建议 |
| 配置 API 客户端 | `api/copilotConfig.js` | 平台配置/测试/重建与账户聚合配置 |
| Captain API 客户端 | `api/captain/` | Assistant、Document、Task、Copilot Thread/Message、Tool 等业务 API |
**Feature Flags**(`featureFlags.js`):
- `CAPTAIN` = `captain_integration`
- `CAPTAIN_V2` = `captain_integration_v2`
- `CAPTAIN_TASKS` = `captain_tasks`
- `CAPTAIN_CUSTOM_TOOLS` = `custom_tools`
- `CAPTAIN_DOCUMENT_AUTO_SYNC` = `captain_document_auto_sync`
### 2.6 后台 Worker
| Worker | 文件 | 任务类型 | 说明 |
|--------|------|----------|------|
| CaptainDocumentWorker | `captain_document_worker.go` | 6 种任务 | 文档同步/爬取/页面解析/embedding 更新/调度 |
| CopilotResponseWorker | `copilot_response_worker.go` | 1 种任务 | 异步 Copilot 响应生成 |
| CaptainConversationWorker | `captain_conversation_service.go` 内 | 1 种任务 | 会话响应构建、tool-call 与 handoff;已接入 AgentBot Listener |
### 2.7 配置层
Copilot Provider 配置存储在 `installation_configs`,由设置页面写入;运行时
`ProviderManager` 热替换底层 Provider。`backend/internal/config/config.go` 不再定义
Captain/Copilot 模型字段,也不读取相关环境变量或 YAML 配置。
---
## 3. Chatwoot AI 功能对照表
| Chatwoot Captain 功能 | GoChat 状态 | 说明 |
|------------------------|-------------|------|
| Captain Assistant(AI 助手配置) | ✅ 完整 | 模型/服务/handler/路由/前端全链路 |
| Copilot(客服侧边栏 AI 助手) | ✅ 完整 | 含 SSE 流式 + 异步 Worker |
| Reply Suggestion(回复建议) | ✅ 完整 | 含流式 + RAG 上下文 |
| Summarize(会话摘要) | ✅ 完整 | 含流式 |
| Rewrite(改写润色) | ✅ 完整 | 含流式,7 种操作 |
| Label Suggestion(标签建议) | ✅ 完整 | 单会话 + 批量 |
| Follow-up Task(跟进任务) | ✅ 完整 | 批量 |
| Knowledge Base / RAG(知识库问答) | ✅ 完整 | RAGService、Handler 和 `/captain/rag/*` 路由已注册 |
| Document Sync(文档爬取同步) | ✅ 完整 | 6 种 Worker 任务 |
| Custom Tools(Function Calling) | ✅ 完整 | ToolDefinition、HTTP 执行和 tool-call 循环已接入 |
| Captain Preferences(AI 偏好) | ✅ 完整 | tone/language/auto_label/auto_reply |
| Auto-Reply Rules(自动回复规则) | ✅ 完整 | CRUD、条件匹配、static/llm/mixed 和消息 Listener 已接入 |
| Conversation Insight(会话洞察) | ✅ 完整 | 参与者分析/行动项/标签 |
| Bulk Actions(批量 AI 操作) | ✅ 完整 | |
| Help Center 语义搜索 | ✅ 完整 | pgvector 搜索、文章向量生成和重建进度已接入 |
| AgentBot + Captain(端到端 AI 客服) | ✅ 完整 | `captain` BotType 路由到 CaptainConversationService |
| Captain Conversation Auto-Response | ✅ 完整 | Worker、Listener、tool-call 与 handoff 已接入 |
| Article AI 翻译 | ✅ 完整 | LLMArticleTranslationBackend |
| Multi-Provider LLM | ✅ 完整 | OpenAI、Anthropic、OpenAI-compatible,支持自定义兼容端点 |
| Token 用量统计与配额 | ❌ 缺失 | 前端有 captainLimits 结构,后端无统计 |
| AI 配置审计 | ✅ 完整 | Provider 配置变更审计不记录 Key/掩码;调用级审计仍属后续能力 |
---
## 4. 已完成闭环与剩余缺口
### 已完成 G1:数据库驱动的 Copilot 配置中心
- Provider/API Key 由“设置 → Copilot 配置”写入 `installation_configs`。
- API Key 明文存储,但读取接口、页面和审计只暴露状态/掩码。
- `ProviderManager` 热替换运行时 Provider;账户功能模型进入实际请求。
### 已完成 G2:RAG 路由与运行服务
- `RAGService`/`RAGHandler` 已实例化并注册 `/captain/rag/query` 与索引路由。
### 已完成 G3:AutoReplyRule 消息闭环
- 已实现规则 CRUD、条件匹配、static/llm/mixed 回复和消息 Listener。
### 已完成 G4:CaptainConversationService 接入
- 已注入 Handler、Worker、AgentBot Listener 和 ToolExecutionService,支持 handoff。
### 已完成 G5:AgentBot + Captain
- `captain` BotType 已路由到 CaptainConversationService;Webhook Bot 行为保持兼容。
### 已完成 G6:Help Center 语义搜索
- ArticleService 已生成查询/文章 Embedding 并通过 pgvector 搜索;维度可动态迁移并后台重建。
### 已完成 G7:Function Calling
- ToolExecutionService 已完成工具定义转换、HTTP 执行、结果回传和多轮 tool-call loop。
### 已完成 G8:多 LLM Provider
- OpenAI、Anthropic 和 OpenAI-compatible 均可通过数据库配置并热切换。
### 剩余缺口
- Token 用量、成本和账户配额。
- AI 调用级审计、Langfuse/OpenTelemetry 观测和质量评估。
- Provider 动态模型发现与缓存、多 Provider fallback。
- 独立语音转写 Provider 和账户级配额策略。
---
## 5. 开发路线图
### 阶段 1:激活现有 AI 功能(P0,已完成)
**目标**:让已写好的 90% 代码真正跑起来,实现"配置即可用"。
**前提**:需要一个可用的 LLM API Key(OpenAI 或兼容端点)。
#### 任务 1.1:通过页面配置 Copilot Provider(✅ 已完成)
在“设置 → Copilot 配置”中保存 Provider、Base URL、API Key 和默认模型。
配置写入数据库并热替换运行时 Provider,不使用环境变量或 `config*.yaml`。
- Copilot 全局永久启用,不定义总开关。
- Provider 未配置时返回明确的 `COPILOT_NOT_CONFIGURED`。
- API Key 明文存储,读取接口仅返回掩码和配置状态。
**验收**:保存后无需重启,新请求立即使用页面配置的 Provider。
#### 任务 1.2:注册 RAG 路由(✅ 已完成)
**文件修改**:
1. `backend/internal/app/bootstrap.go`:
- 实例化 `RAGService`(注入 `captainAssistantResponseRepo` + `captainAssistantRepo` + `llmProvider`)
- 实例化 `RAGHandler`(注入 `RAGService`)
- 添加到 `Handlers` 结构体
2. `backend/internal/router/router.go`:
```go
// RAG Knowledge Base Q&A
rag := captain.Group("/rag")
{
rag.POST("/query", h.RAG.Query)
rag.POST("/index/:response_id", h.RAG.IndexResponse)
}
```
**验收**:`curl -X POST /api/v1/accounts/1/captain/rag/query -d '{"assistant_id":1,"question":"test"}'`
返回非 404。
#### 任务 1.3:接入 CaptainConversationService(✅ 已完成)
服务已注入 Handler、Worker、AgentBot Listener 和 ToolExecutionService。
**验收**:会话级响应、tool-call 和 handoff 路径均有自动化覆盖。
#### 任务 1.4:端到端验证(✅ 配置链路已完成)
配置真实 LLM API Key 后测试:
1. Playground 对话:`POST /captain/assistants/:id/playground`
2. 回复建议:`POST /captain/tasks/reply_suggestion`
3. RAG 问答:`POST /captain/rag/query`
4. Copilot 流式:`GET /captain/copilot/stream`
5. 前端 Copilot 面板对话
**交付物**:AI 功能在开发环境完整可用。
---
### 阶段 2:自动回复与端到端 AI 客服(P1,核心链路已完成)
**目标**:实现"客户消息进来 → AI 自动响应"的闭环。
#### 任务 2.1:AutoReplyRule 完整接入(✅ 已完成)
**子任务**:
1. **条件匹配引擎**(`auto_reply_rule_service.go`):
- 实现 `MatchRules(ctx, accountID, conversationID, messageContent) ([]CaptainAutoReplyRule, error)`
- 支持 condition 字段:`message_content`(contains/regex/equals)、`sender_type`、
`conversation_status`、`language`、`keywords`
- 按 priority 排序,返回第一个匹配的规则
2. **消息钩子集成**:
- 在消息接收流程(`channel/incoming.go` 或 `message_service.go`)中,
消息入库后调用 `AutoReplyRuleService.MatchRules`
- 匹配到规则时:
- `static` 模式:直接发送 `ResponseText`
- `llm` 模式:调用 `CaptainAssistantService.GenerateResponse` 生成回复
- `mixed` 模式:static 前缀 + LLM 正文
- 尊重 `DelaySeconds` 和 `OneTimeOnly` 配置
- 通过 WorkerPool 异步执行(避免阻塞消息接收)
3. **路由注册**:
```go
autoReplyRules := captain.Group("/auto_reply_rules")
{
autoReplyRules.GET("", h.AutoReplyRule.List)
autoReplyRules.POST("", h.AutoReplyRule.Create)
autoReplyRules.GET("/:rule_id", h.AutoReplyRule.Get)
autoReplyRules.PUT("/:rule_id", h.AutoReplyRule.Update)
autoReplyRules.DELETE("/:rule_id", h.AutoReplyRule.Delete)
}
```
4. **前端**:
- 复用 Chatwoot 前端 auto-reply 设置页(如已 vendored)
- 新增 API 客户端 `api/captain/autoReplyRules.js`
**验收**:创建一条 llm 模式规则 → 发送匹配消息 → AI 自动回复。
#### 任务 2.2:AgentBot + Captain 集成(✅ 已完成)
**子任务**:
1. **扩展 AgentBot 模型**(`agent_bot.go`):
- 新增 `BotType` 字段:`webhook`(现有) / `captain`(新增)
- `captain` 类型时关联 `AssistantID`
2. **消息路由**:
- 在消息分配逻辑中,当 inbox 的 AgentBot 类型为 `captain` 时,
消息直接路由到 `CaptainConversationService.BuildConversationResponseByAccount`
- AI 生成的回复作为 `agent_bot` 消息发送到会话
3. **Handoff 逻辑**:
- `CaptainConversationResponse.Action == "handoff"` 时,将会话转给人工客服
- 更新会话 status + assignee
4. **前端**:
- AgentBot 管理页支持选择 `captain` 类型 + 关联 Assistant
**验收**:配置一个 captain 类型 AgentBot → 客户发消息 → AI 自动回复 → AI 判断需转人工时 handoff。
#### 任务 2.3:CaptainConversationService 完整接入(✅ 已完成)
**子任务**:
1. **工具调用实现**:
- 将 `CaptainCustomTool` 列表转为 `llm.ToolDefinition` 传入 `ChatRequest.Tools`
- 解析 LLM 返回的 `tool_call` → 执行 HTTP 请求(按 CustomTool 的 endpoint/auth/template)
- 将 tool 结果回传 LLM → 继续生成
2. **可用工具**(`AvailableTools` 已定义 7 个):
- `add_contact_note` / `add_private_note` / `update_priority`
- `add_label_to_conversation` / `faq_lookup` / `resolve_conversation` / `handoff`
- 实现每个工具的执行函数
**验收**:AI 能在对话中调用自定义工具(如查询订单、添加标签)。
---
### 阶段 3:增强 AI 能力深度(P2,1-2 周)
#### 任务 3.1:Help Center 语义搜索(✅ 已完成)
**子任务**:
1. `article_service.go` 添加 `SearchByEmbedding(ctx, query, limit)` 方法
- 调用 `llmProvider.CreateEmbedding` 生成查询向量
- pgvector 余弦相似度搜索 `ArticleEmbedding` 表
2. 文章创建/更新时自动生成 embedding(通过 Worker 异步)
3. API:`GET /api/v1/portals/:portal_id/articles/search?q=...`
4. 前端帮助中心搜索框接入
**验收**:搜索"如何重置密码"能找到相关文章(即使标题不含"重置")。
#### 任务 3.2:Function Calling 完整实现(✅ 已完成)
详见阶段 2 任务 2.3 的工具调用实现。此阶段将其推广到所有 AI 服务:
- `CopilotService` — Copilot 对话中可调用工具
- `CaptainTaskService` — 回复建议时可调用 FAQ 查询工具
- `CaptainAssistantService.GenerateResponse` — Playground 对话中可调用工具
#### 任务 3.3:多 LLM Provider 支持(✅ 已完成)
**子任务**:
1. `llm/anthropic_provider.go` — Claude 系列(不同 API 格式,需适配)
2. `llm/volcengine_provider.go` — 火山引擎/豆包(OpenAI 兼容,可能只需 baseURL 配置)
3. `llm/qwen_provider.go` — 通义千问(OpenAI 兼容)
4. ProviderManager 根据页面保存的数据库配置选择实现并热切换
5. 前端 `ModelSelector` 已有 UI,后端按 feature(editor/assistant/copilot)支持不同模型
**验收**:页面选择 Anthropic 并保存后,AI 功能使用 Claude 模型。
#### 任务 3.4:上下文窗口优化
**子任务**:
1. `CopilotContextService` 实现 token 计数(tiktoken Go 库或近似估算)
2. 滑动窗口截断:超过 token 上限时,截断早期消息
3. 长会话自动摘要:超过阈值时,用 LLM 摘要历史消息作为 system 上下文
4. 配置项:`captain.max_context_tokens`(默认 4096)
**验收**:100+ 条消息的长会话不会超出 token 限制,AI 仍能理解上下文。
---
### 阶段 4:企业级能力(P3,2-4 周,按需)
#### 任务 4.1:AI 用量统计与配额
- 按 account/user 统计 token 消耗(prompt_tokens + completion_tokens)
- 存储到 `captain_usage_logs` 表
- 配额限制:前端 `captainLimits` 结构已存在,后端实现拦截逻辑
- 用量仪表盘:`GET /captain/usage` 返回统计数据
- 前端设置页展示用量进度条
#### 任务 4.2:AI 响应质量管控
- `CopilotSuggestionMessage` 的 `accepted`/`rejected` 状态反馈循环
- 基于反馈优化 prompt(few-shot 示例注入:被接受的回复作为正例)
- A/B 测试框架:同一请求发到两个模型/prompt 配置,比较接受率
- 质量指标:接受率、拒绝率、编辑率(用户发送前修改了多少)
#### 任务 4.3:多语言 AI
- `CaptainPreference.Language` 传入 LLM system prompt
- 回复建议/摘要/改写尊重目标语言
- Help Center 文章跨语言语义搜索(embedding 包含语言信息)
- Auto-Reply Rule 的 `language` 条件匹配
#### 任务 4.4:AI 审计日志
- 记录每次 AI 调用:prompt / response / model / token 消耗 / user / timestamp / feature
- 存储到 `captain_audit_logs` 表
- API:`GET /captain/audit_logs`(管理员可见)
- 合规审计支持:导出 CSV / 按时间范围筛选
---
## 6. 风险评估与依赖
### 6.1 技术风险
| 风险 | 影响 | 缓解措施 |
|------|------|----------|
| LLM API 调用超时/失败 | AI 功能不可用 | 已有重试机制(3 次指数退避);需加 fallback 策略(降级到静态回复) |
| pgvector 维度不匹配 | RAG 搜索失败 | 使用动态维度迁移、保存确认和后台 Embedding 重建进度控制 |
| Token 消耗成本 | 生产环境费用 | 阶段 4 实现配额限制;阶段 1-3 开发环境用 gpt-4o-mini 控制成本 |
| SSE 连接稳定性 | 流式响应中断 | 已有 `X-Accel-Buffering: no`;需加心跳机制和断线重连 |
| 并发 LLM 调用 | 速率限制 | 需实现请求队列 + 限流(令牌桶) |
### 6.2 外部依赖
| 依赖 | 用途 | 状态 |
|------|------|------|
| LLM API(OpenAI/兼容) | Chat + Embedding | 需配置 API Key |
| pgvector 扩展 | 向量搜索 | ✅ 已安装(PG 17 + pgvector) |
| 帮助中心爬取 | 文档同步 | 需 HTTP 客户端(已有 resty) |
### 6.3 前端依赖
前端代码来自 Chatwoot Vue 3 vendored,AI 相关 UI 组件已存在(CopilotContainer、Captain 设置页、
ModelSelector、FeatureToggle)。阶段 1-2 的前端改动极小,主要是确保 API 端点与前端调用路径一致。
---
## 7. 附录:关键文件索引
### 后端
| 文件 | 说明 |
|------|------|
| `backend/internal/llm/provider.go` | LLM Provider 接口 + 数据结构 |
| `backend/internal/llm/openai_provider.go` | OpenAI 兼容 Provider 实现 |
| `backend/internal/model/captain_models.go` | Captain 全部数据模型 |
| `backend/internal/model/copilot_models.go` | Copilot 线程/消息/建议模型 |
| `backend/internal/model/auto_reply_rule_models.go` | 自动回复规则模型 |
| `backend/internal/model/article_embedding.go` | 帮助中心文章 embedding |
| `backend/internal/llm/provider_manager.go` | 数据库配置驱动的运行时 Provider 热切换 |
| `backend/internal/app/bootstrap.go` | 依赖注入(LLM Provider + Captain Services) |
| `backend/internal/router/router.go` | 路由注册(captain 命名空间 ~L1319-1489) |
| `backend/internal/service/captain_assistant_service.go` | 助手 CRUD + Playground + RAG |
| `backend/internal/service/captain_task_service.go` | 回复建议/摘要/改写(含 Stream) |
| `backend/internal/service/captain_task_extended_service.go` | 批量标签/跟进 |
| `backend/internal/service/copilot_service.go` | Copilot 线程管理 |
| `backend/internal/service/copilot_context_service.go` | 会话上下文组装 |
| `backend/internal/service/rag_service.go` | RAG 全流程 |
| `backend/internal/service/conversation_insight_service.go` | 会话洞察 |
| `backend/internal/service/captain_conversation_service.go` | 会话级 AI 响应、tool-call 与 handoff |
| `backend/internal/service/captain_document_service.go` | 文档同步 |
| `backend/internal/service/captain_document_worker.go` | 文档 Worker |
| `backend/internal/service/copilot_response_worker.go` | Copilot 响应 Worker |
| `backend/internal/service/system_prompt_builder.go` | Prompt 构建 |
| `backend/internal/handler/api/v1/rag_handler.go` | 已注册的 RAG Handler |
| `backend/internal/handler/api/v1/sse_stream_handler.go` | SSE 流式 Handler |
| `backend/internal/handler/api/v1/captain_assistant_handler.go` | 助手 Handler |
| `backend/internal/handler/api/v1/captain_task_handler_test.go` | 任务 Handler 测试 |
| `backend/internal/handler/api/v1/auto_reply_rule_handler.go` | 自动回复规则 Handler |
### 前端
| 文件 | 说明 |
|------|------|
| `frontend/app/javascript/dashboard/routes/dashboard/settings/captain/Index.vue` | Captain 设置页 |
| `frontend/app/javascript/dashboard/routes/dashboard/settings/captain/components/ModelDropdown.vue` | 模型下拉选择 |
| `frontend/app/javascript/dashboard/components/copilot/CopilotContainer.vue` | Copilot 侧边栏 |
| `frontend/app/javascript/dashboard/components-next/copilot/Copilot.vue` | 新版 Copilot 组件 |
| `frontend/app/javascript/dashboard/composables/useCaptain.js` | Captain composable |
| `frontend/app/javascript/dashboard/composables/useCopilotReply.js` | 回复建议 composable |
| `frontend/app/javascript/dashboard/composables/useLabelSuggestions.js` | 标签建议 composable |
| `frontend/app/javascript/dashboard/api/captain/*.js` | 12 个 API 客户端 |
| `frontend/app/javascript/dashboard/featureFlags.js` | Feature flags 定义 |
### 配置
| 文件 | 说明 |
|------|------|
| `backend/internal/service/copilot_config_service.go` | 页面配置持久化、明文密钥存储、API 掩码和运行时生效 |
| `frontend/app/javascript/dashboard/routes/dashboard/settings/captain/Index.vue` | Copilot 配置页面 |
### 文档
| 文件 | 说明 |
|------|------|
| `docs/requirements/M10-captain-and-copilot.md` | Captain AI 与 Copilot 功能需求梳理 |
| `docs/product/01-product-requirements.md` | 产品需求文档 |
---
## 路线图时间线总览
```
阶段 1 (P0, 1-2天) 阶段 2 (P1, 3-5天) 阶段 3 (P2, 1-2周) 阶段 4 (P3, 2-4周)
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 1.1 Copilot配置 │ │ 2.1 AutoReply │ │ 3.1 HC 语义搜索 │ │ 4.1 用量统计 │
│ 中心 │ │ 规则接入 │ │ 3.2 Function │ │ 4.2 质量管控 │
│ 1.2 RAG 路由 │ │ 2.2 AgentBot + │ │ Calling 推广│ │ 4.3 多语言 AI │
│ 1.3 取消忽略 │ │ Captain 集成 │ │ 3.3 多 Provider │ │ 4.4 审计日志 │
│ 1.4 端到端验证 │ │ 2.3 工具调用实现 │ │ 3.4 上下文优化 │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘
▲ 激活现有功能 ▲ 自动回复闭环 ▲ 智能化增强 ▲ 企业级能力
│ │ │ │
└── 最高优先级 ───────┴── 核心价值 ──────────┴── 渐进增强 ───────────┴── 按需实现
```
---
*文档结束。如需开始执行阶段 1 的修改,请告知。*