AI Agent 企业级开发技术设计文档
文档版本: v1.0
撰写角色: AI Agent 开发高级经理
适用范围: 企业 AI Agent 系统从零到生产的全生命周期
更新日期: 2026-05-22
目录
- 文档概述与架构总览
- 阶段一:系统入门 — 打好 Agent 开发基础
- 阶段二:核心开发 — 掌握主流开发框架
- 阶段三:企业进阶 — 构建智能体核心能力
- 阶段四:项目落地 — 从开发到上线运维
- 技术选型矩阵
- 安全与合规设计
- 附录
1. 文档概述与架构总览
1.1 设计目标
本文档旨在为团队提供一套标准化、可落地的 AI Agent 系统开发规范,覆盖从基础能力建设到企业级生产部署的完整路径,确保:
- 可扩展性:架构支持从单 Agent 到多 Agent 协作的平滑演进
- 可观测性:全链路追踪、评估与监控覆盖 100%
- 工程质量:遵循生产级代码标准,具备完整的 CI/CD 流水线
- 成本可控:Token 消耗、推理延迟与资源成本纳入 SLA 管理
1.2 整体技术架构图
┌─────────────────────────────────────────────────────────────┐
│ 用户接入层 │
│ Web / API / Slack / 企业微信 / 钉钉 │
└──────────────────────────┬──────────────────────────────────┘
│
┌──────────────────────────▼──────────────────────────────────┐
│ Agent 编排层 (LangGraph) │
│ Planner → Task Decomposer → Tool Router → Synthesizer │
└──────┬──────────────┬──────────────┬───────────────┬────────┘
│ │ │ │
┌──────▼──────┐ ┌─────▼──────┐ ┌───▼────────┐ ┌───▼────────┐
│ LLM 调用层 │ │ 记忆系统 │ │ 工具层 │ │ RAG 系统 │
│ GPT/Claude/ │ │ 短期/长期 │ │ API/代码/ │ │ 检索+重排+ │
│ Qwen/本地化 │ │ 向量/图谱 │ │ 搜索/DB │ │ 生成融合 │
└─────────────┘ └────────────┘ └────────────┘ └────────────┘
│
┌──────────────────────────▼──────────────────────────────────┐
│ 基础设施层 (Docker / Kubernetes) │
│ LangSmith 追踪 | Prometheus 监控 | ELK 日志 │
└─────────────────────────────────────────────────────────────┘
1.3 四阶段里程碑
| 阶段 |
目标 |
核心交付物 |
周期 |
| 阶段一:系统入门 |
建立 Agent 开发基础 |
基础能力 Demo |
2~3 周 |
| 阶段二:核心开发 |
掌握主流框架 |
可用原型系统 |
4~6 周 |
| 阶段三:企业进阶 |
构建核心智能能力 |
企业级 Agent |
4~6 周 |
| 阶段四:项目落地 |
生产上线与运维 |
生产系统 |
2~4 周 |
2. 阶段一:系统入门
目标:夯实 Agent 开发四大基础能力,避免在高阶框架上"空中建楼"
2.1 大模型调用实战
2.1.1 统一调用接口设计
所有 LLM 调用须通过统一网关封装,禁止在业务代码中硬编码 API Key 或直接裸调 SDK。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
# llm_gateway.py — 统一 LLM 调用网关
from abc import ABC, abstractmethod
from dataclasses import dataclass
from typing import Optional, AsyncIterator
import asyncio, tiktoken
@dataclass
class LLMConfig:
provider: str # "openai" | "anthropic" | "qwen" | "local"
model: str
temperature: float = 0.7
max_tokens: int = 2048
timeout: int = 30
retry_times: int = 3
@dataclass
class LLMResponse:
content: str
prompt_tokens: int
completion_tokens: int
latency_ms: float
model: str
class BaseLLMClient(ABC):
def __init__(self, config: LLMConfig):
self.config = config
@abstractmethod
async def chat(self, messages: list[dict]) -> LLMResponse:
pass
@abstractmethod
async def stream_chat(self, messages: list[dict]) -> AsyncIterator[str]:
pass
class OpenAIClient(BaseLLMClient):
"""OpenAI / Azure OpenAI 统一客户端"""
async def chat(self, messages: list[dict]) -> LLMResponse:
import time
from openai import AsyncOpenAI
client = AsyncOpenAI() # Key 从环境变量读取
start = time.time()
for attempt in range(self.config.retry_times):
try:
resp = await client.chat.completions.create(
model=self.config.model,
messages=messages,
temperature=self.config.temperature,
max_tokens=self.config.max_tokens,
)
return LLMResponse(
content=resp.choices[0].message.content,
prompt_tokens=resp.usage.prompt_tokens,
completion_tokens=resp.usage.completion_tokens,
latency_ms=(time.time() - start) * 1000,
model=self.config.model,
)
except Exception as e:
if attempt == self.config.retry_times - 1:
raise
await asyncio.sleep(2 ** attempt) # 指数退避
|
2.1.2 多模型路由策略
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class LLMRouter:
"""根据任务类型、成本预算、延迟 SLA 自动路由到最合适的模型"""
ROUTING_RULES = {
"simple_qa": {"provider": "openai", "model": "gpt-4o-mini"},
"complex_reason": {"provider": "anthropic", "model": "claude-sonnet-4-20250514"},
"code_gen": {"provider": "openai", "model": "gpt-4o"},
"chinese_nlp": {"provider": "qwen", "model": "qwen-max"},
"sensitive_data": {"provider": "local", "model": "qwen2.5-72b"}, # 数据不出域
}
def route(self, task_type: str, budget_usd: float) -> LLMConfig:
rule = self.ROUTING_RULES.get(task_type, self.ROUTING_RULES["simple_qa"])
return LLMConfig(**rule)
|
2.1.3 Token 成本管控
| 模型 |
输入成本 |
输出成本 |
适用场景 |
| GPT-4o-mini |
$0.15/1M |
$0.60/1M |
简单分类、摘要 |
| GPT-4o |
$2.5/1M |
$10/1M |
复杂推理、代码 |
| Claude Sonnet |
$3/1M |
$15/1M |
长文档、分析 |
| Qwen-Max |
¥0.04/1K |
¥0.12/1K |
中文场景 |
| 本地部署 |
GPU 摊销 |
GPU 摊销 |
敏感数据 |
硬性规则:单次 Agent 调用链总 Token 预算上限设为 100K,超出触发熔断。
2.2 开源模型部署
2.2.1 部署方案对比
| 方案 |
适用规模 |
推理框架 |
显存需求 |
推荐场景 |
| vLLM |
生产级 |
PagedAttention |
4×A100 |
高并发 API 服务 |
| Ollama |
开发调试 |
llama.cpp |
单卡 24GB |
本地开发 |
| TGI |
企业级 |
Rust+Flash Attn |
2×A100 |
HuggingFace 生态 |
| SGLang |
高性能 |
RadixAttention |
4×H100 |
复杂推理链 |
2.2.2 vLLM 生产部署配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
# vllm-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: qwen2-72b-vllm
spec:
replicas: 2
template:
spec:
containers:
- name: vllm
image: vllm/vllm-openai:latest
args:
- "--model=/models/Qwen2.5-72B-Instruct"
- "--tensor-parallel-size=4"
- "--max-model-len=32768"
- "--gpu-memory-utilization=0.92"
- "--enable-prefix-caching" # KV Cache 复用,降低重复 Prompt 成本
- "--max-num-seqs=256"
- "--served-model-name=qwen2.5-72b"
resources:
limits:
nvidia.com/gpu: "4"
memory: "200Gi"
volumeMounts:
- name: model-storage
mountPath: /models
|
2.2.3 量化策略选择
模型精度选择决策树:
延迟要求 < 500ms?
├── 是 → 显存充足(>80GB)?
│ ├── 是 → FP16 全精度(最高质量)
│ └── 否 → AWQ INT4(质量损失 < 2%,显存减半)
└── 否 → 批量离线任务?
├── 是 → GPTQ INT8(速度与质量平衡)
└── 否 → GGUF Q4_K_M(CPU 友好,Ollama 适用)
2.3 Agent 基础原理
2.3.1 ReAct 模式标准实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
class ReActAgent:
"""
ReAct = Reasoning + Acting
核心循环:Thought → Action → Observation → Thought ...
"""
MAX_ITERATIONS = 10 # 防止无限循环
def __init__(self, llm: BaseLLMClient, tools: list):
self.llm = llm
self.tools = {t.name: t for t in tools}
async def run(self, user_query: str) -> str:
scratchpad = []
for i in range(self.MAX_ITERATIONS):
# 1. 思考:让 LLM 决定下一步
thought_prompt = self._build_prompt(user_query, scratchpad)
response = await self.llm.chat(thought_prompt)
# 2. 解析 Action
action = self._parse_action(response.content)
# 3. 终止条件
if action.type == "FINISH":
return action.answer
# 4. 执行工具
tool = self.tools.get(action.tool_name)
if not tool:
observation = f"错误:工具 {action.tool_name} 不存在"
else:
observation = await tool.execute(action.tool_input)
# 5. 记录到 scratchpad
scratchpad.append({
"thought": response.content,
"action": action,
"observation": observation,
})
return "已达最大迭代次数,任务未完成"
|
2.3.2 Agent 决策模式对比
| 模式 |
描述 |
优点 |
缺点 |
适用场景 |
| ReAct |
交替推理与行动 |
可解释性强 |
延迟高 |
通用任务 |
| Plan-and-Execute |
先规划后执行 |
并行效率高 |
规划失败影响大 |
复杂多步任务 |
| Reflexion |
带自我反思 |
错误恢复能力强 |
Token 消耗大 |
高准确率要求 |
| LATS |
树搜索+反思 |
探索性强 |
极高成本 |
难题攻坚 |
2.4 Prompt 工程规范
2.4.1 企业级 Prompt 模板标准
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
SYSTEM_PROMPT_TEMPLATE = """
# 角色定义
你是 {role_name},{role_description}
# 能力边界
你具备以下能力:
{capabilities}
你不应该做以下事情:
{constraints}
# 输出规范
- 语言:{output_language}
- 格式:{output_format}
- 长度限制:{max_length}
# 可用工具
{tools_description}
# 思考框架
在回答前,请按以下步骤思考:
1. 理解用户意图
2. 确认所需信息是否充分
3. 选择最优解决路径
4. 验证输出是否符合约束
# 当前上下文
{context}
"""
class PromptBuilder:
"""结构化 Prompt 构建器,确保一致性"""
def build_cot_prompt(self, task: str) -> str:
"""思维链(Chain of Thought)Prompt"""
return f"""请解决以下任务,并展示完整的思考过程:
任务:{task}
请按照以下格式回答:
<thinking>
[在这里写出你的分步思考过程]
</thinking>
<answer>
[最终答案]
</answer>"""
def build_few_shot_prompt(self, task: str, examples: list[dict]) -> str:
"""少样本(Few-Shot)Prompt"""
examples_text = "\n\n".join([
f"示例 {i+1}:\n输入:{e['input']}\n输出:{e['output']}"
for i, e in enumerate(examples)
])
return f"{examples_text}\n\n现在请处理:\n输入:{task}\n输出:"
|
2.4.2 Prompt 版本管理规范
prompt_registry/
├── v1/
│ ├── system_qa.txt # 问答系统 Prompt
│ ├── code_review.txt # 代码审查 Prompt
│ └── data_analysis.txt # 数据分析 Prompt
├── v2/ # 迭代优化版本
└── experiments/ # A/B 测试版本
├── exp_001_cot/
└── exp_002_few_shot/
规范:所有生产 Prompt 变更须经过 A/B 测试,在测试集上准确率提升 ≥ 2% 方可发布。
3. 阶段二:核心开发
目标:熟练掌握 LangChain 1.0、LangGraph、Agentic RAG 及工具集成,构建可运行原型
3.1 LangChain 1.0 核心架构
3.1.1 LCEL(LangChain Expression Language)管道设计
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser, JsonOutputParser
from langchain_openai import ChatOpenAI
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
# 基础 Chain
llm = ChatOpenAI(model="gpt-4o", temperature=0)
# 1. 简单问答链
qa_chain = (
ChatPromptTemplate.from_template("请回答:{question}")
| llm
| StrOutputParser()
)
# 2. 并行处理链(同时执行多个子任务)
parallel_chain = RunnableParallel(
summary=ChatPromptTemplate.from_template("请总结:{text}") | llm | StrOutputParser(),
keywords=ChatPromptTemplate.from_template("提取关键词(JSON格式):{text}") | llm | JsonOutputParser(),
sentiment=ChatPromptTemplate.from_template("分析情感(正面/负面/中立):{text}") | llm | StrOutputParser(),
)
# 3. 带路由的条件链
from langchain_core.runnables import RunnableBranch
routing_chain = RunnableBranch(
(lambda x: "代码" in x["question"], code_chain),
(lambda x: "数据" in x["question"], analysis_chain),
default_chain, # 默认链
)
|
3.1.2 LangChain 组件规范
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 自定义工具规范
from langchain_core.tools import tool
from pydantic import BaseModel, Field
class DatabaseQueryInput(BaseModel):
"""数据库查询工具的输入 Schema,Pydantic 严格校验"""
sql: str = Field(description="要执行的 SQL 查询语句,只允许 SELECT")
database: str = Field(description="目标数据库名称", default="production")
limit: int = Field(description="返回行数上限", default=100, le=1000)
@tool("database_query", args_schema=DatabaseQueryInput)
async def database_query(sql: str, database: str, limit: int) -> str:
"""安全地执行数据库只读查询,返回结果的 JSON 字符串"""
# 安全检查:禁止非 SELECT 语句
if not sql.strip().upper().startswith("SELECT"):
return "错误:只允许 SELECT 查询"
# 注入防护:使用参数化查询
# ... 实际数据库连接逻辑
return json.dumps(results, ensure_ascii=False)
|
3.2 LangGraph 实战设计
3.2.1 状态图设计原则
LangGraph 的核心是有状态的图计算,适合需要循环、分支、人机协作的复杂 Agent。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated
import operator
# 1. 定义全局状态 Schema(强类型)
class AgentState(TypedDict):
messages: Annotated[list, operator.add] # 消息历史(自动追加)
user_query: str
plan: list[str] # 任务计划
current_step: int
tool_results: dict
final_answer: str
error_count: int # 错误计数,用于熔断
# 2. 定义节点函数(每个节点是纯函数)
async def planner_node(state: AgentState) -> dict:
"""规划节点:分解用户任务为子步骤"""
plan = await llm.plan(state["user_query"])
return {"plan": plan, "current_step": 0}
async def executor_node(state: AgentState) -> dict:
"""执行节点:执行当前步骤"""
current_task = state["plan"][state["current_step"]]
result = await execute_task(current_task)
return {
"tool_results": {**state["tool_results"], current_task: result},
"current_step": state["current_step"] + 1,
}
async def validator_node(state: AgentState) -> dict:
"""验证节点:检查执行结果质量"""
is_valid = await validate_result(state["tool_results"])
if not is_valid:
return {"error_count": state["error_count"] + 1}
return {}
async def synthesizer_node(state: AgentState) -> dict:
"""综合节点:整合所有结果,生成最终答案"""
answer = await synthesize(state["tool_results"], state["user_query"])
return {"final_answer": answer}
# 3. 路由函数(决定下一个节点)
def should_continue(state: AgentState) -> str:
if state["error_count"] >= 3:
return "error_handler" # 熔断
if state["current_step"] >= len(state["plan"]):
return "synthesizer" # 所有步骤完成
return "executor" # 继续执行
# 4. 构建图
workflow = StateGraph(AgentState)
workflow.add_node("planner", planner_node)
workflow.add_node("executor", executor_node)
workflow.add_node("validator", validator_node)
workflow.add_node("synthesizer", synthesizer_node)
workflow.add_node("error_handler", error_handler_node)
workflow.set_entry_point("planner")
workflow.add_edge("planner", "executor")
workflow.add_edge("executor", "validator")
workflow.add_conditional_edges("validator", should_continue)
workflow.add_edge("synthesizer", END)
agent = workflow.compile(checkpointer=MemorySaver()) # 开启持久化
|
3.2.2 人机协作(Human-in-the-Loop)设计
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 在敏感操作前暂停,等待人工审批
from langgraph.graph import interrupt
async def approval_gate_node(state: AgentState) -> dict:
"""高风险操作前的人工审批节点"""
if state["risk_level"] == "HIGH":
# 暂停图执行,返回给前端等待审批
human_decision = interrupt({
"message": "检测到高风险操作,请审批",
"operation": state["pending_operation"],
"risk_reason": state["risk_reason"],
})
if human_decision["approved"]:
return {"approved": True}
else:
return {"approved": False, "cancel_reason": human_decision["reason"]}
return {"approved": True} # 低风险直接通过
|
3.3 Agentic RAG 架构设计
3.3.1 RAG 模式进化路径
基础 RAG → 高级 RAG → Agentic RAG
─────────────────────────────────────────────────────────
朴素检索+生成 → 重排+过滤+压缩 → Agent 控制检索策略
固定查询 → 查询改写 → 自适应多轮检索
单一数据源 → 混合检索 → 多数据源智能路由
3.3.2 Agentic RAG 完整实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
class AgenticRAGSystem:
"""
Agentic RAG:Agent 主动控制检索过程
核心能力:
- 查询分解与改写
- 自适应检索策略选择
- 检索结果质量评估
- 迭代式信息补充
"""
def __init__(self, vector_store, bm25_index, llm):
self.vector_store = vector_store # 语义检索
self.bm25_index = bm25_index # 关键词检索
self.llm = llm
self.reranker = CrossEncoderReranker()
async def retrieve_with_reflection(
self,
query: str,
max_iterations: int = 3
) -> list[Document]:
"""带自我反思的迭代检索"""
all_docs = []
current_query = query
for iteration in range(max_iterations):
# 1. 查询改写(第一轮不改写)
if iteration > 0:
current_query = await self._rewrite_query(
original=query,
retrieved_docs=all_docs,
missing_info=missing_info,
)
# 2. 混合检索
semantic_docs = await self.vector_store.similarity_search(
current_query, k=10
)
keyword_docs = await self.bm25_index.search(current_query, k=10)
# 3. 融合与重排(RRF + Cross-Encoder)
merged = self._reciprocal_rank_fusion(semantic_docs, keyword_docs)
reranked = await self.reranker.rerank(current_query, merged, top_k=5)
all_docs.extend(reranked)
# 4. 评估是否信息充分
sufficiency = await self._assess_sufficiency(query, all_docs)
if sufficiency.is_sufficient:
break
missing_info = sufficiency.missing_aspects
# 5. 去重与压缩
return await self._deduplicate_and_compress(all_docs, query)
async def _assess_sufficiency(self, query: str, docs: list) -> SufficiencyResult:
"""评估检索到的文档是否足以回答问题"""
prompt = f"""
用户问题:{query}
已检索文档摘要:{self._summarize_docs(docs)}
请评估:
1. 当前文档能否完整回答问题?(是/否)
2. 如果不能,缺少哪些方面的信息?
以 JSON 格式返回:{{"is_sufficient": bool, "missing_aspects": [str]}}
"""
result = await self.llm.chat([{"role": "user", "content": prompt}])
return SufficiencyResult(**json.loads(result.content))
|
3.4 工具调用与集成规范
3.4.1 企业工具库标准设计
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
# tools/base.py — 工具基类(所有工具必须继承)
from abc import ABC, abstractmethod
from dataclasses import dataclass
import logging, asyncio
@dataclass
class ToolResult:
success: bool
data: any
error: str = ""
execution_time_ms: float = 0.0
class EnterpriseBaseTool(ABC):
"""企业工具基类,内置安全校验、限流、日志"""
# 子类必须声明
name: str
description: str
rate_limit_per_minute: int = 60
def __init_subclass__(cls):
assert hasattr(cls, 'name'), f"{cls.__name__} 必须声明 name"
assert hasattr(cls, 'description'), f"{cls.__name__} 必须声明 description"
@abstractmethod
async def _execute(self, **kwargs) -> any:
"""子类实现具体逻辑"""
pass
async def run(self, **kwargs) -> ToolResult:
"""统一执行入口,包含安全防护"""
import time
# 限流检查
if not await self._check_rate_limit():
return ToolResult(success=False, error="调用频率超限,请稍后重试")
# 参数校验
validated = self._validate_inputs(kwargs)
if not validated.ok:
return ToolResult(success=False, error=validated.error)
start = time.time()
try:
result = await asyncio.wait_for(
self._execute(**kwargs),
timeout=30.0
)
return ToolResult(
success=True,
data=result,
execution_time_ms=(time.time() - start) * 1000,
)
except asyncio.TimeoutError:
return ToolResult(success=False, error="工具执行超时(30s)")
except Exception as e:
logging.error(f"Tool {self.name} error: {e}", exc_info=True)
return ToolResult(success=False, error=str(e))
# 工具注册表
TOOL_REGISTRY: dict[str, EnterpriseBaseTool] = {}
def register_tool(tool_class):
"""装饰器:自动注册工具"""
instance = tool_class()
TOOL_REGISTRY[instance.name] = instance
return tool_class
|
3.4.2 标准工具集清单
| 工具类别 |
工具名 |
用途 |
安全级别 |
| 搜索 |
web_search |
实时网络搜索 |
LOW |
| 数据库 |
sql_query |
只读 SQL 查询 |
MEDIUM |
| 代码 |
code_executor |
沙箱 Python 执行 |
HIGH |
| 文件 |
file_reader |
读取授权文件 |
MEDIUM |
| API |
http_request |
调用外部 API |
HIGH |
| 计算 |
calculator |
精确数学计算 |
LOW |
| 邮件 |
email_sender |
发送邮件通知 |
HIGH |
| 图表 |
chart_generator |
生成数据可视化 |
LOW |
4. 阶段三:企业进阶
目标:构建具备企业级能力的 Agent 系统:长期记忆、上下文工程、高级 RAG、多智能体协作
4.1 智能体记忆系统设计
4.1.1 记忆分层架构
┌─────────────────────────────────────────────────────┐
│ Agent 记忆体系 │
├─────────────┬───────────────┬───────────────────────┤
│ 工作记忆 │ 情景记忆 │ 语义记忆 │
│ (In-Context)│ (Episodic) │ (Semantic) │
│ │ │ │
│ 当前对话 │ 历史对话摘要 │ 用户偏好/领域知识 │
│ 执行状态 │ 任务执行记录 │ 实体关系图谱 │
│ 临时计算 │ 错误与反思 │ 持久化业务规则 │
│ │ │ │
│ Token 窗口 │ 向量数据库 │ 图数据库/向量DB │
│ 生命周期: │ 生命周期: │ 生命周期: │
│ 单次会话 │ 数周~数月 │ 永久 │
└─────────────┴───────────────┴───────────────────────┘
4.1.2 记忆管理核心代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
class AgentMemorySystem:
"""三层记忆系统统一管理"""
def __init__(self, vector_db, graph_db, redis_client):
self.vector_db = vector_db # Pinecone / Weaviate / Qdrant
self.graph_db = graph_db # Neo4j
self.redis = redis_client # 短期缓存
self.summarizer = ConversationSummarizer()
# ===== 工作记忆(短期)=====
def get_working_memory(self, session_id: str, max_tokens: int = 4000) -> list:
"""获取当前会话上下文,自动截断至 Token 限制"""
messages = self.redis.lrange(f"session:{session_id}", 0, -1)
# 从最新消息开始,向前取直到 Token 用尽
return self._truncate_to_token_limit(messages, max_tokens)
async def add_to_working_memory(self, session_id: str, message: dict):
"""添加消息,超过阈值自动触发摘要压缩"""
self.redis.rpush(f"session:{session_id}", json.dumps(message))
self.redis.expire(f"session:{session_id}", 3600) # 1小时 TTL
# 消息超过 20 条时压缩
if self.redis.llen(f"session:{session_id}") > 20:
await self._compress_to_episodic(session_id)
# ===== 情景记忆(中期)=====
async def _compress_to_episodic(self, session_id: str):
"""将工作记忆压缩为摘要存入向量DB"""
messages = self.redis.lrange(f"session:{session_id}", 0, -1)
summary = await self.summarizer.summarize(messages)
# 存入向量数据库
await self.vector_db.upsert(
id=f"episode:{session_id}:{int(time.time())}",
values=await self._embed(summary),
metadata={
"session_id": session_id,
"timestamp": time.time(),
"summary": summary,
"type": "episode",
}
)
# 清空工作记忆的旧消息
self.redis.ltrim(f"session:{session_id}", -5, -1) # 只保留最近 5 条
async def recall_episodes(self, query: str, user_id: str, top_k: int = 3) -> list:
"""语义检索相关历史情节"""
query_embedding = await self._embed(query)
results = await self.vector_db.query(
vector=query_embedding,
top_k=top_k,
filter={"user_id": user_id, "type": "episode"},
)
return [r.metadata["summary"] for r in results]
# ===== 语义记忆(长期)=====
async def update_user_profile(self, user_id: str, interaction: dict):
"""从交互中提取并更新用户画像"""
extracted = await self._extract_preferences(interaction)
# 写入图数据库
await self.graph_db.run("""
MERGE (u:User {id: $user_id})
SET u.preferences = $preferences,
u.updated_at = timestamp()
WITH u
UNWIND $entities as entity
MERGE (e:Entity {name: entity.name, type: entity.type})
MERGE (u)-[:KNOWS]->(e)
""", user_id=user_id,
preferences=extracted.preferences,
entities=extracted.entities)
|
4.2 上下文工程(Context Engineering)
4.2.1 上下文窗口管理策略
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
class ContextWindowManager:
"""
精确管理 LLM 上下文窗口,最大化有效信息密度
遵循 Harness 方法论:结构化、动态、可追溯
"""
CONTEXT_BUDGET = {
"system_prompt": 0.15, # 系统提示 15%
"memory_retrieval": 0.20, # 记忆检索 20%
"rag_documents": 0.35, # RAG 文档 35%
"conversation": 0.20, # 对话历史 20%
"current_query": 0.05, # 当前问题 5%
"output_reserve": 0.05, # 输出预留 5%
}
def build_context(
self,
system_prompt: str,
user_query: str,
retrieved_docs: list,
conversation_history: list,
memory_summaries: list,
total_token_limit: int = 128000,
) -> list[dict]:
budgets = {k: int(v * total_token_limit)
for k, v in self.CONTEXT_BUDGET.items()}
# 1. 系统提示(最高优先级)
system = self._truncate(system_prompt, budgets["system_prompt"])
# 2. 记忆摘要(注入到 system 结尾)
memory_text = self._format_memories(memory_summaries, budgets["memory_retrieval"])
# 3. RAG 文档(重排后按相关性截断)
docs_text = self._format_docs(retrieved_docs, budgets["rag_documents"])
# 4. 对话历史(从最近往前截断)
history = self._truncate_history(conversation_history, budgets["conversation"])
# 5. 组装 messages
messages = [
{"role": "system", "content": f"{system}\n\n## 用户记忆\n{memory_text}"},
]
if docs_text:
messages.append({
"role": "user",
"content": f"## 参考文档\n{docs_text}"
})
messages.append({"role": "assistant", "content": "已读取参考文档。"})
messages.extend(history)
messages.append({"role": "user", "content": user_query})
return messages
|
4.2.2 上下文压缩技术
| 技术 |
压缩比 |
质量损失 |
适用场景 |
| 滑动窗口 |
50% |
低(丢弃旧信息) |
实时对话 |
| 摘要压缩 |
80% |
中 |
长对话历史 |
| 选择性保留 |
60% |
低 |
任务相关对话 |
| 层次压缩 |
90% |
中 |
超长文档处理 |
| Prompt 压缩(LLMLingua) |
70% |
低 |
检索文档压缩 |
4.3 RAG 进阶与优化
4.3.1 混合检索架构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
class HybridRetriever:
"""
混合检索 = 语义检索 + 关键词检索 + 结构化检索
使用 RRF (Reciprocal Rank Fusion) 融合
"""
async def retrieve(self, query: str, k: int = 20) -> list[Document]:
# 并行执行三路检索
semantic, keyword, structured = await asyncio.gather(
self._semantic_search(query, k), # 向量相似度
self._bm25_search(query, k), # BM25 关键词
self._structured_filter(query, k), # 元数据过滤
)
# RRF 融合(k=60 是经验最优值)
scores = {}
for rank, doc in enumerate(semantic):
scores[doc.id] = scores.get(doc.id, 0) + 1/(60 + rank)
for rank, doc in enumerate(keyword):
scores[doc.id] = scores.get(doc.id, 0) + 1/(60 + rank)
for rank, doc in enumerate(structured):
scores[doc.id] = scores.get(doc.id, 0) + 1/(60 + rank)
# 按融合分数排序,取 top-k
all_docs = {d.id: d for d in semantic + keyword + structured}
sorted_ids = sorted(scores, key=scores.get, reverse=True)[:k]
return [all_docs[id] for id in sorted_ids]
|
4.3.2 RAG 优化全景图
索引优化阶段:
├── 分块策略:语义分块(而非固定长度)
├── 多粒度索引:段落级 + 文档级双索引
├── 假设性问题增强(HyDE)
└── 元数据丰富化:自动打标签
检索优化阶段:
├── 查询改写(Query Rewriting)
├── 查询扩展(HyDE / Multi-Query)
├── 混合检索(Semantic + BM25)
└── 检索质量评估(RAGAS 指标)
后处理阶段:
├── Cross-Encoder 重排序
├── 冗余去除(MMR 最大边际相关)
├── LLM 过滤(相关性判断)
└── 上下文压缩(LLMLingua-2)
4.3.3 RAG 评估指标体系(RAGAS)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
from ragas import evaluate
from ragas.metrics import (
faithfulness, # 忠实度:答案是否基于文档
answer_relevancy, # 相关性:答案是否回答了问题
context_precision, # 精确率:检索文档是否相关
context_recall, # 召回率:关键信息是否被检索到
)
# 自动化评估流水线
async def evaluate_rag_pipeline(test_dataset):
results = evaluate(
dataset=test_dataset,
metrics=[faithfulness, answer_relevancy, context_precision, context_recall],
)
# SLA 门限:所有指标 >= 0.8 才允许发布
thresholds = {
"faithfulness": 0.85,
"answer_relevancy": 0.80,
"context_precision": 0.75,
"context_recall": 0.80,
}
failures = [m for m, threshold in thresholds.items()
if results[m] < threshold]
if failures:
raise ValueError(f"RAG 质量未达标: {failures}")
return results
|
4.4 多智能体协作框架
4.4.1 多 Agent 协作模式
┌─────────────────────────────────────────────────────┐
│ Orchestrator Agent │
│ (任务分解 & 结果整合) │
└────┬──────────┬──────────┬──────────┬───────────────┘
│ │ │ │
▼ ▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│Research │ │ Coding │ │Analysis │ │ Writer │
│ Agent │ │ Agent │ │ Agent │ │ Agent │
│ │ │ │ │ │ │ │
│网络搜索 │ │代码生成 │ │数据分析 │ │报告撰写 │
│文档检索 │ │代码执行 │ │图表生成 │ │格式输出 │
└─────────┘ └─────────┘ └─────────┘ └─────────┘
4.4.2 多 Agent 通信协议
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
from dataclasses import dataclass
from enum import Enum
import uuid
class MessageType(Enum):
TASK_ASSIGN = "task_assign" # 分配任务
TASK_RESULT = "task_result" # 返回结果
REQUEST_HELP = "request_help" # 请求协助
STATUS_UPDATE = "status_update" # 进度更新
ERROR = "error" # 错误报告
@dataclass
class AgentMessage:
"""Agent 间通信的标准消息格式"""
id: str = field(default_factory=lambda: str(uuid.uuid4()))
from_agent: str = ""
to_agent: str = ""
type: MessageType = MessageType.TASK_ASSIGN
content: dict = field(default_factory=dict)
priority: int = 5 # 1-10,10最高
timeout_seconds: int = 120
timestamp: float = field(default_factory=time.time)
parent_task_id: str = "" # 追溯任务链
class MultiAgentOrchestrator:
"""多 Agent 编排器"""
def __init__(self, agents: dict[str, BaseAgent]):
self.agents = agents
self.message_queue = asyncio.PriorityQueue()
self.task_tracker = {}
async def execute_complex_task(self, task: str) -> str:
"""编排多个 Agent 协作完成复杂任务"""
# 1. 任务分解
subtasks = await self.agents["planner"].decompose(task)
# 2. 构建依赖图(DAG)
dag = self._build_dependency_dag(subtasks)
# 3. 并行执行无依赖的任务
results = {}
for batch in dag.topological_batches():
batch_tasks = [
self._dispatch_to_agent(subtask, results)
for subtask in batch
]
batch_results = await asyncio.gather(*batch_tasks)
results.update(dict(zip(batch, batch_results)))
# 4. 综合所有结果
return await self.agents["synthesizer"].synthesize(task, results)
async def _dispatch_to_agent(
self, subtask: SubTask, context: dict
) -> str:
"""将子任务路由到最合适的 Agent"""
# 基于任务类型和 Agent 能力匹配
best_agent = self._match_agent(subtask.required_skills)
message = AgentMessage(
from_agent="orchestrator",
to_agent=best_agent.name,
type=MessageType.TASK_ASSIGN,
content={"task": subtask.description, "context": context},
priority=subtask.priority,
)
return await best_agent.handle_message(message)
|
5. 阶段四:项目落地
目标:将 Agent 系统安全、稳定地部署到生产环境,建立完整的监控与运维体系
5.1 容器化部署(Docker / Kubernetes)
5.1.1 多阶段 Docker 构建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
# Dockerfile — 生产级多阶段构建
FROM python:3.12-slim AS builder
WORKDIR /app
# 安全:非 root 用户
RUN groupadd -r agent && useradd -r -g agent agent
# 依赖安装(利用 Docker 缓存层)
COPY requirements.txt .
RUN pip install --no-cache-dir --user -r requirements.txt
FROM python:3.12-slim AS runtime
WORKDIR /app
# 仅复制运行时依赖
COPY --from=builder /root/.local /root/.local
COPY --from=builder /app /app
COPY src/ ./src/
# 安全配置
RUN chown -R agent:agent /app
USER agent
ENV PATH=/root/.local/bin:$PATH
# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s \
CMD curl -f http://localhost:8000/health || exit 1
EXPOSE 8000
CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]
|
5.1.2 Kubernetes 生产部署配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
# k8s/agent-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ai-agent-service
namespace: production
labels:
app: ai-agent
version: v1.2.0
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0 # 零停机更新
selector:
matchLabels:
app: ai-agent
template:
spec:
containers:
- name: agent
image: registry.company.com/ai-agent:v1.2.0
ports:
- containerPort: 8000
env:
- name: OPENAI_API_KEY
valueFrom:
secretKeyRef: # 绝不在代码或 ConfigMap 中存储密钥
name: llm-secrets
key: openai-api-key
resources:
requests:
memory: "2Gi"
cpu: "1000m"
limits:
memory: "4Gi"
cpu: "2000m"
readinessProbe:
httpGet:
path: /health/ready
port: 8000
initialDelaySeconds: 30
periodSeconds: 10
livenessProbe:
httpGet:
path: /health/live
port: 8000
initialDelaySeconds: 60
periodSeconds: 30
affinity:
podAntiAffinity:
requiredDuringScheduling:
- labelSelector:
matchLabels:
app: ai-agent
topologyKey: kubernetes.io/hostname # 跨节点分散
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: ai-agent-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: ai-agent-service
minReplicas: 3
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Pods
pods:
metric:
name: http_requests_per_second # 基于业务指标扩缩容
target:
type: AverageValue
averageValue: "100"
|
5.2 追踪评估(LangSmith)
5.2.1 全链路追踪配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
# tracing/setup.py
from langsmith import Client, traceable
import os
# 全局追踪配置
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_PROJECT"] = "production-agent-v1"
os.environ["LANGCHAIN_ENDPOINT"] = "https://api.smith.langchain.com"
langsmith_client = Client()
# 自定义追踪装饰器
def agent_trace(name: str, tags: list[str] = None):
"""业务层追踪装饰器"""
def decorator(func):
@traceable(
name=name,
tags=tags or [],
metadata={"env": os.getenv("APP_ENV", "production")},
)
async def wrapper(*args, **kwargs):
return await func(*args, **kwargs)
return wrapper
return decorator
# 使用示例
@agent_trace(name="customer_service_agent", tags=["customer_service", "rag"])
async def handle_customer_query(query: str, user_id: str) -> str:
# Agent 逻辑
...
|
5.2.2 自动化评估流水线
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
# evaluation/pipeline.py
class AutoEvaluationPipeline:
"""生产环境自动化质量评估"""
def __init__(self):
self.langsmith = Client()
self.evaluators = [
self._evaluate_correctness,
self._evaluate_faithfulness,
self._evaluate_toxicity,
self._evaluate_latency,
]
async def run_daily_evaluation(self):
"""每日自动从生产日志中抽样评估"""
# 1. 从 LangSmith 获取昨日生产数据(随机抽样 5%)
runs = self.langsmith.list_runs(
project_name="production-agent-v1",
start_time=yesterday(),
filter='and(gt(total_tokens, 0), eq(error, null))',
limit=500,
)
# 2. 并行评估
results = await asyncio.gather(*[
self._evaluate_run(run) for run in runs
])
# 3. 聚合指标
metrics = self._aggregate_metrics(results)
# 4. 质量告警
if metrics["correctness"] < 0.85:
await self._send_alert(
severity="HIGH",
message=f"正确率下降至 {metrics['correctness']:.2%},低于阈值 85%",
metrics=metrics,
)
# 5. 生成日报
return self._generate_daily_report(metrics)
async def _evaluate_correctness(self, run) -> float:
"""使用 LLM 评估答案正确性(LLM-as-Judge)"""
prompt = f"""
问题:{run.inputs['query']}
Agent 答案:{run.outputs['answer']}
参考答案:{run.reference_output}
请评分(0-1),并给出理由。只返回 JSON:
{{"score": float, "reason": str}}
"""
result = await evaluator_llm.chat([{"role": "user", "content": prompt}])
return json.loads(result.content)["score"]
|
5.3 性能优化与监控
5.3.1 Prometheus 监控指标设计
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
# monitoring/metrics.py
from prometheus_client import Counter, Histogram, Gauge, start_http_server
# 业务指标
AGENT_REQUESTS_TOTAL = Counter(
'agent_requests_total',
'Agent 总请求数',
['agent_type', 'status', 'model']
)
AGENT_LATENCY_SECONDS = Histogram(
'agent_latency_seconds',
'Agent 端到端延迟',
['agent_type'],
buckets=[0.5, 1, 2, 5, 10, 30, 60] # 定义 SLA 分位桶
)
LLM_TOKENS_TOTAL = Counter(
'llm_tokens_total',
'LLM Token 消耗',
['model', 'type'] # type: prompt/completion
)
LLM_COST_USD = Counter(
'llm_cost_usd_total',
'LLM 美元成本',
['model']
)
ACTIVE_SESSIONS = Gauge(
'agent_active_sessions',
'当前活跃会话数'
)
MEMORY_RETRIEVAL_LATENCY = Histogram(
'memory_retrieval_latency_seconds',
'记忆检索延迟',
['memory_type'] # working/episodic/semantic
)
# 中间件注入
class MetricsMiddleware:
async def __call__(self, request, call_next):
start = time.time()
try:
response = await call_next(request)
AGENT_REQUESTS_TOTAL.labels(
agent_type=request.headers.get("X-Agent-Type", "default"),
status="success",
model=request.headers.get("X-Model", "unknown")
).inc()
return response
except Exception as e:
AGENT_REQUESTS_TOTAL.labels(status="error").inc()
raise
finally:
AGENT_LATENCY_SECONDS.labels(
agent_type=request.headers.get("X-Agent-Type", "default")
).observe(time.time() - start)
|
5.3.2 SLA 定义与告警规则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
# prometheus/alert_rules.yaml
groups:
- name: ai_agent_sla
rules:
# P99 延迟告警
- alert: AgentHighLatency
expr: histogram_quantile(0.99, agent_latency_seconds) > 10
for: 5m
labels:
severity: warning
annotations:
summary: "Agent P99 延迟超过 10 秒"
# 错误率告警
- alert: AgentHighErrorRate
expr: rate(agent_requests_total{status="error"}[5m]) / rate(agent_requests_total[5m]) > 0.05
for: 2m
labels:
severity: critical
annotations:
summary: "Agent 错误率超过 5%"
# Token 成本告警(每小时超 $50)
- alert: HighLLMCost
expr: increase(llm_cost_usd_total[1h]) > 50
labels:
severity: warning
annotations:
summary: "过去 1 小时 LLM 成本超过 $50"
|
5.3.3 性能优化清单
Layer 1 — LLM 层优化:
✅ Prompt 缓存(相同前缀复用 KV Cache)
✅ 流式输出(减少 TTFT 感知)
✅ 批量推理(合并同类请求)
✅ 模型降级(简单任务用小模型)
✅ 投机解码(Speculative Decoding)
Layer 2 — 检索层优化:
✅ 向量索引预热(HNSW 参数调优)
✅ 检索结果缓存(Redis TTL 策略)
✅ 异步并行检索
✅ 索引分片(按领域/时间分区)
Layer 3 — 应用层优化:
✅ 连接池复用(DB、Redis、HTTP)
✅ 异步非阻塞架构(asyncio)
✅ 计算结果缓存(相同 query+context 命中率分析)
✅ CDN 静态资源加速
Layer 4 — 基础设施优化:
✅ HPA 基于 QPS 自动扩容
✅ 多区域部署(就近接入)
✅ GPU 时间片共享(MIG 分区)
5.4 企业级项目实战规范
5.4.1 项目上线检查清单(Launch Checklist)
□ 功能完整性
□ 核心功能 100% 覆盖,边缘 case 处理完毕
□ 人工测试集正确率 ≥ 90%
□ RAGAS 评估四项指标均 ≥ 0.80
□ 性能指标
□ P50 延迟 < 2s,P99 < 10s
□ 并发 100 QPS 下错误率 < 1%
□ 单次调用 Token 成本 < $0.05
□ 安全合规
□ API Key 全部迁移至 Secret Manager
□ 敏感数据脱敏处理已验证
□ 注入攻击防护(Prompt Injection)已测试
□ PII 过滤器已启用并测试
□ 可观测性
□ LangSmith 追踪覆盖率 100%
□ Prometheus 指标全部接入 Grafana
□ 告警规则已配置并 oncall 验证
□ 错误日志接入 ELK,告警邮件已测试
□ 容灾能力
□ 主力模型不可用时,降级方案已测试
□ 数据库主从切换已验证(< 30s)
□ 灰度发布策略已就绪(5% → 20% → 100%)
□ 回滚流程已演练(< 5min)
□ 文档与培训
□ API 文档已发布(OpenAPI 3.0)
□ 运维 Runbook 已完成
□ 团队 oncall 培训已完成
5.4.2 灰度发布策略
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 基于 feature flag 的灰度控制
class GradualRollout:
ROLLOUT_STAGES = [
{"name": "canary", "percentage": 5, "duration_hours": 24},
{"name": "early", "percentage": 20, "duration_hours": 48},
{"name": "majority", "percentage": 50, "duration_hours": 48},
{"name": "full", "percentage": 100, "duration_hours": 0},
]
def should_use_new_version(self, user_id: str) -> bool:
current_stage = self._get_current_stage()
# 基于 user_id hash 确保同一用户体验一致
user_hash = int(hashlib.md5(user_id.encode()).hexdigest(), 16) % 100
return user_hash < current_stage["percentage"]
|
6. 技术选型矩阵
| 组件 |
推荐选型 |
备选方案 |
选型理由 |
| 编排框架 |
LangGraph |
CrewAI, AutoGen |
状态图更适合企业复杂流程 |
| 向量数据库 |
Qdrant |
Pinecone, Weaviate |
开源可私有化,性能强 |
| 关键词检索 |
Elasticsearch |
OpenSearch |
成熟生态,BM25 + 过滤 |
| 重排模型 |
BGE-Reranker-v2 |
Cohere Rerank |
中文效果最佳,可本地化 |
| 嵌入模型 |
text-embedding-3-large |
BGE-M3 |
通用场景首选 |
| 缓存 |
Redis 7 |
Memcached |
支持向量相似缓存 |
| 消息队列 |
Kafka |
RabbitMQ |
高吞吐,适合 Agent 任务队列 |
| 追踪 |
LangSmith |
Langfuse(开源) |
与 LangChain 深度集成 |
| 监控 |
Prometheus + Grafana |
Datadog |
开源成本低,定制性强 |
| CI/CD |
GitHub Actions + ArgoCD |
Jenkins |
GitOps 最佳实践 |
7. 安全与合规设计
7.1 Prompt Injection 防护
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class PromptInjectionDefender:
"""防止恶意用户通过 Prompt 注入攻击绕过系统限制"""
INJECTION_PATTERNS = [
r"ignore (all |previous |above )?instructions",
r"you are now (a |an )?.*(?:without|ignore|bypass)",
r"(pretend|act|roleplay|simulate) (you are|as if)",
r"system prompt|jailbreak|DAN|do anything now",
]
def scan(self, user_input: str) -> ScanResult:
for pattern in self.INJECTION_PATTERNS:
if re.search(pattern, user_input, re.IGNORECASE):
return ScanResult(
is_safe=False,
threat_type="prompt_injection",
matched_pattern=pattern,
)
return ScanResult(is_safe=True)
|
7.2 数据安全分级
| 级别 |
数据类型 |
处理规范 |
| L1 公开 |
公开文档、FAQ |
可送外部 API |
| L2 内部 |
业务数据、报告 |
需脱敏后送 API |
| L3 机密 |
财务、客户 PII |
只允许本地模型 |
| L4 绝密 |
战略规划、源码 |
完全隔离,人工处理 |
8. 附录
8.1 项目目录结构规范
project/
├── src/
│ ├── agents/ # Agent 实现
│ │ ├── base.py
│ │ ├── react_agent.py
│ │ └── multi_agent/
│ ├── tools/ # 工具库
│ ├── memory/ # 记忆系统
│ ├── rag/ # RAG 系统
│ ├── llm/ # LLM 网关
│ └── api/ # FastAPI 接口
├── evaluation/ # 评估脚本
├── prompts/ # Prompt 版本管理
├── k8s/ # K8s 配置
├── monitoring/ # 监控配置
├── tests/
│ ├── unit/
│ ├── integration/
│ └── e2e/
├── docs/
└── scripts/
8.2 关键参考资料
- LangChain 官方文档:https://docs.langchain.com
- LangGraph 文档:https://langchain-ai.github.io/langgraph/
- LangSmith 文档:https://docs.smith.langchain.com
- RAGAS 评估框架:https://docs.ragas.io
- vLLM 部署指南:https://docs.vllm.ai
文档持续更新中。如有问题,请联系 AI Agent 开发团队。