600 lines
29 KiB
Markdown
600 lines
29 KiB
Markdown
# 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 的修改,请告知。*
|