一、运维知识管理的痛点
在大型组织中,运维知识往往分散在 Wiki、Runbook、Slack 记录和事故报告中。On-Call 工程师需要在多个系统间反复切换,才能定位到关键信息。RAG(Retrieval-Augmented Generation)技术为解决这一问题提供了新思路。
二、系统架构
我们基于 LangChain 框架搭建了完整的 RAG 流水线:文档经解析切分后存入 Chroma 向量数据库;当工程师提问时,系统先检索最相关的文档片段,再交由 LLM 生成回答。
三、关键技术与实现
向量嵌入模型选择 text-embedding-3-small,Chunk 大小设为 512 tokens、重叠 64 tokens。检索采用混合策略:向量相似度 + BM25 关键词加权。
LangChain RAG 流水线
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI
# 文档加载与切分
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=512,
chunk_overlap=64,
separators=["\n\n", "\n", "。", " ", ""]
)
documents = text_splitter.split_documents(raw_docs)
# 向量存储
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectordb = Chroma.from_documents(
documents=documents,
embedding=embeddings,
persist_directory="./chroma_db"
)
# 检索问答链路
qa_chain = RetrievalQA.from_chain_type(
llm=ChatOpenAI(model="gpt-4o", temperature=0),
retriever=vectordb.as_retriever(search_kwargs={"k": 5}),
return_source_documents=True
)
# 查询示例
result = qa_chain.invoke({"query": "Redis 主从切换后老数据怎么恢复?"})
print(result["result"])
python
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI
# 文档加载与切分
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=512,
chunk_overlap=64,
separators=["\n\n", "\n", "。", " ", ""]
)
documents = text_splitter.split_documents(raw_docs)
# 向量存储
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectordb = Chroma.from_documents(
documents=documents,
embedding=embeddings,
persist_directory="./chroma_db"
)
# 检索问答链路
qa_chain = RetrievalQA.from_chain_type(
llm=ChatOpenAI(model="gpt-4o", temperature=0),
retriever=vectordb.as_retriever(search_kwargs={"k": 5}),
return_source_documents=True
)
# 查询示例
result = qa_chain.invoke({"query": "Redis 主从切换后老数据怎么恢复?"})
print(result["result"])服务配置
# docker-compose.yml
version: '3.8'
services:
chroma:
image: chromadb/chroma:latest
ports:
- "8000:8000"
volumes:
- ./chroma_data:/chroma/chroma
environment:
- IS_PERSISTENT=true
- PERSIST_DIRECTORY=/chroma/chroma
deploy:
resources:
limits:
memory: 2G
rag-api:
build: .
ports:
- "8080:8080"
depends_on:
- chroma
environment:
- OPENAI_API_KEY=${OPENAI_API_KEY}
- CHROMA_HOST=chroma
- CHROMA_PORT=8000
yaml
# docker-compose.yml
version: '3.8'
services:
chroma:
image: chromadb/chroma:latest
ports:
- "8000:8000"
volumes:
- ./chroma_data:/chroma/chroma
environment:
- IS_PERSISTENT=true
- PERSIST_DIRECTORY=/chroma/chroma
deploy:
resources:
limits:
memory: 2G
rag-api:
build: .
ports:
- "8080:8080"
depends_on:
- chroma
environment:
- OPENAI_API_KEY=${OPENAI_API_KEY}
- CHROMA_HOST=chroma
- CHROMA_PORT=8000四、总结
RAG 知识库上线后,On-Call 工程师的平均故障定位时间从 45 分钟缩短到 12 分钟。后续计划加入多轮对话上下文理解与主动推荐能力。