一句话定义:本文系统讲解如何基于本地大模型(Ollama)与向量数据库(Milvus/Qdrant)构建RAG(检索增强生成)运维知识库,让AI Agent在决策时能够检索历史故障案例与运维文档,实现从“每次从头推理”到“站在经验上思考”的智能化升级。
一、引言:AI Agent的“经验”从何而来?
在第28篇中,我们构建了AI Agent自动化运维平台——它能自主分析告警、调用工具、执行修复操作。看起来已经很智能了,但有一个核心问题始终存在:Agent的“经验”是空的。
每次遇到故障,Agent都要从头推理——分析日志、思考根因、制定方案。如果遇到一个之前处理过的类似问题,它依然要重复走一遍完整的推理链路,耗时耗力,还可能因为推理偏差给出次优方案。
这就好比一个新手运维工程师,每次都要翻书查资料才能处理故障,而不是像老手一样“一看就知道问题在哪”。
RAG(检索增强生成)就是来解决这个问题的。
RAG的本质是给大模型外挂一个“知识U盘”。它允许Agent在回答问题或做出决策前,先从知识库中检索与当前问题最相关的历史案例和文档,将这些“参考资料”连同问题一起喂给大模型,让模型基于真实经验来生成回答。
RAG的威力在运维场景中已经被验证:某省气象数据中心基于RAG构建了智能运维问答系统,实现了运维故障的智能诊断与自动处置;在数据库运维场景中,RAG技术将故障处理效率提升了40%以上;监控易的AI知识库模块借助RAG+LLM,将排障效率提升了60%。
在Java SaaS部署的全链路中(第32篇AI Agent → 第33篇RAG知识库 → 第34篇AIOps全景架构),RAG是从“AI辅助”走向“AI智能”的最后一公里。掌握了RAG,你的AI Agent就不再是“一张白纸”,而是拥有丰富经验的“运维老兵”。
二、RAG核心原理:大模型的“开卷考试”
为什么这样写:在动手部署之前,先搞清楚RAG的工作原理——知道“数据怎么进去、怎么出来”,后面的配置才不会一头雾水。
2.1 什么是RAG?
RAG(Retrieval-Augmented Generation)是一种将信息检索与大语言模型生成相结合的技术框架。它的核心工作流程分为三个阶段:
| 阶段 | 做什么 | 关键技术 |
|---|---|---|
| 离线阶段:知识入库 | 将运维文档、历史故障案例切分成小块,转换为向量,存入向量数据库 | 文档解析、文本分块、Embedding模型 |
| 在线阶段:检索 | 将用户问题(或告警信息)也转换为向量,在数据库中检索最相似的Top-K文档 | 向量相似度检索(余弦相似度) |
| 生成阶段:增强回答 | 将检索到的文档片段 + 原始问题一起输入大模型,生成基于“参考资料”的精准回答 | Prompt工程、LLM生成 |
简单理解:传统大模型回答问题像是“闭卷考试”——全靠模型训练时记住的知识。RAG则像是“开卷考试”——先翻书(检索知识库),找到相关章节,再结合书本内容作答。
2.2 为什么RAG特别适合运维场景?
运维场景有三个特点,让RAG成为天然的最佳选择:
-
经验高度可复用:同样的故障(如“数据库连接池耗尽”)在不同时间、不同服务上反复出现。把每次的处理过程记录下来,下次遇到就能快速参考。
-
知识分散且动态:运维文档散落在各处——操作手册、故障报告、监控配置、架构文档。RAG能将它们统一整合,并通过语义检索让知识“活起来”。
-
对准确性要求极高:大模型直接回答运维问题时容易“幻觉”(编造不存在的解决方案)。RAG通过检索真实的历史案例来约束模型的回答,显著降低了幻觉率。
三、系统架构设计
为什么这样写:理解整体架构是成功的一半。知道“数据从哪来、存到哪、怎么用”,部署时才能有的放矢。
3.1 四层架构
┌─────────────────────────────────────────────────────────────────┐
│ 第1层:数据源层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 故障报告 │ │ 操作手册 │ │ Runbook │ │ 监控配置 │ │
│ │ (Markdown)│ │ (PDF/Word)│ │ (YAML) │ │ (文档) │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────┬───────────────────────────────────────┘
│ ETL(提取-转换-加载)
┌─────────────────────────▼───────────────────────────────────────┐
│ 第2层:知识加工层 │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ ① 文档解析(Tika)→ ② 文本分块(按语义/Token) │ │
│ │ → ③ 向量化(Embedding模型)→ ④ 存入向量数据库 │ │
│ └──────────────────────────────────────────────────────────┘ │
└─────────────────────────┬───────────────────────────────────────┘
│ 向量 + 元数据
┌─────────────────────────▼───────────────────────────────────────┐
│ 第3层:存储层 │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 向量数据库(Milvus / Qdrant) │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ 向量索引 │ │ 元数据 │ │ 版本管理 │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ └──────────────────────────────────────────────────────────┘ │
└─────────────────────────┬───────────────────────────────────────┘
│ 相似度检索
┌─────────────────────────▼───────────────────────────────────────┐
│ 第4层:应用层 │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ AI Agent(第28篇)+ RAG检索增强 │ │
│ │ 用户问题/告警 → 向量检索 → 检索结果 → LLM生成答案 │ │
│ └──────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
踩过的坑:
- 坑1:文档分块(Chunking)策略不当——分块太大导致检索精度下降,分块太小丢失上下文
- 坑2:Embedding模型与向量数据库的维度不匹配,导致向量无法写入
注意事项:
- RAG系统的瓶颈从来不在大模型,而在于知识库质量——高质量的知识入库是RAG成功的前提
四、向量数据库选型
为什么这样写:向量数据库是RAG的“记忆仓库”。选型对了事半功倍,选型错了后面全是坑。
4.1 主流向量数据库对比
| 数据库 | 特点 | 适用场景 | 部署方式 |
|---|---|---|---|
| Milvus | 功能最全面,支持十亿级向量,GPU加速 | 生产级大规模RAG | Docker / K8s / 云服务 |
| Qdrant | 轻量级,Rust编写,性能优异 | 中小规模、快速部署 | Docker(一条命令) |
| Redis Stack | 基于Redis,Java开发者友好 | 已有Redis基础设施的团队 | Docker |
| Chroma | 轻量级,Python原生 | 原型验证、开发测试 | pip install |
4.2 选型建议
- 生产环境大规模RAG(百万级+文档)→ Milvus,支持分布式部署和多种索引优化
- 中小规模快速上线 → Qdrant,Docker一键启动,资源开销小
- 已有Redis的Java团队 → Redis Stack,复用现有基础设施
- 原型验证阶段 → Chroma,零配置快速上手
💡 本文推荐:对于大多数Java SaaS团队的运维知识库场景(文档数量在万级到十万级),Qdrant是最务实的选择——部署简单、性能优秀、API友好。下面以Qdrant为例进行实战演示。
五、部署向量数据库(Qdrant)
为什么这样写:Qdrant的部署极其简单——一条Docker命令就能启动。先让数据库跑起来,再考虑数据写入和查询。
踩过的坑:
- 坑1:忘记挂载持久化存储卷,容器重启后所有数据丢失
- 坑2:端口映射配置错误,应用无法连接Qdrant
代码块:Docker部署Qdrant
# 1. 拉取Qdrant镜像
docker pull qdrant/qdrant
# 2. 创建持久化存储目录
mkdir -p /data/qdrant_storage
# 3. 启动Qdrant容器(挂载持久化卷)
docker run -d \
--name qdrant_server \
-v /data/qdrant_storage:/qdrant/storage \
-p 6333:6333 \
-p 6334:6334 \
--restart unless-stopped \
qdrant/qdrant
# 4. 验证Qdrant是否正常运行
curl http://localhost:6333/collections
# 应返回:{"result":{"collections":[]},"status":"ok","time":...}
# 5. 访问Web UI(可选)
# 浏览器打开:http://localhost:6333/dashboard
执行后说明:-p 6333:6333暴露了Qdrant的HTTP API端口,-p 6334:6334暴露了gRPC端口(高性能场景使用)。-v /data/qdrant_storage:/qdrant/storage确保数据持久化——即使容器删除重建,知识库数据也不会丢失。curl返回"status":"ok"说明数据库已就绪。
代码块:验证Qdrant集合操作
# 创建一个测试集合(相当于关系数据库中的"表")
curl -X PUT http://localhost:6333/collections/ops_knowledge \
-H "Content-Type: application/json" \
-d '{
"vectors": {
"size": 768,
"distance": "Cosine"
}
}'
# 查看已创建的集合
curl http://localhost:6333/collections
# 应看到 ops_knowledge 在列表中
执行后说明:vectors.size: 768是向量维度——必须与Embedding模型输出的维度一致(如nomic-embed-text输出768维)。distance: "Cosine"使用余弦相似度计算向量距离,是RAG场景的标配。
六、构建运维知识库
为什么这样写:向量数据库只是个“空仓库”,真正有价值的是里面的“货物”——运维知识。这一节讲的是如何把散落的运维文档变成可检索的向量数据。
6.1 知识来源与类型
运维知识库的数据来源包括:
| 知识类型 | 来源 | 格式 | 用途 |
|---|---|---|---|
| 故障处理记录 | 每次故障的复盘报告 | Markdown | 根因分析参考 |
| Runbook/操作手册 | 标准化运维流程文档 | Markdown/PDF | 标准化操作指引 |
| 监控告警规则说明 | Prometheus告警配置 | YAML + 注释 | 告警上下文理解 |
| 架构设计文档 | 系统设计文档 | Markdown/Confluence | 架构问题分析 |
| 常见问题FAQ | 历史问答记录 | Markdown | 快速问答 |
6.2 文档处理流程(ETL)
为什么这样写:原始文档不能直接存入向量数据库——需要经过“解析→分块→向量化”三步处理。
踩过的坑:
- 坑1:文档分块没有考虑语义完整性——在句子中间切断,导致检索到的片段语义不完整
- 坑2:Embedding模型选择不当,中文文档用了英文优化的模型,检索效果差
代码块:文档ETL处理(Python示例)
import os
import hashlib
from typing import List, Dict
import requests
import json
# ============================================================
# 第一步:文档解析(支持多种格式)
# ============================================================
def parse_document(file_path: str) -> str:
"""解析文档,提取纯文本内容"""
# 实际生产环境可使用 Apache Tika 或 unstructured 库
# 这里以 Markdown 文件为例
with open(file_path, 'r', encoding='utf-8') as f:
return f.read()
# ============================================================
# 第二步:智能分块(Chunking)
# ============================================================
def chunk_document(text: str, chunk_size: int = 500, overlap: int = 50) -> List[str]:
"""
将文档切分成重叠的块
- chunk_size: 每块的最大字符数(建议300-500词)
- overlap: 块之间的重叠字符数(保持上下文连贯)
"""
chunks = []
start = 0
text_len = len(text)
while start < text_len:
end = min(start + chunk_size, text_len)
# 尽量在句子边界处切分(查找最近的句号/换行)
if end < text_len:
# 向前查找最近的句子边界
for i in range(end, max(start, end - 100), -1):
if text[i] in '.!?。!?\n':
end = i + 1
break
chunk = text[start:end].strip()
if chunk:
chunks.append(chunk)
start = end - overlap # 重叠部分
return chunks
# ============================================================
# 第三步:向量化(调用Ollama Embedding模型)
# ============================================================
def get_embedding(text: str, model: str = "nomic-embed-text") -> List[float]:
"""调用Ollama的Embedding接口将文本转换为向量"""
response = requests.post(
"http://localhost:11434/api/embeddings",
json={"model": model, "prompt": text},
timeout=30
)
return response.json()["embedding"]
# ============================================================
# 第四步:存入Qdrant
# ============================================================
def ingest_to_qdrant(chunks: List[str], source: str, collection: str = "ops_knowledge"):
"""将分块后的文档存入Qdrant向量数据库"""
points = []
for idx, chunk in enumerate(chunks):
vector = get_embedding(chunk)
point = {
"id": hashlib.md5(f"{source}_{idx}".encode()).hexdigest(),
"vector": vector,
"payload": {
"text": chunk,
"source": source,
"chunk_index": idx,
"doc_type": "runbook" if "runbook" in source else "incident"
}
}
points.append(point)
# 批量插入Qdrant
response = requests.put(
f"http://localhost:6333/collections/{collection}/points",
json={"points": points}
)
return response.status_code == 200
# ============================================================
# 完整流程:处理单个文档
# ============================================================
def process_document(file_path: str, source_name: str):
"""处理单个文档的完整ETL流程"""
print(f"📄 处理文档: {file_path}")
# 1. 解析
text = parse_document(file_path)
print(f" - 文档长度: {len(text)} 字符")
# 2. 分块
chunks = chunk_document(text, chunk_size=500, overlap=50)
print(f" - 分块数量: {len(chunks)}")
# 3. 向量化并入库
success = ingest_to_qdrant(chunks, source_name)
print(f" - 入库状态: {'✅ 成功' if success else '❌ 失败'}")
return success
# 使用示例
if __name__ == "__main__":
# 处理故障复盘报告
process_document("/data/knowledge/incident-2026-07-15.md", "incident_db_connection_pool")
# 处理Runbook
process_document("/data/knowledge/runbook-restart-service.md", "runbook_restart")
执行后说明:这个ETL流程的四个步骤环环相扣:
-
文档解析:使用
parse_document从各种格式(Markdown、PDF、Word)提取纯文本。生产环境推荐使用Apache Tika或unstructured库。 -
智能分块:
chunk_size=500(约300-500词)是RAG场景的推荐值。overlap=50让相邻块有重叠,确保跨块的语义不丢失。分块时尽量在句子边界切分,避免切断语义完整的句子。 -
向量化:调用Ollama的
/api/embeddings接口。nomic-embed-text是轻量级Embedding模型,768维,适合本地部署。 -
入库:每个分块作为一个“点”(Point)存入Qdrant。
payload中存储了原文、来源、类型等元数据,便于后续检索时展示上下文。
七、RAG检索与生成:让Agent“查资料”再回答
为什么这样写:知识库建好了,现在要让Agent能用起来——先检索相关文档,再基于检索结果生成回答。这是RAG的核心价值所在。
7.1 检索流程
代码块:RAG检索与生成(Python示例)
# ============================================================
# RAG检索与生成核心逻辑
# ============================================================
def rag_query(query: str, collection: str = "ops_knowledge", top_k: int = 5) -> Dict:
"""
RAG检索增强生成
1. 将用户问题转换为向量
2. 在向量数据库中检索最相似的Top-K文档
3. 将检索结果 + 用户问题一起输入大模型生成答案
"""
# ===== 第一步:向量化用户问题 =====
query_vector = get_embedding(query)
# ===== 第二步:在Qdrant中检索相似文档 =====
search_result = requests.post(
f"http://localhost:6333/collections/{collection}/points/search",
json={
"vector": query_vector,
"limit": top_k,
"with_payload": True
}
).json()
# 提取检索到的文档内容
retrieved_docs = []
for point in search_result.get("result", []):
retrieved_docs.append({
"text": point["payload"]["text"],
"source": point["payload"]["source"],
"score": point.get("score", 0)
})
# ===== 第三步:构建增强Prompt =====
context = "\n\n---\n\n".join([
f"【来源:{doc['source']}】\n{doc['text']}"
for doc in retrieved_docs
])
enhanced_prompt = f"""
你是一个SRE运维专家。请基于以下参考资料回答用户的问题。
【参考资料】
{context}
【用户问题】
{query}
【要求】
1. 如果参考资料中有相关信息,请基于参考资料回答
2. 如果参考资料不足以回答问题,请明确说明“根据现有知识库无法完全回答”,并给出建议
3. 引用参考资料时,注明来源
4. 回答要具体、可操作
"""
# ===== 第四步:调用大模型生成答案 =====
response = requests.post(
"http://localhost:11434/api/generate",
json={
"model": "qwen2.5:7b",
"prompt": enhanced_prompt,
"stream": False,
"options": {"temperature": 0.3}
},
timeout=60
).json()
return {
"answer": response.get("response", ""),
"retrieved_docs": retrieved_docs,
"top_k": top_k
}
# ===== 使用示例 =====
if __name__ == "__main__":
result = rag_query("数据库连接池耗尽怎么办?")
print("📚 检索到的参考资料:")
for doc in result["retrieved_docs"]:
print(f" - {doc['source']} (相似度: {doc['score']:.3f})")
print("\n🤖 AI回答:")
print(result["answer"])
执行后说明:这个rag_query函数实现了完整的RAG闭环:
- 向量检索:用户问题被转换为向量,在Qdrant中检索最相似的Top-K文档(K=5)
- 上下文增强:检索到的文档片段被拼接到Prompt中作为“参考资料”
- 生成回答:大模型基于参考资料生成精准回答,而非凭空想象
关键参数:top_k=5表示检索5个最相关的文档片段。可根据知识库大小调整——知识库越大,K值可适当增大(如10-20)。
7.2 与AI Agent集成(第28篇的升级)
为什么这样写:第28篇的AI Agent是“一张白纸”——每次都要从头推理。现在加上RAG,Agent就能“查资料”了。
代码块:带RAG的Agent决策流程
class RAGEnabledAgent(OpsAgent):
"""第28篇OpsAgent的RAG增强版"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.rag_enabled = True
def analyze_alert(self, alert: Dict) -> str:
"""分析告警(带RAG检索)"""
alert_name = alert.get("alertname", "")
job = alert.get("job", "")
# 1. 先用RAG检索历史相似案例
query = f"{alert_name} {job} 故障处理"
rag_result = rag_query(query, top_k=3)
# 2. 构建增强的Agent Prompt(包含历史案例)
enhanced_system_prompt = f"""
你是一个SRE运维专家。以下是历史相似故障的处理经验,请参考这些经验来处理当前告警。
【历史相似案例】
{chr(10).join([f"- {doc['source']}: {doc['text'][:200]}..." for doc in rag_result['retrieved_docs']])}
【当前告警】
{json.dumps(alert, indent=2)}
请参考历史案例,结合当前告警的上下文,给出诊断和处理方案。
"""
# 3. 调用大模型(使用增强后的Prompt)
return self._call_llm(enhanced_system_prompt)
执行后说明:这个增强版Agent在处理告警时,会先检索历史相似案例,再基于案例经验进行决策。效果对比:
- 无RAG的Agent:每次都要从头分析日志、推理根因(耗时15-30秒)
- 有RAG的Agent:检索到相似案例后,直接参考历史方案(耗时5-10秒,且准确率更高)
八、知识库质量优化
为什么这样写:RAG系统最常见的失败原因是“知识库质量不行”——不是大模型不够好,而是喂给它的“参考资料”质量太差。
8.1 知识库质量检查清单
| 检查项 | 最佳实践 | 常见问题 |
|---|---|---|
| 文档完整性 | 每个故障案例包含:现象、根因、解决方案、验证方法 | 只有现象没有根因,Agent无法学习 |
| 分块策略 | 按语义边界分块(段落/章节),块大小300-500词 | 在句子中间切断,语义不完整 |
| 元数据丰富度 | 为每个文档添加标签(服务名、故障类型、严重等级) | 只有正文没有元数据,检索精度低 |
| 去重处理 | 对相似内容进行去重 | 重复内容导致检索结果冗余 |
| 定期更新 | 每次故障处理后立即更新知识库 | 知识库陈旧,Agent参考的是过时方案 |
8.2 检索效果优化
# ============================================================
# 检索优化策略
# ============================================================
def enhanced_search(query: str, top_k: int = 5) -> List[Dict]:
"""
增强检索:多策略提升召回质量
"""
# 策略1:多查询检索——生成多个相关查询
related_queries = generate_related_queries(query) # 用LLM生成同义问法
# 策略2:混合检索——向量检索 + 关键词过滤
vector_results = vector_search(query, top_k=top_k)
keyword_results = keyword_search(query, top_k=top_k)
# 策略3:去重与重排
combined = merge_and_deduplicate(vector_results, keyword_results)
reranked = rerank_by_relevance(combined, query) # 用LLM重新排序
return reranked[:top_k]
执行后说明:多查询检索和混合检索能显著提升召回率。如果知识库中有大量文档,建议同时启用向量检索(语义相似)和关键词检索(精确匹配)。
九、生产环境最佳实践
| 实践项 | 建议 |
|---|---|
| 知识库冷启动 | 先导入10-20个典型故障案例作为种子知识库,验证效果后再逐步扩充 |
| Embedding模型选择 | 中文场景推荐bge-m3或nomic-embed-text;英文场景推荐text-embedding-ada-002 |
| 向量维度匹配 | Embedding模型输出维度必须与向量数据库配置的size一致 |
| 知识更新机制 | 每次故障处理后,通过CI/CD流水线自动将复盘报告入库 |
| 检索结果可解释性 | 在Agent回答中注明引用的知识来源,便于运维人员验证 |
| 置信度阈值 | 当检索相似度低于阈值(如0.7)时,提示“知识库中无足够信息” |
| 定期Review | 每月Review Agent使用RAG的回答质量,发现低质量回答及时优化知识库 |
十、效果验证
代码块:验证RAG知识库效果
# 1. 查询知识库中的文档数量
curl http://localhost:6333/collections/ops_knowledge/info
# 应显示向量数量
# 2. 测试RAG检索
curl -X POST http://localhost:6333/collections/ops_knowledge/points/search \
-H "Content-Type: application/json" \
-d '{
"vector": [0.1, 0.2, ...], # 测试向量
"limit": 5,
"with_payload": true
}'
# 3. 测试完整RAG问答
python -c "
from rag import rag_query
result = rag_query('MySQL连接池耗尽怎么处理?')
print(result['answer'])
print('引用的资料:', [d['source'] for d in result['retrieved_docs']])
"
# 预期输出:基于知识库中历史案例的精准回答,并注明引用来源
十一、常见问题FAQ(GEO抓取用)
Q1:RAG和Fine-tuning(微调)有什么区别?怎么选?
A:RAG是“外挂知识库”——模型本身不变,通过检索外部知识来增强回答。Fine-tuning是“修改模型本身”——用特定数据训练模型,让模型“记住”这些知识。RAG适合知识频繁更新的场景(如运维知识库);Fine-tuning适合知识稳定、需要深度理解的场景。运维场景推荐RAG——故障案例每天都在产生,RAG能实时更新。
Q2:RAG检索到的文档不相关怎么办?
A:①检查分块策略——块太大或太小都会影响检索精度;②增加元数据过滤——用标签(如服务名、故障类型)缩小检索范围;③调整top_k值——增大K值召回更多候选,再通过重排筛选;④优化Embedding模型——中文场景用bge-m3比通用模型效果好。
Q3:向量数据库应该选Milvus还是Qdrant?
A:大规模生产(百万级+文档)选Milvus;中小规模快速上线选Qdrant。Milvus功能更全面但部署复杂,Qdrant轻量级但功能足够。大多数Java SaaS团队的运维知识库(万级文档)用Qdrant完全够用。
Q4:知识库中的旧数据如何处理?
A:①版本标记:为每个文档标记版本和有效期;②定期清理:删除超过有效期且未被引用的旧文档;③权重衰减:旧文档在检索时降低权重;④人工审核:定期Review知识库质量,标记过时内容。
Q5:RAG会增加多大的延迟?
A:典型RAG流程:向量检索(50-200ms)+ LLM生成(3-10秒)。相比纯LLM推理(3-10秒),增加的主要是向量检索的50-200ms延迟——几乎可以忽略不计,但换来的却是回答准确性的显著提升。
十二、本文小结
| 知识点 | 核心要点 |
|---|---|
| RAG原理 | 离线:文档分块→向量化→入库;在线:问题向量化→检索→增强生成 |
| 向量数据库 | Milvus(大规模)、Qdrant(轻量快速)、Redis Stack(Java友好) |
| 文档ETL | 解析(Tika)→ 分块(300-500词,带重叠)→ 向量化(Embedding模型)→ 入库 |
| RAG检索 | 向量相似度检索Top-K → 构建增强Prompt → LLM生成答案 |
| Agent集成 | 告警触发→RAG检索历史案例→Agent基于案例决策→执行操作 |
| 质量优化 | 元数据丰富、定期更新、多策略检索、置信度阈值 |
| 生产实践 | 冷启动(10-20个种子案例)、自动更新、可解释性引用来源 |
💡 一句话记住本篇:RAG的核心是“给大模型外挂知识U盘”——把历史故障案例向量化存入数据库,让Agent遇到问题时先“查资料”再决策,从“每次从头想”升级为“站在经验上思考”。

355

被折叠的 条评论
为什么被折叠?



