---
## 系统架构
### 整体架构图
> 也可通过 [architecture.puml](docs/images/architecture.puml) 文件查看源文件。
### 消息处理流程
> 也可通过 [message_flow.puml](docs/images/message_flow.puml) 文件查看源文件。
---
## 快速开始
### 前置条件
| 依赖 | 最低版本 | 说明 |
| -------------------------------------- | -------- | --------------------------- |
| [Go](https://go.dev/dl/) | 1.26.1 | Go 编程语言运行时 |
| [AWS CLI](https://aws.amazon.com/cli/) | 2.x | AWS 命令行工具(配置凭证) |
| [Bun](https://bun.sh/) | 1.x | 前端包管理工具(演示用) |
| AWS 账户 | — | 需要 S3 和 Bedrock 访问权限 |
### 步骤 1:克隆项目
```bash
git clone
### 客户端 → 服务端消息
#### 用户聊天消息 (`user_chat`)
```json
{
"type": "user_chat",
"data": {
"id": 1,
"user_id": "user-123",
"message": "检测这个系统的安全漏洞",
"selected_skill": "/vulnerability_scanner"
},
"timestamp": "2026-07-09T10:30:00Z"
}
```
| 字段 | 类型 | 说明 |
| --------------------- | ------ | ------------------------------------------------------- |
| `data.id` | int64 | 消息唯一 ID |
| `data.user_id` | string | 用户 ID |
| `data.message` | string | 用户消息内容 |
| `data.selected_skill` | string | 用户手动选中的技能(可选,如 `/vulnerability_scanner`) |
#### 心跳消息 (`heartbeat_chat`)
```json
{
"type": "heartbeat_chat",
"data": {
"action": "ping",
"nonce": "abc123",
"timestamp": "2026-07-09T10:30:00Z"
},
"timestamp": "2026-07-09T10:30:00Z"
}
```
### 服务端 → 客户端消息
#### 技能列表推送 (`system_skills_list`)
连接建立后服务端自动推送:
```json
{
"type": "system_skills_list",
"data": {
"skills": [
{
"skill_identifier": "/vulnerability_scanner",
"skill_display_name": "漏洞扫描",
"skill_description": "检测系统漏洞和安全威胁",
"skill_category": "security",
"search_keywords": ["漏洞", "扫描", "安全", "威胁", "检测"]
}
],
"total": 1,
"source": "s3",
"updated_at": "2026-07-09T10:30:00Z"
},
"timestamp": "2026-07-09T10:30:00Z"
}
```
#### 系统思考 (`system_thinking`)
**技能匹配阶段:**
```json
{
"type": "system_thinking",
"data": {
"phase": "skill_selection",
"skill_matches": [
{
"skill_identifier": "/vulnerability_scanner",
"skill_display_name": "漏洞扫描",
"match_score": 0.95,
"skill_category": "security"
}
],
"selected_skill": {
"skill_identifier": "/vulnerability_scanner",
"skill_display_name": "漏洞扫描",
"match_score": 0.95,
"skill_category": "security"
},
"thought": "正在匹配用户查询与可用技能..."
},
"timestamp": "2026-07-09T10:30:01Z"
}
```
**LLM 生成阶段:**
```json
{
"type": "system_thinking",
"data": {
"phase": "llm_generation",
"thought": "正在调用 Bedrock 生成响应..."
},
"timestamp": "2026-07-09T10:30:02Z"
}
```
#### 系统响应 (`system_response`)
```json
{
"type": "system_response",
"data": {
"content": "这是你的漏洞扫描结果...",
"skill_used": {
"skill_identifier": "/vulnerability_scanner",
"skill_display_name": "漏洞扫描",
"match_score": 0.95,
"skill_category": "security"
},
"finish_reason": "end_turn",
"tokens_used": 150,
"latency_ms": 2500
},
"timestamp": "2026-07-09T10:30:03Z"
}
```
#### 心跳响应 (`heartbeat_chat`)
```json
{
"type": "heartbeat_chat",
"data": {
"action": "pong",
"nonce": "abc123",
"timestamp": "2026-07-09T10:30:00Z",
"latency": 50
},
"timestamp": "2026-07-09T10:30:00Z"
}
```
#### 系统通知 (`system_chat`)
错误或状态通知:
```json
{
"type": "system_chat",
"data": {
"event": "skill_creation_disabled",
"message": "#create_skill 功能未启用..."
},
"timestamp": "2026-07-09T10:30:00Z"
}
```
---
## 技能系统
### 技能文件格式
技能以 Markdown 文件存储在 S3 的 `skills/` 前缀下:
```
s3://your-bucket/
└── skills/
├── vulnerability_scanner.md → 技能标识: /vulnerability_scanner
├── threat_intel.md → 技能标识: /threat_intel
└── security_audit.md → 技能标识: /security_audit
```
**文件名规则:**
- 仅允许小写字母、数字和下划线:`^[a-z0-9_]{1,64}$`
- 文件名(不含 `.md` 扩展名)即为技能标识符
- 不允许嵌套目录结构
### 技能 Markdown 模板
```markdown
# 技能显示名称
description: 精确的一句话描述,说明该技能的核心能力和适用场景
category: 分类(general / analysis / security / coding / data / networking / devops)
keywords: 关键词 1, 关键词 2, 关键词 3, 关键词 4, 关键词 5
## 角色定义
定义 LLM 在使用该技能时应扮演的专家角色,包括专业背景、能力范围和行为准则。
## 核心能力
1. 能力一 — 附带简要说明
2. 能力二 — 附带简要说明
3. 能力三 — 附带简要说明
## 使用说明
详细说明技能如何被调用、输入格式要求、预期行为和输出格式。
## 执行步骤
1. 接收用户输入
2. 分析查询意图
3. 调用领域知识
4. 生成结构化响应
## 输出格式规范
明确定义响应的结构、格式要求、必须包含的字段。
## 约束与规则
1. 规则一
2. 规则二
3. 不提供具体攻击方法
## 触发示例
- 基础用例: "检测系统安全漏洞"
- 进阶用例: "评估 Web 应用安全风险"
- 边界情况: "没有漏洞时如何处理"
## 错误处理
当输入不完整或超出技能范围时,应如何优雅地处理和回复。
```
### 技能检索机制
LingFlow 使用基于关键词的混合检索策略:
> 也可通过 [skill_retrieval.puml](docs/images/skill_retrieval.puml) 文件查看源文件。
---
## AI 技能创建(#create_skill)
### 工作原理
用户在聊天中发送 `#create_skill` 命令,系统通过 AI 自动生成技能 Markdown 内容并上传到 S3:
```
用户: #create_skill threat_intel 分析安全威胁情报和攻击趋势
│ │
▼ ▼
技能名称 技能描述
```
### 创建流水线
> 也可通过 [create_skill_pipeline.puml](docs/images/create_skill_pipeline.puml) 文件查看源文件。
### 使用示例
```
# 创建技能
#create_skill threat_intel 分析安全威胁情报和攻击趋势
# 创建成功响应
{
"type": "system_chat",
"data": {
"event": "skill_created",
"message": "技能 threat_intel 创建成功",
"skill_info": {
"skill_identifier": "/threat_intel",
"skill_display_name": "威胁情报分析",
"skill_description": "分析安全威胁情报和攻击趋势",
"skill_category": "security"
}
}
}
```
### 安全防护
| 防护措施 | 说明 |
| ------------ | ------------------------------------------- |
| 名称白名单 | 仅允许小写字母、数字、下划线 |
| 速率限制 | 每用户每分钟最多 5 次技能创建 |
| 提示注入检测 | 输入层 + 输出层双重正则检测 |
| 事务锁 | 空文件占位防止并发创建同一技能 |
| 内容验证 | 生成的 Markdown 必须符合技能模板格式 |
| 生产模式限制 | 仅在 IS_ALLOW_USER_CREATE_SKILL=true 时启用 |
---
## 部署指南
### 本地部署
```bash
go build -o lingflow main.go
./lingflow
```
### Docker 部署
```bash
docker build -t lingflow .
docker run -p 4030:4030 --env-file .env lingflow
```
### Kubernetes 部署
项目提供了完整的 Kubernetes 部署配置文件,位于 `k8s/` 目录:
```
k8s/
├── deployment.yaml # 应用部署配置
├── service.yaml # 服务暴露配置
├── ingress.yaml # 入口网关配置
├── configmap.yaml # 非敏感配置项
└── secret.yaml # 敏感配置项(需手动填写)
```
#### 部署步骤
```bash
# 1. 创建命名空间(可选)
kubectl create namespace lingflow
# 2. 创建 ConfigMap
kubectl apply -f k8s/configmap.yaml
# 3. 创建 Secret(需先填写敏感值)
kubectl apply -f k8s/secret.yaml
# 4. 创建 Service
kubectl apply -f k8s/service.yaml
# 5. 创建 Deployment
kubectl apply -f k8s/deployment.yaml
# 6. 创建 Ingress(可选)
kubectl apply -f k8s/ingress.yaml
```
#### 配置说明
**ConfigMap(非敏感配置)**
| 配置项 | 值 |
| --- | --- |
| `AWS_REGION` | S3 所在区域 |
| `AWS_BEDROCK_REGION` | Bedrock 服务区域 |
| `AWS_BEDROCK_MODEL_ID` | 模型标识符 |
| `SKILLS_S3_BUCKET` | 技能存储桶名称 |
| `WSS_HEARTBEAT_INTERVAL` | 心跳间隔 |
**Secret(敏感配置,需 base64 编码)**
```bash
# 生成 base64 编码值
echo -n "your-access-key" | base64
echo -n "your-secret-key" | base64
echo -n "your-auth-secret" | base64
echo -n "your-api-key" | base64
```
#### 健康检查
部署配置包含 liveness 和 readiness 探针:
```yaml
livenessProbe:
httpGet:
path: /health
port: 4030
initialDelaySeconds: 10
periodSeconds: 30
readinessProbe:
httpGet:
path: /ready
port: 4030
initialDelaySeconds: 5
periodSeconds: 10
```
#### 资源限制
```yaml
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
```
#### 水平扩展
通过修改 Deployment 的 `replicas` 字段进行水平扩展:
```bash
kubectl scale deployment lingflow --replicas=5
```
#### 滚动更新
配置已启用滚动更新策略:
```yaml
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
```
### AWS Lambda + API Gateway 部署
参考 `internal/services/aws/lambda.go` 实现 Serverless 部署。
---
如果您觉得本项目对您有帮助,欢迎请我喝杯咖啡
您的支持是我持续维护和改进的动力