一、场景引入:同样的故障,为什么又花了两小时?

凌晨三点,值班工程师小李被告警惊醒:订单服务 P99 延迟飙升至 5 秒

他打开监控面板,查看日志,翻阅 Wiki,逐步排查——连接池耗尽、上游服务限流、数据库慢查询…两小时后终于定位:Redis 集群发生了主从切换,客户端连接池未及时刷新

处理完毕,小李隐约记得三个月前有人处理过类似问题。翻了半天 Slack 历史记录,果然找到了——当时老王只用了 15 分钟就搞定了,因为他一眼就认出了这个故障模式。

问题出在哪? 老王的经验留在了他的大脑里,没有变成团队的资产。当 AI Agent 介入运维时,同样的困境会重现——每次对话结束,Agent 就"失忆"了,下次遇到相同问题,又要从零开始分析。

本篇要解决的核心问题:如何让 AI Agent 拥有记忆,把每一次故障处理变成可复用的经验?


二、核心概念:Agent 的两种记忆

2.1 短期记忆:对话上下文

短期记忆就是当前对话的上下文窗口。在 LangGraph 中,它以 State 的形式存在,包含当前这轮交互的所有消息、中间状态和工具调用结果。

特点:

属性 说明
生命周期 单次对话/工作流
存储方式 内存中的 State 对象
容量限制 受 LLM Token 窗口限制
典型用途 当前故障的排查上下文

2.2 长期记忆:历史经验库

长期记忆是跨会话持久化的知识库。我们将历史故障案例通过 Embedding 向量化后存入向量数据库,当新告警到来时,Agent 可以检索相似的历史案例,参考过去的处理方案。

特点:

属性 说明
生命周期 永久(显式管理)
存储方式 向量数据库(Chroma/Milvus)
容量限制 几乎无限
典型用途 故障案例库、处理手册、经验模式

2.3 两者如何协同?

新告警到来
│
▼
┌──────────────┐    检索     ┌──────────────────┐
│  短期记忆     │ ◄──────── │  长期记忆          │
│  (当前上下文)  │           │  (历史案例库)       │
│              │           │                  │
│ · 告警详情    │           │ · 200+ 故障案例    │
│ · 排查步骤    │           │ · 处理方案模板     │
│ · 工具调用    │           │ · 运维经验总结     │
└──────┬───────┘           └──────────────────┘
│                           ▲
│  处理完成                   │ 归档
└──────────────────────────┘

一句话总结:短期记忆让 Agent 在当前任务中保持连贯,长期记忆让 Agent 从历史经验中学习。两者结合,Agent 才能越用越聪明。


三、架构设计:记忆增强的运维 Agent

3.1 整体架构

┌─────────────────────────────────────────────────────────┐
│                    记忆增强运维 Agent                      │
│                                                         │
│  ┌──────────┐   ┌──────────────┐   ┌────────────────┐  │
│  │ 告警接入   │──▶│ 记忆检索节点   │──▶│ 分析决策节点    │  │
│  └──────────┘   └──────┬───────┘   └───────┬────────┘  │
│                        │                    │           │
│                        ▼                    ▼           │
│                 ┌──────────────┐   ┌────────────────┐  │
│                 │ ChromaDB     │   │ 执行处理节点    │  │
│                 │ 向量数据库    │   └───────┬────────┘  │
│                 │              │           │           │
│                 │ · 故障案例    │           ▼           │
│                 │ · 处理方案    │   ┌────────────────┐  │
│                 │ · 经验摘要    │   │ 经验归档节点    │  │
│                 │              │◀──│ (自动沉淀)      │  │
│                 └──────────────┘   └────────────────┘  │
│                                                         │
│  ┌─────────────────────────────────────────────────┐   │
│  │           LangGraph State(短期记忆)              │   │
│  │  messages / alert_info / similar_cases / result  │   │
│  └─────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────┘

3.2 数据流说明

  1. 告警接入

    :收到新告警,解析为结构化信息

  2. 记忆检索

    :将告警描述向量化,在 ChromaDB 中检索 Top-K 相似案例

  3. 分析决策

    :结合当前告警 + 历史案例,由 DeepSeek 生成处理方案

  4. 执行处理

    :按方案执行运维操作

  5. 经验归档

    :处理完成后,自动提取经验摘要,写入向量数据库


四、代码实战:完整记忆系统实现

4.1 环境准备与依赖安装

pip install langgraph langchain-openai chromadb langchain-chroma tiktoken

4.2 基础配置与向量数据库初始化

import os
import json
import hashlib
from datetime import datetime
from typing import TypedDict, Annotated, Optional
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_core.messages import HumanMessage, SystemMessage, AIMessage
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
import chromadb
from chromadb.config import Settings
# ============================================================
# 1. 基础配置
# ============================================================
DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY", "your-api-key")
DEEPSEEK_BASE_URL = "https://api.deepseek.com/v1"
CHROMA_PERSIST_DIR = "./ops_memory_db"
# DeepSeek LLM
llm = ChatOpenAI(
model="deepseek-chat",
api_key=DEEPSEEK_API_KEY,
base_url=DEEPSEEK_BASE_URL,
temperature=0.3,
)
# Embedding 模型(使用 DeepSeek 兼容接口或本地模型)
embeddings = OpenAIEmbeddings(
model="text-embedding-ada-002",  # 可替换为本地 bge-large-zh 模型
api_key=DEEPSEEK_API_KEY,
base_url=DEEPSEEK_BASE_URL,
)
# ============================================================
# 2. ChromaDB 向量数据库初始化
# ============================================================
chroma_client = chromadb.PersistentClient(path=CHROMA_PERSIST_DIR)
# 故障案例集合
case_collection = chroma_client.get_or_create_collection(
name="ops_fault_cases",
metadata={"description": "运维故障案例库", "hnsw:space": "cosine"},
)
# 经验摘要集合(更精炼的知识)
experience_collection = chroma_client.get_or_create_collection(
name="ops_experience",
metadata={"description": "运维经验摘要库", "hnsw:space": "cosine"},
)
print(f"[Memory] 案例库已有 {case_collection.count()} 条记录")
print(f"[Memory] 经验库已有 {experience_collection.count()} 条记录")

4.3 故障案例 Embedding 与存储

# ============================================================
# 3. 故障案例管理:写入与检索
# ============================================================
class FaultCase:
"""故障案例数据结构"""
def __init__(
self,
title: str,
alert_content: str,
root_cause: str,
solution: str,
category: str,
severity: str = "P2",
resolved_at: str = None,
):
self.title = title
self.alert_content = alert_content  # 原始告警内容
self.root_cause = root_cause        # 根因
self.solution = solution            # 处理方案
self.category = category            # 分类:network/db/app/infra
self.severity = severity
self.resolved_at = resolved_at or datetime.now().isoformat()
self.case_id = hashlib.md5(
f"{title}{self.resolved_at}".encode()
).hexdigest()[:12]
def store_fault_case(case: FaultCase) -> str:
"""将故障案例向量化并存入 ChromaDB"""
# 构造用于 Embedding 的文本(拼接关键字段,提高检索精度)
embed_text = (
f"告警内容:{case.alert_content}\n"
f"故障标题:{case.title}\n"
f"根因分析:{case.root_cause}\n"
f"分类:{case.category}"
)
# 元数据(用于过滤和展示)
metadata = {
"title": case.title,
"category": case.category,
"severity": case.severity,
"root_cause": case.root_cause,
"solution": case.solution,
"resolved_at": case.resolved_at,
}
# 写入 ChromaDB
case_collection.upsert(
ids=[case.case_id],
documents=[embed_text],
metadatas=[metadata],
)
print(f"[Memory] 案例已存储: {case.case_id} - {case.title}")
return case.case_id
def search_similar_cases(
query: str, top_k: int = 3, category: str = None
) -> list[dict]:
"""根据告警描述检索相似历史案例"""
where_filter = {"category": category} if category else None
results = case_collection.query(
query_texts=[query],
n_results=top_k,
where=where_filter,
include=["documents", "metadatas", "distances"],
)
cases = []
for i in range(len(results["ids"][0])):
distance = results["distances"][0][i]
similarity = round(1 - distance, 4)  # cosine 距离转相似度
cases.append({
"case_id": results["ids"][0][i],
"similarity": similarity,
"title": results["metadatas"][0][i]["title"],
"root_cause": results["metadatas"][0][i]["root_cause"],
"solution": results["metadatas"][0][i]["solution"],
"severity": results["metadatas"][0][i]["severity"],
"category": results["metadatas"][0][i]["category"],
})
return cases
# ---------- 预置历史案例(模拟已有经验)----------
sample_cases = [
FaultCase(
title="Redis 主从切换导致连接池失效",
alert_content="订单服务 P99 延迟从 200ms 飙升至 5000ms,错误日志大量出现 JedisConnectionException",
root_cause="Redis Sentinel 触发主从切换,应用连接池缓存了旧的 master 地址,新连接全部失败",
solution="1.重启应用刷新连接池 2.修改 Jedis 配置启用 Sentinel 自动发现 3.设置连接池 testOnBorrow=true",
category="db",
severity="P1",
resolved_at="2024-11-15T03:22:00",
),
FaultCase(
title="MySQL 慢查询导致连接池耗尽",
alert_content="用户服务接口超时率 >30%,MySQL 活跃连接数达到上限 200",
root_cause="新上线的用户列表查询缺少索引,单次查询耗时 8 秒,连接被长时间占用",
solution="1.紧急添加缺失索引 ALTER TABLE users ADD INDEX idx_create_time(create_time) 2.Kill 长耗时查询 3.连接池上限临时调至 300",
category="db",
severity="P1",
resolved_at="2024-12-03T14:10:00",
),
FaultCase(
title="K8s Pod OOMKilled 导致服务不可用",
alert_content="推荐服务 Pod 反复重启,状态 OOMKilled,内存使用 2048Mi/2048Mi",
root_cause="新版本引入的特征缓存未设置大小上限,内存持续增长直至 OOM",
solution="1.回滚至上一版本 2.修复代码添加 LRU 缓存上限 3.调整 Pod memory limit 至 3072Mi 作为缓冲",
category="app",
severity="P2",
resolved_at="2025-01-08T09:45:00",
),
FaultCase(
title="Nginx 502 Bad Gateway 大面积爆发",
alert_content="网关层 502 错误率突增至 40%,后端健康检查全部失败",
root_cause="后端服务滚动更新时 preStop hook 未配置,旧 Pod 被立即终止,请求打到已关闭的端口",
solution="1.紧急暂停 Deployment 滚动更新 2.添加 preStop lifecycle hook sleep 15 3.配置 PDB 保证最小可用副本数",
category="app",
severity="P1",
resolved_at="2025-02-20T16:30:00",
),
FaultCase(
title="磁盘空间不足导致数据库宕机",
alert_content="MySQL 主库写入失败,错误 The table is full,磁盘使用率 100%",
root_cause="binlog 未按期清理,3 个月的 binlog 占满 500G 磁盘空间",
solution="1.紧急清理过期 binlog: PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY) 2.配置 expire_logs_days=7 3.添加磁盘空间监控告警",
category="infra",
severity="P0",
resolved_at="2025-03-11T02:15:00",
),
]
for case in sample_cases:
store_fault_case(case)
print(f"\n[Memory] 预置 {len(sample_cases)} 条历史案例完成")

4.4 LangGraph 记忆增强 Agent 主流程

# ============================================================
# 4. LangGraph 记忆增强 Agent
# ============================================================
class AgentState(TypedDict):
"""Agent 状态定义(短期记忆)"""
messages: Annotated[list, add_messages]
alert_info: dict                          # 当前告警信息
similar_cases: list[dict]                 # 检索到的相似案例
analysis_result: Optional[str]            # 分析结果
solution: Optional[str]                   # 处理方案
experience_summary: Optional[str]         # 经验总结
is_resolved: bool                         # 是否已解决
# ---------- 节点 1:记忆检索 ----------
def memory_retrieval_node(state: AgentState) -> dict:
"""从长期记忆中检索相似历史案例"""
alert = state["alert_info"]
query = f"{alert.get('title', '')} {alert.get('description', '')}"
print(f"\n{'='*50}")
print(f"[记忆检索] 正在检索相似案例...")
print(f"[记忆检索] 查询内容: {query[:80]}...")
similar = search_similar_cases(query, top_k=3)
for i, case in enumerate(similar):
print(f"  #{i+1} [{case['similarity']:.2%}] {case['title']}")
return {
"similar_cases": similar,
"messages": [
AIMessage(content=f"[系统] 从记忆库检索到 {len(similar)} 条相似案例")
],
}
# ---------- 节点 2:分析决策(结合记忆)----------
def analysis_with_memory_node(state: AgentState) -> dict:
"""结合历史案例进行告警分析"""
alert = state["alert_info"]
similar = state["similar_cases"]
# 构造包含历史经验的 Prompt
cases_context = ""
for i, case in enumerate(similar):
cases_context += f"""
--- 历史案例 {i+1}(相似度 {case['similarity']:.0%})---
标题:{case['title']}
根因:{case['root_cause']}
方案:{case['solution']}
"""
prompt = f"""你是一位资深 SRE 工程师,正在处理一个线上告警。
## 当前告警
- 标题:{alert.get('title', '未知')}
- 详情:{alert.get('description', '无')}
- 严重级别:{alert.get('severity', 'P2')}
- 影响范围:{alert.get('impact', '未知')}
## 历史相似案例参考
{cases_context if cases_context.strip() else '暂无相似历史案例'}
## 任务
请综合当前告警信息和历史经验,完成以下分析:
1. **初步判断**:最可能的根因是什么?与哪个历史案例最相似?
2. **处理方案**:给出具体的、可执行的处理步骤(优先参考历史方案)
3. **差异提醒**:当前情况与历史案例有何不同?需要额外注意什么?
4. **预估耗时**:基于历史经验,预计处理时间
请用结构化格式输出。"""
print(f"\n{'='*50}")
print("[分析决策] 结合历史经验进行分析...")
response = llm.invoke([HumanMessage(content=prompt)])
return {
"analysis_result": response.content,
"solution": response.content,
"messages": [
AIMessage(content=f"[分析完成]\n{response.content}")
],
}
# ---------- 节点 3:模拟执行处理 ----------
def execute_solution_node(state: AgentState) -> dict:
"""模拟执行处理方案"""
print(f"\n{'='*50}")
print("[执行处理] 按方案执行中...")
print("[执行处理] >>> 模拟执行完毕,故障已恢复 <<<")
return {
"is_resolved": True,
"messages": [
AIMessage(content="[系统] 处理方案已执行,故障恢复确认")
],
}
# ---------- 节点 4:经验自动归档(核心!)----------
def experience_archival_node(state: AgentState) -> dict:
"""处理完成后自动提取经验并归档到长期记忆"""
alert = state["alert_info"]
analysis = state["analysis_result"]
similar = state["similar_cases"]
# ----- 4a. 用 LLM 提取经验摘要 -----
archive_prompt = f"""你是运维经验总结专家。请从以下故障处理过程中提取可复用的经验。
## 告警信息
标题:{alert.get('title', '')}
详情:{alert.get('description', '')}
## 分析与处理过程
{analysis}
## 参考的历史案例数量:{len(similar)}
## 请按以下格式输出经验总结
### 故障标题
(一句话概括)
### 故障分类
(从以下选择:network / db / app / infra / security)
### 根因摘要
(50 字以内的根因描述)
### 处理方案摘要
(关键步骤,编号列出)
### 可复用经验
(提炼 2-3 条通用经验,未来遇到类似问题可直接复用)
### 预防建议
(如何避免此类问题再次发生)"""
print(f"\n{'='*50}")
print("[经验归档] 正在提取可复用经验...")
response = llm.invoke([HumanMessage(content=archive_prompt)])
summary = response.content
# ----- 4b. 将新案例存入向量数据库 -----
new_case = FaultCase(
title=alert.get("title", "未命名故障"),
alert_content=alert.get("description", ""),
root_cause=f"由 AI Agent 自动归档 - 详见分析: {analysis[:200]}",
solution=summary,
category=_extract_category(summary),
severity=alert.get("severity", "P2"),
)
case_id = store_fault_case(new_case)
# ----- 4c. 精炼经验存入经验库 -----
experience_collection.upsert(
ids=[f"exp_{case_id}"],
documents=[summary],
metadatas={
"source_case_id": case_id,
"title": alert.get("title", ""),
"archived_at": datetime.now().isoformat(),
},
)
print(f"[经验归档] 新案例 {case_id} 已归档至长期记忆")
print(f"[经验归档] 案例库总量: {case_collection.count()}")
return {
"experience_summary": summary,
"messages": [
AIMessage(
content=f"[系统] 经验已自动归档(ID: {case_id}),记忆库已更新\n\n{summary}"
)
],
}
def _extract_category(text: str) -> str:
"""从经验总结中提取分类"""
for cat in ["network", "db", "app", "infra", "security"]:
if cat in text.lower():
return cat
return "app"
# ============================================================
# 5. 组装 LangGraph 工作流
# ============================================================
workflow = StateGraph(AgentState)
# 添加节点
workflow.add_node("memory_retrieval", memory_retrieval_node)
workflow.add_node("analysis", analysis_with_memory_node)
workflow.add_node("execute", execute_solution_node)
workflow.add_node("archive", experience_archival_node)
# 定义边
workflow.add_edge(START, "memory_retrieval")
workflow.add_edge("memory_retrieval", "analysis")
workflow.add_edge("analysis", "execute")
workflow.add_edge("execute", "archive")
workflow.add_edge("archive", END)
# 编译
memory_agent = workflow.compile()
print("\n[Agent] 记忆增强运维 Agent 编译完成")

4.5 经验自动归档子图(LangGraph SubGraph)

在实际生产中,经验归档逻辑可能更复杂(如需要人工审核、自动去重、质量评分等),适合抽取为独立子图:

# ============================================================
# 6. 经验归档子图(SubGraph)
# ============================================================
class ArchiveState(TypedDict):
"""归档子图状态"""
case_text: str              # 案例原文
summary: Optional[str]      # 经验摘要
quality_score: float        # 质量评分(0-1)
is_duplicate: bool          # 是否重复
archived: bool              # 是否已归档
def dedup_check_node(state: ArchiveState) -> dict:
"""去重检查:与已有案例对比,避免重复归档"""
results = case_collection.query(
query_texts=[state["case_text"]],
n_results=1,
include=["distances"],
)
is_dup = False
if results["distances"] and results["distances"][0]:
similarity = 1 - results["distances"][0][0]
is_dup = similarity > 0.95  # 相似度 > 95% 视为重复
print(f"[去重] 最相似案例相似度: {similarity:.2%},{'跳过' if is_dup else '继续'}归档")
return {"is_duplicate": is_dup}
def summarize_node(state: ArchiveState) -> dict:
"""用 LLM 生成经验摘要"""
prompt = f"请用 100 字以内总结以下运维案例的核心经验:\n\n{state['case_text']}"
response = llm.invoke([HumanMessage(content=prompt)])
return {"summary": response.content}
def quality_score_node(state: ArchiveState) -> dict:
"""评估经验质量(简化版:按长度和关键词评分)"""
summary = state.get("summary", "")
score = min(len(summary) / 200, 1.0)  # 基础分:长度
key_indicators = ["根因", "方案", "预防", "监控", "回滚"]
for kw in key_indicators:
if kw in summary:
score = min(score + 0.1, 1.0)
print(f"[质量评估] 评分: {score:.2f}")
return {"quality_score": score}
def persist_node(state: ArchiveState) -> dict:
"""持久化到向量数据库"""
case_id = hashlib.md5(state["case_text"].encode()).hexdigest()[:12]
experience_collection.upsert(
ids=[f"exp_{case_id}"],
documents=[state["summary"]],
metadatas={"quality_score": state["quality_score"],
"archived_at": datetime.now().isoformat()},
)
print(f"[持久化] 经验 exp_{case_id} 已写入(质量 {state['quality_score']:.2f})")
return {"archived": True}
def should_archive(state: ArchiveState) -> str:
"""条件路由:决定是否归档"""
if state.get("is_duplicate", False):
return "skip"
return "continue"
def should_persist(state: ArchiveState) -> str:
"""条件路由:质量达标才持久化"""
if state.get("quality_score", 0) >= 0.5:
return "persist"
return "skip"
# 构建归档子图
archive_subgraph = StateGraph(ArchiveState)
archive_subgraph.add_node("dedup_check", dedup_check_node)
archive_subgraph.add_node("summarize", summarize_node)
archive_subgraph.add_node("quality_score", quality_score_node)
archive_subgraph.add_node("persist", persist_node)
archive_subgraph.add_edge(START, "dedup_check")
archive_subgraph.add_conditional_edges(
"dedup_check",
should_archive,
{"continue": "summarize", "skip": END},
)
archive_subgraph.add_edge("summarize", "quality_score")
archive_subgraph.add_conditional_edges(
"quality_score",
should_persist,
{"persist": "persist", "skip": END},
)
archive_subgraph.add_edge("persist", END)
archive_graph = archive_subgraph.compile()
print("[SubGraph] 经验归档子图编译完成")

4.6 运行完整流程

# ============================================================
# 7. 运行示例
# ============================================================
def run_memory_agent(alert: dict):
"""运行记忆增强运维 Agent"""
print("\n" + "=" * 60)
print(f"  新告警: {alert['title']}")
print(f"  级别: {alert['severity']} | 时间: {datetime.now().isoformat()}")
print("=" * 60)
initial_state = {
"messages": [
HumanMessage(content=f"收到告警:{alert['title']}\n{alert['description']}")
],
"alert_info": alert,
"similar_cases": [],
"analysis_result": None,
"solution": None,
"experience_summary": None,
"is_resolved": False,
}
result = memory_agent.invoke(initial_state)
print("\n" + "-" * 60)
print("[最终输出] 经验总结:")
print(result.get("experience_summary", "无"))
print("-" * 60)
return result
# 模拟一个新告警(与历史 Redis 案例相似)
new_alert = {
"title": "支付服务 Redis 连接异常",
"description": "支付服务大量报错 redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool。P99 延迟从 150ms 上升至 4200ms,影响支付成功率",
"severity": "P1",
"impact": "支付成功率下降至 62%",
"source": "Prometheus AlertManager",
}
result = run_memory_agent(new_alert)

五、Prompt 模板:经验总结 Prompt

以下是用于从故障处理过程中自动提取可复用经验的 Prompt 模板,可直接在 Agent 中使用:

EXPERIENCE_EXTRACTION_PROMPT = """
你是一位运维经验沉淀专家。你的任务是从故障处理过程中提取可复用的知识,
形成标准化的经验卡片,供未来 AI Agent 和运维工程师参考。
## 输入信息
### 故障告警
{alert_content}
### 排查过程
{investigation_steps}
### 最终根因
{root_cause}
### 处理方案
{solution}
### 处理耗时
{resolution_time}
## 输出要求
请按以下 JSON 格式输出经验卡片:
```json
{{
"title": "一句话描述故障(20 字以内)",
"category": "分类(network/db/app/infra/security)",
"symptoms": ["症状1", "症状2", "症状3"],
"root_cause_pattern": "根因模式(30 字以内,抽象化描述)",
"quick_diagnosis": "快速判断方法(如何在 1 分钟内初步确认是否是此类问题)",
"solution_steps": [
"步骤1:具体操作",
"步骤2:具体操作"
],
"prevention": [
"预防措施1",
"预防措施2"
],
"related_commands": ["相关运维命令1", "相关运维命令2"],
"tags": ["标签1", "标签2", "标签3"],
"confidence": 0.85
}}

关键原则

  1. 可复用性:经验要抽象化,不要包含特定的 IP、时间等临时信息
  2. 可操作性:每个步骤必须具体到可执行的命令或操作
  3. 快速诊断:提供 1 分钟内初步确认的方法,这是最有价值的部分
  4. 防患未然:预防建议比修复方案更重要
    “”"

---

六、效果展示:模拟输入输出
-------------

### 6.1 场景:新告警触发记忆检索

**输入告警**:

```code-snippet__js
标题: 支付服务 Redis 连接异常
详情: 支付服务大量报错 JedisConnectionException: Could not get a resource
from the pool。P99 延迟从 150ms 上升至 4200ms
级别: P1
影响: 支付成功率下降至 62%

Agent 执行日志

============================================================
新告警: 支付服务 Redis 连接异常
级别: P1 | 时间: 2025-04-15T03:12:33
============================================================
==================================================
[记忆检索] 正在检索相似案例...
[记忆检索] 查询内容: 支付服务 Redis 连接异常 支付服务大量报错 JedisConnectionException...
#1 [92.3%] Redis 主从切换导致连接池失效
#2 [71.8%] MySQL 慢查询导致连接池耗尽
#3 [54.2%] K8s Pod OOMKilled 导致服务不可用
==================================================
[分析决策] 结合历史经验进行分析...
## 初步判断
当前告警与历史案例「Redis 主从切换导致连接池失效」高度相似(92.3%)。
JedisConnectionException + P99 延迟飙升是典型的 Redis 连接池故障症状。
最可能的根因:Redis 主从切换或节点异常,导致连接池中的连接失效。
## 处理方案(参考历史经验)
1. 【紧急】检查 Redis Sentinel 状态:redis-cli -p 26379 SENTINEL masters
2. 【紧急】确认 master 节点是否发生切换:查看 Sentinel 日志
3. 【恢复】滚动重启支付服务 Pod,刷新连接池
4. 【根治】确认 Jedis 配置是否已启用 Sentinel 自动发现模式
5. 【验证】观察 P99 延迟和支付成功率恢复情况
## 差异提醒
历史案例影响的是订单服务,本次是支付服务。需额外关注:
- 支付服务是否有事务补偿机制
- 异常期间的支付订单是否需要人工核对
## 预估耗时
参考历史处理时长,预计 15-20 分钟可恢复。
==================================================
[执行处理] 按方案执行中...
[执行处理] >>> 模拟执行完毕,故障已恢复 <<<
==================================================
[经验归档] 正在提取可复用经验...
[Memory] 案例已存储: a3f8c2e1b4d7 - 支付服务 Redis 连接异常
[经验归档] 新案例 a3f8c2e1b4d7 已归档至长期记忆
[经验归档] 案例库总量: 6

6.2 核心价值

指标 无记忆 Agent 有记忆 Agent
首次响应 从零分析,5-10 分钟 命中历史案例,30 秒给出方案
方案准确率 约 60% 约 90%(有历史验证)
处理耗时 平均 2 小时 平均 20 分钟
经验留存 随对话结束丢失 自动归档,永久可用

七、注意事项与最佳实践

7.1 向量检索调优

常见陷阱                          解决方案
─────────────────────────────────────────────────────
Embedding 文本过短,语义不足       拼接多字段(告警+根因+分类)
检索结果全部低相似度               降低阈值或检查 Embedding 模型
不同类型故障混在一起               使用 metadata 分类过滤
历史案例过时不再适用               定期清理 + 添加时间衰减权重

7.2 记忆系统五大原则

  1. 写入有门槛

    :不是所有处理过程都值得记住。设置质量评分,低质量经验不入库。

  2. 检索要快速

    :向量检索必须在 200ms 以内完成,否则拖慢 Agent 响应。建议本地部署 ChromaDB 或使用 Milvus 集群。

  3. 经验要抽象

    :去除具体 IP、时间戳等临时信息,保留可复用的故障模式和解决思路。

  4. 定期要清理

    :设置 TTL 或定期审查机制,过时的经验比没有经验更危险。

  5. 人机要协同

    :关键经验入库前应经过人工审核,避免错误经验被反复引用。

7.3 Embedding 模型选型建议

模型 场景 优势 劣势
BGE-large-zh 中文运维场景首选 中文语义理解强 需本地部署
text-embedding-3-small 快速验证 API 调用方便 中文效果一般
m3e-base 中文通用 开源、轻量 精度稍低
自训练模型 大规模生产 领域最优 需要标注数据

推荐:起步阶段用 BGE-large-zh 本地部署,成熟后在运维语料上微调。

7.4 生产部署注意事项

  • 向量数据库高可用

    :ChromaDB 适合开发测试,生产建议使用 Milvus 或 Qdrant 集群版

  • Embedding 缓存

    :对相同文本的 Embedding 结果做缓存,避免重复计算

  • 并发安全

    :多个 Agent 实例同时写入时需要处理并发冲突

  • 数据备份

    :向量数据库要纳入备份策略,这是团队经验资产

学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

在这里插入图片描述

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐