1. 建筑哲学
企業AI聊天機器人平台不僅僅是「呼叫OpenAI API並回傳回應」。這是一個 分散式系統 复杂,有许多需要实时协调的组件。三个架构原则:
- 模組化 — 每個能力都是獨立的有界上下文,可以單獨替換/升級
- 事件驅動 — 服務透過事件進行通信,減少耦合,支援審計跟踪
- 人工智慧優先 — AI 工作負載的架構最佳化:串流、長時間運行的推理、GPU 感知擴展
2. 有界上下文-AI 聊天機器人的 DDD
应用领域驱动设计将平台划分为 8 有界上下文:
┌───────────────────────────────────────────────────────────────────┐
│ AI CHATBOT PLATFORM │
├───────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ CONVERSATION │ │ KNOWLEDGE │ │ AGENT │ │
│ │ CONTEXT │ │ CONTEXT │ │ CONTEXT │ │
│ │ │ │ │ │ │ │
│ │ • Session │ │ • Documents │ │ • Tools │ │
│ │ • Messages │ │ • Embeddings │ │ • Functions │ │
│ │ • Memory │ │ • Search │ │ • Workflows │ │
│ │ • Context │ │ • Sync │ │ • Planning │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ ┌──────┴───────┐ ┌──────┴───────┐ ┌──────┴───────┐ │
│ │ CHANNEL │ │ AI ENGINE │ │ GUARDRAIL │ │
│ │ CONTEXT │ │ CONTEXT │ │ CONTEXT │ │
│ │ │ │ │ │ │ │
│ │ • Web Widget │ │ • LLM Router │ │ • Input Gate │ │
│ │ • Slack Bot │ │ • Streaming │ │ • Output Gate│ │
│ │ • WhatsApp │ │ • Prompt Eng │ │ • PII Mask │ │
│ │ • Mobile SDK │ │ • Model Mgmt │ │ • Toxicity │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ ┌──────┴───────┐ ┌──────┴───────┐ │
│ │ ANALYTICS │ │ BILLING │ │
│ │ CONTEXT │ │ CONTEXT │ │
│ │ │ │ │ │
│ │ • Metrics │ │ • Usage │ │
│ │ • Tracing │ │ • Plans │ │
│ │ • Feedback │ │ • Invoicing │ │
│ │ • Evals │ │ • Quotas │ │
│ └──────────────┘ └──────────────┘ │
│ │
└───────────────────────────────────────────────────────────────────┘
3. 上下文映射——服务交互
// Domain Events flowing between bounded contexts
type DomainEvent =
| { type: 'conversation.started'; payload: { sessionId: string; channelType: string; tenantId: string } }
| { type: 'message.received'; payload: { sessionId: string; content: string; role: 'user' | 'assistant' } }
| { type: 'knowledge.searched'; payload: { query: string; results: number; latencyMs: number } }
| { type: 'tool.invoked'; payload: { toolName: string; params: Record<string, unknown>; success: boolean } }
| { type: 'agent.planned'; payload: { plan: string[]; model: string } }
| { type: 'guardrail.triggered'; payload: { type: string; severity: 'low' | 'medium' | 'high' | 'critical' } }
| { type: 'response.generated'; payload: { sessionId: string; tokensUsed: number; latencyMs: number } }
| { type: 'human.escalated'; payload: { sessionId: string; reason: string } }
| { type: 'feedback.submitted'; payload: { messageId: string; rating: 'positive' | 'negative'; comment?: string } };
4. 高層架構-C4 1級(系統上下文)
┌─────────────┐
│ End User │
└──────┬──────┘
│
┌────────────┼────────────┐
│ │ │
┌─────▼────┐ ┌────▼─────┐ ┌───▼──────┐
│ Web Chat │ │ Slack │ │ WhatsApp │
│ Widget │ │ Bot │ │ Bot │
└─────┬────┘ └────┬─────┘ └───┬──────┘
│ │ │
└────────────┼────────────┘
│
┌───────▼───────┐
│ API Gateway │
│ (Kong/Nginx) │
└───────┬───────┘
│
┌────────────┼────────────┐
│ │
┌────────▼─────────┐ ┌─────────▼──────────┐
│ Chatbot Platform │ │ Admin Dashboard │
│ (Core API) │ │ (Management UI) │
└────────┬─────────┘ └─────────┬──────────┘
│ │
┌─────────┼──────────┐ │
│ │ │ │
┌───▼──┐ ┌───▼──┐ ┌────▼───┐ ┌─────▼─────┐
│OpenAI│ │Claude│ │ Self- │ │PostgreSQL │
│ API │ │ API │ │ Hosted │ │ Qdrant │
│ │ │ │ │ (vLLM) │ │ Redis │
└──────┘ └──────┘ └────────┘ └───────────┘
5. C4 2 级——容器图
┌─────────────────────────────────────────────────────────────────────┐
│ CHATBOT PLATFORM │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌──────────────────┐ ┌────────────────┐ │
│ │ Channel Gateway │───▶│ Conversation Svc │───▶│ AI Engine Svc │ │
│ │ (NestJS) │ │ (NestJS) │ │ (Python/FastAPI│ │
│ │ │ │ │ │ + TypeScript) │ │
│ │ • WebSocket │ │ • Session mgmt │ │ • LLM Router │ │
│ │ • REST API │ │ • Context build │ │ • RAG Pipeline│ │
│ │ • Webhook recv │ │ • Memory mgmt │ │ • Prompt Eng │ │
│ └─────────────────┘ └──────────────────┘ │ • Streaming │ │
│ └────────────────┘ │
│ ┌─────────────────┐ ┌──────────────────┐ ┌────────────────┐ │
│ │ Agent Service │ │ Knowledge Service│ │ Guardrail Svc │ │
│ │ (Python) │ │ (Python) │ │ (Python) │ │
│ │ │ │ │ │ │ │
│ │ • Tool Registry │ │ • Doc Ingestion │ │ • Input check │ │
│ │ • Executor │ │ • Embedding │ │ • Output check│ │
│ │ • Planner │ │ • Search │ │ • PII masking │ │
│ └─────────────────┘ └──────────────────┘ └────────────────┘ │
│ │
│ ┌─────────────────┐ ┌──────────────────┐ ┌────────────────┐ │
│ │ Analytics Svc │ │ Billing Service │ │ Admin API │ │
│ │ (Python) │ │ (NestJS) │ │ (NestJS) │ │
│ │ │ │ │ │ │ │
│ │ • Tracing │ │ • Usage meter │ │ • Tenant mgmt │ │
│ │ • Metrics │ │ • Subscription │ │ • Config │ │
│ │ • Evals │ │ • Invoicing │ │ • Prompt mgmt │ │
│ └─────────────────┘ └──────────────────┘ └────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
6. 事件驅動架構
為什麼人工智慧聊天機器人採用事件驅動?
- 審計追蹤 — 所有對話事件都會被記錄,這對合規性至關重要
- 非同步處理 — 知识摄取、分析、计费运行异步
- 解耦 — AI Engine不需要了解Billing;只發出令牌使用事件
- 重播 — 重播事件以調試對話流程、重新訓練模型
// Event Bus implementation với Kafka
import { Kafka, Producer, Consumer } from 'kafkajs';
interface EventBus {
publish(topic: string, event: DomainEvent): Promise<void>;
subscribe(topic: string, handler: (event: DomainEvent) => Promise<void>): Promise<void>;
}
class KafkaEventBus implements EventBus {
private producer: Producer;
private consumers: Map<string, Consumer> = new Map();
constructor(private kafka: Kafka) {
this.producer = kafka.producer();
}
async publish(topic: string, event: DomainEvent): Promise<void> {
await this.producer.send({
topic,
messages: [{
key: event.payload.sessionId ?? crypto.randomUUID(),
value: JSON.stringify({
...event,
timestamp: new Date().toISOString(),
eventId: crypto.randomUUID(),
}),
headers: {
'event-type': event.type,
'tenant-id': event.payload.tenantId ?? 'system',
},
}],
});
}
async subscribe(
topic: string,
handler: (event: DomainEvent) => Promise<void>,
): Promise<void> {
const consumer = this.kafka.consumer({ groupId: `${topic}-consumer` });
await consumer.connect();
await consumer.subscribe({ topic, fromBeginning: false });
await consumer.run({
eachMessage: async ({ message }) => {
const event = JSON.parse(message.value!.toString()) as DomainEvent;
await handler(event);
},
});
this.consumers.set(topic, consumer);
}
}
7. 请求流程——从用户消息到响应
User Message
│
▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Channel │────▶│ Input │────▶│Conversa- │
│ Gateway │ │ Guardrail│ │tion Svc │
└──────────┘ └──────────┘ └────┬─────┘
│
┌──────────────────┤
│ │
▼ ▼
┌──────────┐ ┌──────────┐
│ Memory │ │ Knowledge│
│ Retrieve │ │ Search │
└────┬─────┘ └────┬─────┘
│ │
└────────┬─────────┘
│
▼
┌──────────┐
│ Prompt │
│ Assembly │
└────┬─────┘
│
▼
┌──────────┐
│ AI Engine│──── Tool Calls? ───▶ Agent Svc
│ (LLM) │◀──── Results ──────┘
└────┬─────┘
│
▼
┌──────────┐ ┌──────────┐
│ Output │────▶│ Channel │──▶ User
│ Guardrail│ │ Delivery │
└──────────┘ └──────────┘
│
▼
┌──────────────┐
│ Event Bus │
│ (Analytics, │
│ Billing, │
│ Logging) │
└──────────────┘
8. 核心資料模型
// Core domain entities
interface Tenant {
id: string;
name: string;
plan: 'free' | 'pro' | 'enterprise';
config: TenantConfig;
createdAt: Date;
}
interface TenantConfig {
defaultModel: string; // e.g., 'gpt-4o'
fallbackModels: string[]; // e.g., ['claude-3-sonnet', 'gpt-4o-mini']
maxTokensPerRequest: number; // e.g., 4096
maxConversationsPerDay: number; // e.g., 10000
enabledChannels: ChannelType[]; // e.g., ['web', 'slack']
guardrailConfig: GuardrailConfig;
ragConfig: RAGConfig;
}
interface Conversation {
id: string;
tenantId: string;
channelType: ChannelType;
channelUserId: string;
status: 'active' | 'closed' | 'escalated';
metadata: Record<string, unknown>;
startedAt: Date;
lastMessageAt: Date;
}
interface Message {
id: string;
conversationId: string;
role: 'user' | 'assistant' | 'system' | 'tool';
content: string;
toolCalls?: ToolCall[];
metadata: {
model?: string;
tokensUsed?: { input: number; output: number };
latencyMs?: number;
sources?: Citation[];
};
createdAt: Date;
}
interface Citation {
documentId: string;
chunkId: string;
content: string;
score: number;
metadata: Record<string, unknown>;
}
type ChannelType = 'web' | 'slack' | 'teams' | 'whatsapp' | 'discord' | 'email' | 'api';
9. 部署拓扑
┌─────────────────────────── Kubernetes Cluster ──────────────────────┐
│ │
│ ┌─── Namespace: chatbot-platform ──────────────────────────────┐ │
│ │ │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │Channel │ │Conversa- │ │AI Engine │ │Agent Svc │ │ │
│ │ │Gateway │ │tion Svc │ │(2 replicas│ │ │ │ │
│ │ │(3 rep.) │ │(2 rep.) │ │+ GPU pod)│ │(2 rep.) │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │
│ │ │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │Knowledge │ │Guardrail │ │Analytics │ │Billing │ │ │
│ │ │ Svc │ │ Svc │ │ Svc │ │ Svc │ │ │
│ │ │(2 rep.) │ │(2 rep.) │ │(1 rep.) │ │(1 rep.) │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─── Namespace: data ──────────────────────────────────────────┐ │
│ │ PostgreSQL (HA) │ Qdrant │ Redis Cluster │ Kafka │ MinIO │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─── Namespace: monitoring ────────────────────────────────────┐ │
│ │ Langfuse │ Prometheus │ Grafana │ AlertManager │ Loki │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────────┘
10.API设计原则
// REST API structure
// POST /api/v1/conversations — Start conversation
// POST /api/v1/conversations/:id/messages — Send message (returns stream)
// GET /api/v1/conversations/:id/messages — Get message history
// POST /api/v1/conversations/:id/feedback — Submit feedback
// POST /api/v1/conversations/:id/escalate — Escalate to human
// GET /api/v1/conversations/:id — Get conversation details
// WebSocket for real-time
// ws://api/v1/ws?token=xxx
// Admin API
// POST /api/v1/admin/knowledge-bases — Create knowledge base
// POST /api/v1/admin/knowledge-bases/:id/documents — Upload document
// GET /api/v1/admin/analytics/conversations — Analytics dashboard
// PUT /api/v1/admin/prompts/:id — Update prompt template
// POST /api/v1/admin/tools — Register tool
第 2 课总结
- 8 有界上下文:對話、知識、代理商、通路、AI引擎、Guardrail、分析、計費
- 事件驅動 使用 Kafka 進行稽核追蹤 + 非同步處理 + 解耦的架構
- 請求流經 7個階段:通道→輸入防護→上下文建置→RAG +記憶體→提示→LLM→輸出防護
- 每项服务都是 可独立部署 在 Kubernetes 上
- 核心实体:租户→对话→消息→引用
下一篇: 多模型閘道 — 如何在 OpenAI/Claude/Gemini/自架模型、後備鏈、成本最佳化和代幣預算管理之間路由請求。