在2025年之前,大语言模型(LLM)的“幻觉”问题始终是企业在专业场景落地AI的核心障碍——当你问“去年Q3的基金持仓变化和今年Q1的对比”,模型要么编造数据,要么直接说“无法回答”。RAG(检索增强生成)技术的出现,通过“先检索、后生成”的架构,让LLM能够从外部知识库获取事实依据,从根源上缓解了幻觉问题。然而,传统RAG的“一锤子买卖”模式——检索一次、生成一次——在面对复杂多步推理或检索结果不佳时,依然无能为力。

正是在这一背景下,将RAG系统与Agent(智能体)能力深度融合,并辅以Python全栈开发和Docker容器化部署,成为大模型应用真正走向生产环境的关键路径。

一、从RAG到Agentic RAG:为什么需要“会思考”的检索系统

1.1 传统RAG的边界

标准的RAG系统由三个核心模块组成:知识存储层(向量数据库)、检索引擎层(语义搜索与结果过滤)、生成增强层(将检索结果融入提示词)。其工作流程是:用户输入问题→向量检索→结果重排→提示工程→模型生成→响应输出。

这套架构在知识更新频率低、问题类型单一的场景下表现良好。但它的致命缺陷在于:检索器召回的内容如果与用户意图不匹配,生成器依然会基于这些不相关的上下文“硬挤答案”,而且整个过程没有任何反馈和纠错机制。

1.2 Agentic RAG:在流程中插入“检查点”

Agentic RAG的核心思路是在检索-生成链路中嵌入智能体(Agent),让它充当“质检员”和“调度员”的角色。当检索结果返回后,Agent先判断文档是否与问题相关——相关则进入生成环节,不相关则触发查询重写,再重新检索,直到拿到合格的上下文或耗尽重试次数为止。

这套机制的本质,是把单向的RAG流水线改造为具备自我修复能力的反馈闭环。用LangGraph实现的状态机可以清晰地表达这一逻辑:智能体节点决定是否检索→检索节点执行向量召回→评分节点判断相关性→通过则生成,不通过则重写查询并回到智能体重新决策。

二、Python全栈实现:从向量化到Agent调度

2.1 知识库构建与向量存储

构建RAG的第一步是将非结构化文档转化为可检索的向量。以下示例使用LangChain完成文档加载、分块和向量化存储:

from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS

# 1. 加载文档
loader = DirectoryLoader("./knowledge_base/", glob="**/*.txt")
documents = loader.load()

# 2. 分块处理(chunk_size=500,重叠50字符避免语义截断)
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50
)
texts = text_splitter.split_documents(documents)

# 3. 向量化与存储
embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
vectorstore = FAISS.from_documents(texts, embeddings)
vectorstore.save_local("./faiss_index")

分块策略直接影响检索质量:块过大可能引入噪声,块过小则丢失上下文。实践中建议根据文档类型和模型上下文窗口动态调整。

2.2 构建Agentic RAG的核心调度逻辑

Agentic RAG的关键在于状态管理。以下基于LangGraph的简化实现展示了核心流程图结构:

from langgraph.graph import StateGraph, END
from typing import TypedDict, List

class AgentState(TypedDict):
    question: str
    documents: List[str]
    rewritten_queries: List[str]
    attempts: int
    max_attempts: int

# 定义节点函数
def retrieve(state: AgentState):
    """向量检索节点"""
    query = state["rewritten_queries"][-1] if state["rewritten_queries"] else state["question"]
    docs = vectorstore.similarity_search(query, k=5)
    state["documents"] = docs
    return state

def grade_documents(state: AgentState):
    """评分节点:判断检索结果是否相关"""
    # 调用LLM对每个文档进行相关性二分类
    relevant = check_relevance(state["question"], state["documents"])
    if relevant:
        return "generate"
    else:
        return "rewrite"

def rewrite_query(state: AgentState):
    """重写节点:优化查询表述"""
    if state["attempts"] >= state["max_attempts"]:
        return "generate"
    new_query = llm.rewrite(state["question"])
    state["rewritten_queries"].append(new_query)
    state["attempts"] += 1
    return "retrieve"

def generate(state: AgentState):
    """生成最终答案"""
    context = "\n\n".join([doc.page_content for doc in state["documents"]])
    response = llm.generate(context, state["question"])
    return response

# 构建状态机
graph = StateGraph(AgentState)
graph.add_node("retrieve", retrieve)
graph.add_node("grade", grade_documents)
graph.add_node("rewrite", rewrite_query)
graph.add_node("generate", generate)

graph.set_entry_point("retrieve")
graph.add_conditional_edges("grade", grade_documents, {
    "generate": "generate",
    "rewrite": "rewrite"
})
graph.add_edge("rewrite", "retrieve")
graph.add_edge("generate", END)

这个状态机的核心价值在于:系统不会因为一次检索失败就给出错误答案,而是通过评分-重写-再检索的循环,让答案质量有了兜底保障。

三、Docker容器化部署:让RAG系统具备生产级可移植性

3.1 多容器编排架构

一个生产级的RAG系统通常包含四个服务:Web应用、LLM推理服务、向量数据库、以及可选的缓存层。Docker Compose可以一站式完成编排:

version: '3.8'
services:
  webui:
    build: ./app
    ports:
      - "8501:8501"
    environment:
      - QDRANT_HOST=http://qdrant:6333
      - OLLAMA_HOST=http://ollama:11434
    depends_on:
      - qdrant
      - ollama

  ollama:
    image: ollama/ollama:latest
    volumes:
      - ./models:/root/.ollama/models
    ports:
      - "11434:11434"
    deploy:
      resources:
        reservations:
          cpus: '2'
          memory: 8G

  qdrant:
    image: qdrant/qdrant:latest
    volumes:
      - ./qdrant_storage:/qdrant/storage
    ports:
      - "6333:6333"

  redis:
    image: redis:alpine
    ports:
      - "6379:6379"

3.2 健康检查与监控

生产环境必须建立三级监控机制:基础状态检查(docker ps)、日志实时追踪(docker logs --tail 50)、以及性能指标采集(通过Prometheus监控推理延迟,P99指标建议<500ms)。

以下为Web应用的Dockerfile示例,采用多阶段构建优化镜像体积:

# 构建阶段
FROM python:3.9-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 运行阶段
FROM python:3.9-slim
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
COPY ./app /app
CMD ["streamlit", "run", "main.py", "--server.port=8501", "--server.address=0.0.0.0"]

四、从技术栈到工程能力的融合

RAG系统与Agent的落地,远不止是调用几个API那么简单。它要求开发者具备跨层级的工程能力:在数据层,要懂得文档清洗、分块策略和向量索引优化;在模型层,要掌握提示工程、温度参数调优和模型量化(FP16/INT8减少显存占用);在部署层,要熟悉Docker网络配置、资源限制和零停机更新策略。

Python全栈能力在此体现为对LangChain、FastAPI、Streamlit等框架的熟练运用,以及对多终端适配(Web/移动端/小程序)的考量。容器化能力则保障了开发、测试、生产环境的一致性,让RAG系统真正具备“一次构建,到处运行”的可靠性。

在这个从“被动检索”到“主动决策”的演进中,技术栈的深度和工程化的广度,共同决定了一个大模型应用能否从Demo走向生产。

更多推荐