具备可测试服务及Next.js聊天功能的RAG文档助手
基于纯 Python 服务通过 HTTP 分离实现的 RAG 文档助手,对文档进行索引并标注引用片段,后端采用 FastAPI,同时配备 Next.js 开发的分屏聊天界面。
能够标注出信息来源的文档助手属于RAG产品,而非聊天机器人的界面皮肤。该版本将HTTP路由与纯Python服务分开处理,存储用于检索的嵌入向量,并通过Next.js构建带有分割式文本/引用面板的聊天界面。
目标
上传材料并对其进行索引,用有依据的片段回答问题,并在无需启动服务器的情况下让核心逻辑可通过单元测试。
后端架构
API路由仅处理HTTP请求;各类服务则负责数据导入、嵌入处理、信息检索及内容生成。这样的分离使得pytest能够在不依赖ASGI的情况下测试排序功能。
前端架构
采用Next.js与Tailwind框架:分割式面板聊天界面、共享同一API客户端的深色/浅色主题,以及可跳转至对应检索片段的引用标签。
from pypdf import PdfReader, errors
from fastapi import HTTPException, UploadFile
@router.post("/ingest")
async def ingest_pdf(file: UploadFile, settings: Settings = Depends(get_settings)):
if file.content_type != "application/pdf":
raise HTTPException(400, "Only PDF files accepted")
contents = await file.read()
try:
reader = PdfReader(BytesIO(contents))
except errors.DocumentLoadError:
# If PDF is an image-scanned file, pypdf may fail here
raise HTTPException(400, "Failed to load PDF (maybe it's scanned/image-only)")
text = ""
for page in reader.pages:
page_text = page.extract_text()
if page_text:
text += page_text + "\n"
if not text.strip():
raise HTTPException(400, "PDF contained no extractable text")
# Now text holds the raw content to index...
配置应明确清晰——嵌入器名称、索引路径及模型ID都应存储在环境变量中,而非硬编码的字符串里。
import tiktoken
ENCODING = tiktoken.get_encoding("cl100k_base")
CHUNK_SIZE = 500
CHUNK_OVERLAP = 50
def chunk_text(text: str) -> list[str]:
tokens = ENCODING.encode(text)
chunks = []
for i in range(0, len(tokens), CHUNK_SIZE - CHUNK_OVERLAP):
chunk_tokens = tokens[i : i + CHUNK_SIZE]
# Decode back to string; words may split, but overlap handles continuity
chunks.append(ENCODING.decode(chunk_tokens))
if i + CHUNK_SIZE >= len(tokens):
break
return chunks
在扩展用户界面之前先完成此步骤;在轻量级客户端环境下更容易发现检索相关错误。
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
# (In actual code, we'd use a singleton or lru_cache to avoid re-loading)
配置应明确规范——嵌入器名称、索引路径和模型编号应存储在环境变量中,而非硬编码的字符串里。
chunk_vectors = model.encode(chunks, show_progress_bar=False)
在扩展用户界面之前先完成此步骤;在轻量级客户端环境下更容易发现检索相关错误。
import httpx
HF_API_URL = "https://api-inference.huggingface.co/models/sentence-transformers/all-MiniLM-L6-v2"
async def embed_texts(texts: list[str], api_key: str) -> list[list[float]]:
headers = {"Authorization": f"Bearer {api_key}"}
async with httpx.AsyncClient() as client:
response = await client.post(
HF_API_URL,
headers=headers,
json={"inputs": texts, "options": {"wait_for_model": True}}
)
response.raise_for_status()
return response.json()
配置应明确规范——嵌入器名称、索引路径和模型编号应存储在环境变量中,而非硬编码的字符串里。
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, PointStruct
qdrant = QdrantClient(url=settings.QDRANT_URL, api_key=settings.QDRANT_API_KEY)
# Recreate the collection for a clean slate (or check if exists)
qdrant.recreate_collection(
collection_name="documents",
vector_size=384,
distance=Distance.COSINE
)
在扩展用户界面之前先完成此步骤;在轻量级客户端环境下更容易发现检索相关错误。
from qdrant_client.models import Filter, FieldCondition, MatchValue
qdrant.delete_points(
collection_name="documents",
filter=Filter(must=[FieldCondition(key="source", match=MatchValue(value=source_id))])
)
配置应明确规范——嵌入器名称、索引路径和模型编号应存储在环境变量中,而非硬编码的字符串里。
from uuid import uuid4
points = []
for chunk_text, vector in zip(chunks, chunk_vectors):
points.append(
PointStruct(
id=str(uuid4()),
vector=vector,
payload={"text": chunk_text, "source": source_id}
)
)
qdrant.upsert(collection_name="documents", points=points)
在扩展用户界面之前先完成此步骤;在轻量级客户端环境下更容易发现检索相关错误。
question_vec = model.encode([question])[0]
search_result = qdrant.search(
collection_name="documents",
query_vector=question_vec,
limit=5
)
配置应明确体现——嵌入器名称、索引路径和模型编号应存储在环境变量中,而非硬编码的字符串里。
from groq import Groq
client = Groq()
system_msg = (
"You are a knowledgeable assistant. Answer the user's question using **only** the provided context. "
"Include citations like [source:chunk_id] for any statements."
)
messages = [
{"role": "system", "content": system_msg},
{"role": "user", "content": user_question}
]
response = client.chat.completions.create(
model="llama-3.1-8b-instant",
messages=messages,
temperature=0.1
)
answer = response.choices[0].message.content
在扩展用户界面之前先完成此步骤;在轻量级客户端环境下更容易发现检索相关错误。
from fastapi import FastAPI, Depends
app = FastAPI()
@app.post("/api/v1/ingest")
async def ingest(files: list[UploadFile], settings: Settings = Depends(get_settings)):
# For each PDF: parse -> chunk -> embed -> upsert (as shown above).
return {"success": True, "indexed": len(files)}
@app.post("/api/v1/query")
async def query(q: QueryRequest, settings: Settings = Depends(get_settings)):
# q.question is the string from the user
chunks = retrieve_top_chunks(q.question) # search Qdrant
answer = call_llm(q.question, chunks) # prompt Llama
return {"answer": answer, "sources": [c["source"] for c in chunks], "chunks": chunks}
配置应明确体现——嵌入器名称、索引路径和模型编号应存储在环境变量中,而非硬编码的字符串里。
app.add_middleware(
CORSMiddleware,
allow_origins=[
"http://localhost:3000",
"https://rag-banking-health-assistant-c8f7.vercel.app",
],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
在扩展用户界面之前先完成此步骤;在轻量级客户端环境下更容易发现检索相关错误。
curl -X POST "https://api-inference.huggingface.co/models/sentence-transformers/all-MiniLM-L6-v2" \
-H "Authorization: Bearer $HF_API_KEY" \
-H "Content-Type: application/json" \
-d '{"inputs": ["test sentence"]}'
配置应明确体现——嵌入器名称、索引路径和模型编号应存储在环境变量中,而非硬编码的字符串里。
# Before (dead)
HF_API_URL = f"https://api-inference.huggingface.co/pipeline/feature-extraction/{MODEL_NAME}"
# After (working)
HF_API_URL = f"https://router.huggingface.co/hf-inference/models/{MODEL_NAME}/pipeline/feature-extraction"
在扩展用户界面之前先完成此步骤;在轻量级客户端环境下更容易发现检索相关错误。
class Settings(BaseSettings):
QDRANT_URL: str
QDRANT_API_KEY: str
GROQ_API_KEY: str
HF_API_KEY: str
class Config:
env_file = ".env"
配置应明确标注——嵌入器名称、索引路径和模型编号应存储在环境变量中,而非硬编码的字符串里。
评估
固定二十个带有预期分片编号的问题,统计命中率及引用情况。界面优化无法解决错误的top-k结果。
部署注意事项
如果数据摄入量较大,应分别运行API和服务进程。当向量存储无法访问时,健康检查也应失败,而不仅仅是在HTTP连接正常时。
总结
明确各组件的边界——路由与服务、获取与生成、界面与API——这样才能将周末时的RAG演示转化为团队可测试和实际使用的系统。
在嵌入器编号旁边同步更新API契约版本。
为单元测试之需,应将HTTP处理程序与纯服务分开。
深色/浅色界面主题不得改变数据检索逻辑。
记录获取编号及对话轮次,以便日后排查问题。
按照数据源变化频率定期重建索引。
当核心模块表现不佳时拒绝处理请求。
在嵌入器标识旁标注API合约版本号。
为单元测试将HTTP处理程序与纯服务分离。
深色/浅色UI主题不得改变数据检索逻辑。
将获取标识与聊天轮次一同记录,以便后续分类处理。
按照数据源变化频率定期重建索引。
当核心模块表现不佳时拒绝处理请求。
在嵌入器标识旁标注API合约版本号。
为单元测试将HTTP处理程序与纯服务分离。
深色/浅色UI主题不得改变数据检索逻辑。
将获取标识与聊天轮次一同记录,以便后续分类处理。
按照数据源变化频率定期重建索引。
当核心模块表现不佳时拒绝处理请求。
在嵌入器标识旁标注API合约版本号。
为单元测试将HTTP处理程序与纯服务分离。
深色/浅色 UI 主题不得拆分检索逻辑。
将获取的 ID 与聊天轮次一起记录,以便日后分类处理。
按照数据源变化频率定期重建索引。
当核心部分表现不佳时拒绝处理。
在嵌入器 ID 旁边标注 API 接口版本。
为单元测试将 HTTP 处理程序与纯服务分离。
深色/浅色 UI 主题不得拆分检索逻辑。
将获取的 ID 与聊天轮次一起记录,以便日后分类处理。
按照数据源变化频率定期重建索引。
当核心部分表现不佳时拒绝处理。
在嵌入器 ID 旁边标注 API 接口版本。
为单元测试将 HTTP 处理程序与纯服务分离。
深色/浅色 UI 主题不得拆分检索逻辑。
将获取的 ID 与聊天轮次一起记录,以便日后分类处理。
按照数据源变化频率定期重建索引。
当核心部分表现不佳时拒绝处理。
在嵌入器标识旁标注 API 接口版本。
为单元测试将 HTTP 处理程序与纯服务分离。
深色/浅色 UI 主题不得拆分数据检索逻辑。
记录数据获取编号及对话轮次,以便后续分类处理。
根据数据源变化频率定期重建索引。
当核心数据段表现不佳时拒绝处理。
在嵌入器标识旁标注 API 接口版本。
为单元测试将 HTTP 处理程序与纯服务分离。
深色/浅色 UI 主题不得拆分数据检索逻辑。
记录数据获取编号及对话轮次,以便后续分类处理。
根据数据源变化频率定期重建索引。
当核心数据段表现不佳时拒绝处理。
在嵌入器标识旁标注 API 接口版本。
为单元测试将 HTTP 处理程序与纯服务分离。
深色/浅色 UI 主题不得拆分数据检索逻辑。
记录数据获取编号及对话轮次,以便后续分类处理。
按照数据源变化频率定期重建索引。
当核心模块表现不佳时拒绝处理请求。
在嵌入器标识旁标注API合约版本号。
为单元测试将HTTP处理程序与纯服务分离。
深色/浅色UI主题不得改变数据检索逻辑。
将获取标识与聊天轮次一同记录,以便后续分类处理。
按照数据源变化频率定期重建索引。
当核心模块表现不佳时拒绝处理请求。
在嵌入器标识旁标注API合约版本号。
为单元测试将HTTP处理程序与纯服务分离。
深色/浅色UI主题不得改变数据检索逻辑。
将获取标识与聊天轮次一同记录,以便后续分类处理。
按照数据源变化频率定期重建索引。
当核心模块表现不佳时拒绝处理请求。
在嵌入器标识旁标注API合约版本号。
为单元测试将HTTP处理程序与纯服务分离。
深色/浅色界面主题不得改变数据获取逻辑。
将日志获取编号与聊天轮次记录下来,以便日后分类处理。
根据数据源的变化频率定期重建索引。
当核心数据段表现不佳时拒绝处理。
在导入和部署变更时,同时保留相关配置、负责人及回滚说明。
在导入和部署变更时,同时保留相关配置、负责人及回滚说明。
在导入和部署变更时,同时保留相关配置、负责人及回滚说明。
在导入和部署变更时,同时保留相关配置、负责人及回滚说明。
在导入和部署变更时,同时保留相关配置、负责人及回滚说明。
在导入和部署变更时,同时保留相关配置、负责人及回滚说明。
在导入和部署变更时,同时保留相关配置、负责人及回滚说明。
在导入和部署变更时,同时保留相关配置、负责人及回滚说明。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。
在导入和部署变更时,需将相关配置项、负责人以及回滚说明一并保存。