Files
gochat/docs/AI_FEATURE_ROADMAP.md
T
rogee a1ae852eb2 Fix widget i18n missing locale files and clean up unused locales
- widget/i18n/index.js: only import en.json and zh_CN.json (the only
  locale files present); remove 40+ imports for missing locale JSONs
  that caused Vite compile failure and global white screen
- dashboard/i18n/index.js: remove unused locale imports for consistency
- Remove 62 unused locale JSON files from widget/i18n/locale/
- Minor: update index.html, test helpers, e2e test, languages spec
2026-07-08 09:57:00 +08:00

633 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 功能支持评估与开发路线图
> 调研日期:2026-07-08
> 基于代码库:main 分支 @ e61b2ac
> 对标项目:Chatwoot Captain AI (enterprise edition)
---
## 目录
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 抽象层、
数据模型、Service 业务逻辑、Handler/路由、前端 UI 组件和后台 Worker。**约 90% 的 AI 代码
已经写好**,但存在若干"最后一公里"接缝未缝合的问题,导致部分功能无法实际运行。
核心结论:
- **可用功能**:Copilot 侧边栏对话、回复建议、会话摘要、改写润色、标签建议、跟进任务、
会话洞察、文档同步、批量 AI 操作、助手 CRUD/Playground、帮助中心文章 AI 翻译
- **代码就绪但未接入**:RAG 知识库问答(路由未注册)、自动回复规则(未接入消息流程)、
CaptainConversationService(被 `_ =` 忽略)
- **完全缺失**:帮助中心语义搜索、AgentBot + Captain 端到端 AI 客服、多 LLM Provider 支持
- **配置缺口**config.yaml 无 captain 配置段,LLM API Key 未注入,AI 功能处于"空转"状态
整体评估:基础设施成熟度高(9/10),功能可用度中等(5/10),需补齐配置与接缝工作。
---
## 2. 当前 AI 基础设施盘点
### 2.1 LLM Provider 层
**文件**`backend/internal/llm/provider.go` + `openai_provider.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`
- **问题**`ToolDefinition` 已定义但从未在调用时传入 LLM
### 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/summarypending/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 前端层
| 组件/文件 | 路径 | 说明 |
|-----------|------|------|
| Captain 设置页 | `routes/dashboard/settings/captain/Index.vue` | 模型选择 + 功能开关(label_suggestion/help_center_search/audio_transcription |
| 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/captain/` | 12 个文件:assistant/document/tasks/copilotThreads/copilotMessages/preferences/scenarios/tools/bulkActions/inboxes/customTools/response |
**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 种任务 | 会话响应构建(但 service 被 `_ =` 忽略) |
### 2.7 配置层
**文件**`backend/internal/config/config.go`
`CaptainConfig` 结构体已定义:
```go
type CaptainConfig struct {
Enabled bool
LLMProvider string // openai, azure, custom
LLMModel string // gpt-4o, gpt-3.5-turbo
LLMAPIKey string
LLMBaseURL string // 自定义端点
EmbeddingModel string // text-embedding-3-small
EmbeddingDims int // 1536
MaxTokens int
Temperature float64
}
```
- `LLMConfig()` 方法将 `CaptainConfig` 转为 provider 友好格式
- 支持热重载(`config.go` reloader 中包含 captain 字段)
- ENV 映射:`GOCHAT_CAPTAIN_ENABLED` / `GOCHAT_CAPTAIN_LLM_PROVIDER` / `GOCHAT_CAPTAIN_LLM_MODEL` /
`GOCHAT_CAPTAIN_LLM_API_KEY` / `GOCHAT_CAPTAIN_LLM_BASE_URL`
**问题**`backend/configs/config.yaml` 中**没有 captain 配置段**,所有 Captain 字段为默认零值。
bootstrap.go:536 创建 OpenAIProvider 时传入空 API Key 和空 BaseURL。
---
## 3. Chatwoot AI 功能对照表
| Chatwoot Captain 功能 | GoChat 状态 | 说明 |
|------------------------|-------------|------|
| Captain AssistantAI 助手配置) | ✅ 完整 | 模型/服务/handler/路由/前端全链路 |
| Copilot(客服侧边栏 AI 助手) | ✅ 完整 | 含 SSE 流式 + 异步 Worker |
| Reply Suggestion(回复建议) | ✅ 完整 | 含流式 + RAG 上下文 |
| Summarize(会话摘要) | ✅ 完整 | 含流式 |
| Rewrite(改写润色) | ✅ 完整 | 含流式,7 种操作 |
| Label Suggestion(标签建议) | ✅ 完整 | 单会话 + 批量 |
| Follow-up Task(跟进任务) | ✅ 完整 | 批量 |
| Knowledge Base / RAG(知识库问答) | ⚠️ 代码完整,路由未注册 | RAGService + RAGHandler 存在但未接入 |
| Document Sync(文档爬取同步) | ✅ 完整 | 6 种 Worker 任务 |
| Custom ToolsFunction Calling 定义) | ✅ 模型+服务完整 | 但 LLM 调用时未传 tools 参数 |
| Captain PreferencesAI 偏好) | ✅ 完整 | tone/language/auto_label/auto_reply |
| Auto-Reply Rules(自动回复规则) | ⚠️ 模型完整,未接入 | 模型+基础 service,无路由,无消息钩子 |
| Conversation Insight(会话洞察) | ✅ 完整 | 参与者分析/行动项/标签 |
| Bulk Actions(批量 AI 操作) | ✅ 完整 | |
| Help Center 语义搜索 | ❌ 缺失 | ArticleEmbedding 表存在但无搜索方法 |
| AgentBot + Captain(端到端 AI 客服) | ❌ 缺失 | AgentBot 仅支持 webhook 类型 |
| Captain Conversation Auto-Response | ⚠️ 代码存在,被忽略 | bootstrap.go:594 `_ = captainConversationService` |
| Article AI 翻译 | ✅ 完整 | LLMArticleTranslationBackend |
| Multi-Provider LLM | ❌ 仅 OpenAI | 无 Anthropic/国内模型 provider 实现 |
| Token 用量统计与配额 | ❌ 缺失 | 前端有 captainLimits 结构,后端无统计 |
| AI 审计日志 | ❌ 缺失 | |
---
## 4. 关键缺口分析
### 缺口 G1config.yaml 缺少 captain 配置段
- **影响**:所有 AI 功能无法实际调用 LLM(API Key 为空)
- **位置**`backend/configs/config.yaml` 缺少 captain 段;`bootstrap.go:536` 传入空值
- **修复成本**:极低(加几行 YAML + .env 注入)
### 缺口 G2RAG 路由未注册
- **影响**:知识库问答 API 无法访问
- **位置**`RAGHandler` 代码完整(`rag_handler.go`),但 `bootstrap.go` 未实例化
`RAGService`/`RAGHandler``router.go` 未注册 `/captain/rag/*` 路由
- **修复成本**:低(~20 行 bootstrap + router 代码)
### 缺口 G3AutoReplyRule 未接入
- **影响**:无法实现"消息进来 → AI 自动回复"
- **位置**`auto_reply_rule_models.go` 模型完整(static/llm/mixed),但:
- 无完整的条件匹配引擎
- 无消息接收时的规则匹配钩子
- 无路由注册
- **修复成本**:中(需实现条件匹配 + 消息流程集成)
### 缺口 G4CaptainConversationService 被忽略
- **影响**:会话级 AI 自动响应(handoff 模式)不可用
- **位置**`bootstrap.go:594` `_ = captainConversationService`
- **修复成本**:中(需接入消息接收流程 + handoff 逻辑)
### 缺口 G5AgentBot 仅支持 Webhook
- **影响**:无法实现"AgentBot 绑定 Captain Assistant → 端到端 AI 客服"
- **位置**`agent_bot.go` 只有 webhook 推送模式
- **修复成本**:中高(需扩展 AgentBot 类型 + 消息路由)
### 缺口 G6Help Center 语义搜索缺失
- **影响**:帮助中心文章无法语义搜索
- **位置**`ArticleEmbedding` 表存在,`article_service.go` 无搜索方法
- **修复成本**:中(需实现 embedding 生成 + pgvector 搜索 + API + 前端)
### 缺口 G7Function Calling 未实际使用
- **影响**CustomTool 定义了但 LLM 调用时未传 tools 参数,AI 无法调用工具
- **位置**`llm/provider.go``ToolDefinition` 已定义;
`captain_task_service.go` / `captain_conversation_service.go``ChatRequest` 未设置 `Tools` 字段
- **修复成本**:中(需实现 tool_call 循环 + HTTP 执行 + 结果回传)
### 缺口 G8:多 LLM Provider 支持
- **影响**:仅支持 OpenAI 兼容 API,无法直接使用 Anthropic/本地模型
- **位置**`llm/` 下只有 `openai_provider.go`
- **修复成本**:中(每个 provider ~200 行实现 + 接口适配)
---
## 5. 开发路线图
### 阶段 1:激活现有 AI 功能(P0,1-2 天)
**目标**:让已写好的 90% 代码真正跑起来,实现"配置即可用"。
**前提**:需要一个可用的 LLM API Key(OpenAI 或兼容端点)。
#### 任务 1.1config.yaml 添加 captain 配置段
**文件**`backend/configs/config.yaml`
```yaml
captain:
enabled: true
llm_provider: "openai" # openai, azure, custom
llm_model: "gpt-4o-mini" # 可按需改为 gpt-4o / gpt-3.5-turbo
llm_api_key: "" # 通过 .env: GOCHAT_CAPTAIN_LLM_API_KEY 注入
llm_base_url: "https://api.openai.com/v1" # 国内可改为火山引擎/豆芽等端点
embedding_model: "text-embedding-3-small"
embedding_dims: 1536
max_tokens: 1024
temperature: 0.7
```
同时更新 `config.dev.yaml``config.prod.yaml` 的 captain 段(如有)。
**验收**`go run cmd/gochat/main.go serve` 启动后,日志输出 LLM 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 忽略
**文件**`backend/internal/app/bootstrap.go:594`
将 `_ = captainConversationService` 改为注入到 Handlers 或消息处理流程。
最小改动:将其传入 `CaptainAssistantHandler` 或新建一个 handler 方法,
供后续阶段 2 的 AgentBot 集成使用。
**验收**:编译通过,`captainConversationService` 不再被忽略。
#### 任务 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,3-5 天)
**目标**:实现"客户消息进来 → AI 自动响应"的闭环。
#### 任务 2.1AutoReplyRule 完整接入
**子任务**
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.2AgentBot + 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.3CaptainConversationService 完整接入
**子任务**
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.1Help 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.2Function 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. Provider 工厂函数:根据 `config.captain.llm_provider` 选择实现
5. 前端 `ModelSelector` 已有 UI,后端按 featureeditor/assistant/copilot)支持不同模型
**验收**:配置 `llm_provider: "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.2AI 响应质量管控
- `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.4AI 审计日志
- 记录每次 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 搜索失败 | 当前固定 1536 维(text-embedding-3-small);更换 embedding 模型时需迁移 |
| Token 消耗成本 | 生产环境费用 | 阶段 4 实现配额限制;阶段 1-3 开发环境用 gpt-4o-mini 控制成本 |
| SSE 连接稳定性 | 流式响应中断 | 已有 `X-Accel-Buffering: no`;需加心跳机制和断线重连 |
| 并发 LLM 调用 | 速率限制 | 需实现请求队列 + 限流(令牌桶) |
### 6.2 外部依赖
| 依赖 | 用途 | 状态 |
|------|------|------|
| LLM APIOpenAI/兼容) | Chat + Embedding | 需配置 API Key |
| pgvector 扩展 | 向量搜索 | ✅ 已安装(PG 17 + pgvector |
| 帮助中心爬取 | 文档同步 | 需 HTTP 客户端(已有 resty |
### 6.3 前端依赖
前端代码来自 Chatwoot Vue 3 vendoredAI 相关 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/config/config.go` | CaptainConfig 配置结构 |
| `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 响应(被忽略) |
| `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/configs/config.yaml` | 基础配置(**缺少 captain 段** |
| `backend/internal/config/config.go` | CaptainConfig 结构体 + ENV 映射 |
### 文档
| 文件 | 说明 |
|------|------|
| `docs/comparison/M10-captain-chatwoot-vs-gochat.md` | Chatwoot vs GoChat 模型级对比 |
| `docs/PRD.md` | 产品需求文档 |
---
## 路线图时间线总览
```
阶段 1 (P0, 1-2天) 阶段 2 (P1, 3-5天) 阶段 3 (P2, 1-2周) 阶段 4 (P3, 2-4周)
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 1.1 config.yaml │ │ 2.1 AutoReply │ │ 3.1 HC 语义搜索 │ │ 4.1 用量统计 │
│ captain 段 │ │ 规则接入 │ │ 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 的修改,请告知。*