📚 为什么需要最佳实践?

构建 AI Agent 不仅仅是调用 API,更重要的是工程化。 根据 LangChain 官方文档,"可靠的 Agent 来自于优秀的上下文工程, 而非仅仅依赖模型能力"。

💡 核心原则
原则 说明 收益
上下文优先 优化提示词和上下文,而非升级模型 更高的准确率,更低的成本
分层防护 多层 Guardrails 确保安全性 防止 PII 泄露和恶意攻击
渐进式优化 从简单开始,逐步增加复杂性 降低开发风险,便于调试
可观测性 完善的日志、监控和追踪 快速定位问题,持续改进
成本意识 合理选择模型,优化 Token 使用 降低运营成本 50%+

🎯 上下文工程(Context Engineering)

上下文工程是 AI 工程师的首要任务, 指的是"以正确的格式提供正确的信息和工具,使 LLM 能够完成任务"。

核心技术

1. 动态系统提示词

Python 🟡 中级
"""
动态系统提示词示例
根据用户状态和偏好调整提示词
"""
from langchain.agents import create_agent

def generate_system_prompt(user_context: dict) -> str:
    """根据用户上下文生成个性化提示词"""

    base_prompt = "你是一个专业的 AI 助手。\n\n"

    # 根据对话长度调整详细程度
    conversation_length = user_context.get("message_count", 0)
    if conversation_length < 3:
        base_prompt += "请提供详细的解释和背景信息。\n"
    else:
        base_prompt += "用户已经了解基础知识,请简明扼要地回答。\n"

    # 根据用户角色调整权限
    user_role = user_context.get("role", "guest")
    if user_role == "admin":
        base_prompt += "你可以访问管理功能和敏感数据。\n"
    elif user_role == "user":
        base_prompt += "你只能访问用户级别的功能。\n"

    # 根据用户偏好调整风格
    preferences = user_context.get("preferences", {})
    language = preferences.get("language", "zh-CN")
    formality = preferences.get("formality", "professional")

    if formality == "casual":
        base_prompt += "使用轻松、友好的语气。\n"
    else:
        base_prompt += "保持专业、正式的语气。\n"

    # 添加合规要求
    if user_context.get("requires_compliance"):
        base_prompt += "\n重要:遵守 GDPR 和数据隐私法规,不得泄露用户个人信息。\n"

    return base_prompt

# 使用示例
user_context = {
    "message_count": 5,
    "role": "user",
    "preferences": {"language": "zh-CN", "formality": "casual"},
    "requires_compliance": True
}

agent = create_agent(
    model="gpt-4o",
    tools=[...],
    system_prompt=generate_system_prompt(user_context)
)

2. 智能工具选择

Python 🔴 高级
"""
动态工具选择
根据用户状态和权限过滤可用工具
"""
from langchain.tools import tool
from typing import Literal

# 定义所有工具
@tool
def public_search(query: str) -> str:
    """公开搜索工具(所有用户可用)"""
    return f"搜索结果:{query}"

@tool
def private_database_query(query: str) -> str:
    """私有数据库查询(仅认证用户)"""
    return f"数据库结果:{query}"

@tool
def admin_delete_user(user_id: str) -> str:
    """删除用户(仅管理员)"""
    return f"已删除用户:{user_id}"

@tool
def premium_analysis(data: str) -> str:
    """高级分析(仅付费用户)"""
    return f"分析结果:{data}"

# 工具选择逻辑
def select_tools_for_user(
    user_role: Literal["guest", "user", "premium", "admin"],
    is_authenticated: bool
) -> list:
    """根据用户角色和认证状态选择工具"""

    # 基础工具(所有人可用)
    available_tools = [public_search]

    # 认证用户工具
    if is_authenticated:
        available_tools.append(private_database_query)

    # 付费用户工具
    if user_role in ["premium", "admin"]:
        available_tools.append(premium_analysis)

    # 管理员工具
    if user_role == "admin":
        available_tools.append(admin_delete_user)

    return available_tools

# 使用示例
tools_for_guest = select_tools_for_user("guest", is_authenticated=False)
print(f"访客可用工具:{[t.name for t in tools_for_guest]}")
# 输出:['public_search']

tools_for_admin = select_tools_for_user("admin", is_authenticated=True)
print(f"管理员可用工具:{[t.name for t in tools_for_admin]}")
# 输出:['public_search', 'private_database_query', 'premium_analysis', 'admin_delete_user']

# 创建 Agent
agent = create_agent(
    model="gpt-4o",
    tools=tools_for_admin,  # 动态选择的工具
    system_prompt="..."
)

3. 上下文注入

Python 🟡 中级
"""
上下文注入示例
在对话中动态注入相关信息
"""
def inject_context_messages(
    user_messages: list,
    uploaded_files: list = None,
    user_preferences: dict = None
) -> list:
    """在用户消息中注入上下文信息"""

    enriched_messages = []

    # 添加用户偏好上下文
    if user_preferences:
        context_msg = {
            "role": "system",
            "content": f"用户偏好:{user_preferences}"
        }
        enriched_messages.append(context_msg)

    # 添加文件上下文
    if uploaded_files:
        for file in uploaded_files:
            file_context = {
                "role": "system",
                "content": f"用户上传了文件:{file['name']}\n内容摘要:{file['summary']}"
            }
            enriched_messages.append(file_context)

    # 添加用户消息
    enriched_messages.extend(user_messages)

    return enriched_messages

# 使用示例
user_messages = [
    {"role": "user", "content": "分析这个文件"}
]

uploaded_files = [
    {"name": "sales_data.csv", "summary": "2024年销售数据,包含1000条记录"}
]

user_preferences = {
    "analysis_depth": "detailed",
    "chart_type": "bar"
}

final_messages = inject_context_messages(
    user_messages,
    uploaded_files=uploaded_files,
    user_preferences=user_preferences
)

# final_messages 将包含系统消息 + 文件上下文 + 用户消息
result = agent.invoke({"messages": final_messages})
✅ 上下文工程最佳实践
  1. 从简单开始:先用静态提示词和工具,再逐步引入动态性
  2. 迭代测试:每次添加一个上下文特性,测量影响
  3. 监控性能:追踪模型调用次数、Token 使用量、延迟
  4. 利用中间件:使用 SummarizationMiddleware、LLMToolSelectorMiddleware 等
  5. 理解持久性:模型上下文是临时的,状态变化是持久的

🛡️ Guardrails 安全防护

Guardrails(安全防护栏)是在 Agent 执行关键点验证和过滤内容的安全机制, 帮助构建安全、合规的 AI 应用。

常见应用场景

  • 防止 PII(个人身份信息)泄露
  • 检测和阻止提示词注入攻击
  • 过滤不当或有害内容
  • 执行业务规则和合规要求
  • 验证输出质量和准确性

两种实现方式

类型 特点 适用场景
确定性 Guardrails 基于规则(正则、关键词)
快速、可预测、成本低
PII 检测、格式验证、关键词过滤
模型化 Guardrails 使用 LLM 或分类器
语义理解、成本较高
内容安全性、情感分析、细微违规检测

内置 Guardrails

PII 检测和处理

Python 🟡 中级
"""
PII 检测中间件
自动检测和处理个人身份信息
"""
from langchain.agents.middleware import PIIMiddleware
from langchain.agents import create_agent

# PII 处理策略
pii_middleware = PIIMiddleware(
    # 检测类型
    pii_types=[
        "email",           # 电子邮件
        "credit_card",     # 信用卡号
        "ip_address",      # IP 地址
        "phone_number",    # 电话号码
        "ssn",            # 社会保障号
    ],

    # 处理策略
    strategy="redact",  # 选项:redact, mask, hash, block

    # 自定义模式(正则表达式)
    custom_patterns={
        "chinese_id": r"\d{17}[\dXx]",  # 中国身份证号
        "bank_card": r"\d{16,19}",      # 银行卡号
    }
)

agent = create_agent(
    model="gpt-4o",
    tools=[...],
    middleware=[pii_middleware],
    system_prompt="你是客服助手。注意保护用户隐私信息。"
)

# 测试
result = agent.invoke({
    "messages": [{
        "role": "user",
        "content": "我的邮箱是 [email protected],电话是 13812345678"
    }]
})

# PII 会被自动处理:
# "我的邮箱是 [REDACTED_EMAIL],电话是 [REDACTED_PHONE_NUMBER]"

内容安全检查

Python 🔴 高级
"""
自定义内容安全 Guardrail
使用模型检查输出内容安全性
"""
from langchain.agents.middleware import CustomMiddleware
from langchain_openai import ChatOpenAI

class ContentSafetyGuardrail(CustomMiddleware):
    """内容安全检查中间件"""

    def __init__(self):
        self.safety_checker = ChatOpenAI(model="gpt-4o-mini")

    def after_agent(self, state, config):
        """Agent 执行后检查输出安全性"""
        last_message = state["messages"][-1]

        # 跳过工具调用消息
        if not hasattr(last_message, "content"):
            return state

        content = last_message.content

        # 使用模型检查安全性
        safety_prompt = f"""
        请评估以下 AI 回答是否安全、合规:

        {content}

        评估标准:
        1. 不包含有害、暴力、歧视性内容
        2. 不泄露敏感信息
        3. 符合道德和法律要求

        请回答:"安全" 或 "不安全:[原因]"
        """

        response = self.safety_checker.invoke(safety_prompt)
        result = response.content.strip()

        if not result.startswith("安全"):
            # 不安全,替换为安全消息
            state["messages"][-1].content = "抱歉,我无法提供该信息。请换一个问题。"

        return state

# 使用
agent = create_agent(
    model="gpt-4o",
    tools=[...],
    middleware=[ContentSafetyGuardrail()],
)

分层防护策略

Python 🔴 高级
"""
多层 Guardrails 组合
构建深度防御体系
"""
from langchain.agents import create_agent
from langchain.agents.middleware import (
    PIIMiddleware,
    HumanInTheLoopMiddleware,
    CustomMiddleware
)

# 第 1 层:输入验证(确定性)
class InputValidationGuardrail(CustomMiddleware):
    """验证输入格式和长度"""

    def before_agent(self, state, config):
        last_message = state["messages"][-1]
        content = last_message.get("content", "")

        # 检查长度
        if len(content) > 5000:
            raise ValueError("输入过长,请控制在 5000 字符以内")

        # 检查禁用词
        forbidden_words = ["hack", "exploit", "jailbreak"]
        if any(word in content.lower() for word in forbidden_words):
            raise ValueError("输入包含不允许的内容")

        return state

# 第 2 层:PII 保护
pii_guardrail = PIIMiddleware(
    pii_types=["email", "phone_number", "credit_card"],
    strategy="redact"
)

# 第 3 层:敏感操作审核
hitl_guardrail = HumanInTheLoopMiddleware(
    interrupt_on={
        "delete_data": True,
        "send_email": True,
        "make_payment": True,
    }
)

# 第 4 层:输出安全检查(模型化)
output_safety_guardrail = ContentSafetyGuardrail()

# 组合所有 Guardrails
agent = create_agent(
    model="gpt-4o",
    tools=[...],
    middleware=[
        InputValidationGuardrail(),   # 第 1 层
        pii_guardrail,                # 第 2 层
        hitl_guardrail,               # 第 3 层
        output_safety_guardrail,      # 第 4 层
    ],
    checkpointer=checkpointer,  # HITL 需要
    system_prompt="..."
)

# 这样构建了完整的安全防护体系

⚡ 性能优化策略

优化清单

优化项 方法 预期提升
模型选择 简单任务用 GPT-3.5,复杂任务用 GPT-4 成本降低 50%,速度提升 3x
Token 优化 精简提示词,摘要历史对话 成本降低 30%
并行调用 使用 RunnableParallel 并发执行 延迟降低 60%
缓存 缓存 FAQ、Embeddings、工具结果 响应时间减少 70%
流式输出 启用 stream_mode="messages" 首字延迟减少 80%
向量索引 使用 HNSW 索引,优化检索 检索速度提升 10x

智能模型路由

Python 🔴 高级
"""
动态模型选择
根据任务复杂度选择合适的模型
"""
from langchain_openai import ChatOpenAI
from langchain.agents.middleware import CustomMiddleware

class SmartModelRouter(CustomMiddleware):
    """智能模型路由中间件"""

    def __init__(self):
        self.cheap_model = ChatOpenAI(model="gpt-3.5-turbo")
        self.expensive_model = ChatOpenAI(model="gpt-4o")

    def before_model(self, state, config):
        """根据任务选择模型"""
        last_message = state["messages"][-1]
        content = last_message.get("content", "")

        # 简单任务标识
        simple_keywords = ["你好", "谢谢", "再见", "什么时候", "多少钱"]
        is_simple = any(kw in content for kw in simple_keywords)

        # 复杂任务标识
        complex_keywords = ["分析", "解释", "设计", "规划", "对比"]
        is_complex = any(kw in content for kw in complex_keywords)

        # 选择模型
        if is_simple:
            config["model"] = self.cheap_model
            print("🟢 使用 GPT-3.5-turbo(简单任务)")
        elif is_complex:
            config["model"] = self.expensive_model
            print("🔴 使用 GPT-4o(复杂任务)")
        else:
            # 默认使用便宜模型
            config["model"] = self.cheap_model
            print("🟡 使用 GPT-3.5-turbo(默认)")

        return state

# 使用
agent = create_agent(
    model="gpt-4o",  # 默认模型
    tools=[...],
    middleware=[SmartModelRouter()],
)

Token 优化技巧

Python 🟡 中级
"""
Token 优化示例
减少不必要的 Token 消耗
"""
from langchain.agents.middleware import SummarizationMiddleware

# 1. 使用摘要中间件
summarization = SummarizationMiddleware(
    max_messages=10,  # 保留最近 10 条消息
    summarize_older=True  # 摘要旧消息
)

# 2. 精简系统提示词
# ❌ 冗长的提示词
bad_prompt = """
你是一个非常专业且经验丰富的客服助手。
你需要帮助用户解决各种各样的问题,包括但不限于...
请始终保持礼貌、耐心、友好的态度...
(省略 500 字)
"""

# ✅ 精简的提示词
good_prompt = """
你是专业客服助手。
职责:解答问题、查询订单、处理售后。
原则:礼貌、准确、及时。
"""

# 3. 限制对话历史长度
def trim_conversation_history(messages: list, max_messages: int = 20) -> list:
    """保留最近的 N 条消息"""
    if len(messages) <= max_messages:
        return messages

    # 保留系统消息 + 最近的用户/AI 消息
    system_messages = [m for m in messages if m["role"] == "system"]
    recent_messages = messages[-max_messages:]

    return system_messages + recent_messages

# 4. 使用更小的 Embedding 模型
from langchain_openai import OpenAIEmbeddings

# text-embedding-3-small: 512 维,成本更低
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

💰 成本控制建议

成本分析

成本项 占比 优化策略
模型调用 60-70% 选择合适模型、减少调用次数、缓存结果
Embeddings 15-20% 使用更小模型、批量处理、缓存向量
向量数据库 10-15% 选择开源方案(Chroma)、优化索引大小
其他基础设施 5-10% 使用 Serverless、按需扩缩容

成本优化实践

Python 🔴 高级
"""
成本优化完整示例
"""
import functools
from datetime import datetime, timedelta

# 1. 结果缓存
cache = {}

def cache_result(ttl_seconds: int = 3600):
    """缓存装饰器"""
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            cache_key = f"{func.__name__}:{args}:{kwargs}"

            # 检查缓存
            if cache_key in cache:
                result, timestamp = cache[cache_key]
                if datetime.now() - timestamp < timedelta(seconds=ttl_seconds):
                    print(f"💰 使用缓存结果:{func.__name__}")
                    return result

            # 执行函数
            result = func(*args, **kwargs)

            # 保存缓存
            cache[cache_key] = (result, datetime.now())
            return result

        return wrapper
    return decorator

# 2. FAQ 缓存
@cache_result(ttl_seconds=3600)  # 缓存 1 小时
def search_faq_cached(query: str) -> str:
    """带缓存的 FAQ 搜索"""
    return search_faq(query)

# 3. 批量 Embedding
def batch_embed_documents(texts: list[str], batch_size: int = 100):
    """批量生成 Embeddings,降低成本"""
    embeddings_model = OpenAIEmbeddings(model="text-embedding-3-small")

    all_embeddings = []
    for i in range(0, len(texts), batch_size):
        batch = texts[i:i + batch_size]
        batch_embeddings = embeddings_model.embed_documents(batch)
        all_embeddings.extend(batch_embeddings)

    return all_embeddings

# 4. 限流保护
import time
from collections import deque

class RateLimiter:
    """简单的限流器"""

    def __init__(self, max_requests: int, time_window: int):
        self.max_requests = max_requests
        self.time_window = time_window
        self.requests = deque()

    def allow_request(self) -> bool:
        """检查是否允许请求"""
        now = time.time()

        # 清理过期请求
        while self.requests and self.requests[0] < now - self.time_window:
            self.requests.popleft()

        # 检查限制
        if len(self.requests) >= self.max_requests:
            return False

        # 记录请求
        self.requests.append(now)
        return True

# 使用限流器
rate_limiter = RateLimiter(max_requests=100, time_window=60)  # 每分钟 100 次

def process_request(user_message: str):
    if not rate_limiter.allow_request():
        return "请求过于频繁,请稍后再试"

    # 处理请求
    return agent.invoke({"messages": [{"role": "user", "content": user_message}]})

# 5. 成本监控
def track_cost(num_input_tokens: int, num_output_tokens: int, model: str):
    """追踪成本"""
    # GPT-4o 定价(示例)
    pricing = {
        "gpt-4o": {"input": 0.00001, "output": 0.00003},  # 每 token 价格
        "gpt-3.5-turbo": {"input": 0.000001, "output": 0.000002},
    }

    price = pricing.get(model, pricing["gpt-4o"])
    cost = num_input_tokens * price["input"] + num_output_tokens * price["output"]

    print(f"💸 本次调用成本:${cost:.6f}")
    return cost

📊 监控和可观测性

使用 LangSmith 进行全面的追踪、监控和调试。

LangSmith 集成

Python 🟢 基础
"""
LangSmith 追踪配置
"""
import os

# 配置 LangSmith
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "your-api-key"
os.environ["LANGCHAIN_PROJECT"] = "customer-service-bot"  # 项目名称

# 所有 Agent 调用都会自动追踪
result = agent.invoke({"messages": [...]})

# 查看追踪:https://smith.langchain.com/

关键指标监控

指标类型 具体指标 目标值
性能指标 P50/P95/P99 延迟
首字延迟(TTFT)
P95 < 3s
TTFT < 1s
质量指标 任务完成率
用户满意度
> 85%
> 4.0/5.0
成本指标 每次对话成本
Token 使用效率
< $0.10
Token/回答 < 1000
可靠性指标 错误率
超时率
< 1%
< 2%

自定义日志

Python 🟡 中级
"""
结构化日志记录
"""
import logging
import json
from datetime import datetime

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger("customer-service")

class LoggingMiddleware(CustomMiddleware):
    """日志记录中间件"""

    def before_agent(self, state, config):
        """记录请求开始"""
        user_message = state["messages"][-1].get("content", "")

        log_data = {
            "event": "agent_request",
            "timestamp": datetime.now().isoformat(),
            "user_id": config.get("context", {}).get("user_id"),
            "message_preview": user_message[:100],
        }

        logger.info(json.dumps(log_data, ensure_ascii=False))
        return state

    def after_agent(self, state, config):
        """记录响应完成"""
        ai_message = state["messages"][-1]

        log_data = {
            "event": "agent_response",
            "timestamp": datetime.now().isoformat(),
            "user_id": config.get("context", {}).get("user_id"),
            "has_tool_calls": hasattr(ai_message, "tool_calls") and bool(ai_message.tool_calls),
            "response_length": len(ai_message.content) if hasattr(ai_message, "content") else 0,
        }

        logger.info(json.dumps(log_data, ensure_ascii=False))
        return state

# 使用
agent = create_agent(
    model="gpt-4o",
    tools=[...],
    middleware=[LoggingMiddleware()],
)

🧪 测试策略

测试金字塔

graph TB A[E2E 测试
10%] --> B[集成测试
30%] B --> C[单元测试
60%] A1[完整对话流程
真实场景测试] -.-> A B1[Agent + 工具
模拟 LLM] -.-> B C1[工具函数
边界条件] -.-> C style A fill:#ef4444,color:#fff style B fill:#f59e0b,color:#fff style C fill:#10b981,color:#fff

单元测试示例

Python 🟢 基础
"""
工具单元测试
"""
import pytest
from unittest.mock import Mock

def test_get_my_orders():
    """测试订单查询工具"""
    # 模拟 Runtime
    mock_runtime = Mock()
    mock_runtime.context = {"user_id": "user_123"}

    # 调用工具
    result = get_my_orders.invoke({"runtime": mock_runtime})

    # 断言
    assert "订单" in result
    assert "user_123" in result or len(result) > 0

def test_search_faq_with_valid_query():
    """测试 FAQ 搜索(有效查询)"""
    result = search_faq.invoke({"query": "配送时间"})

    assert "配送" in result or "工作日" in result
    assert len(result) > 0

def test_search_faq_with_invalid_query():
    """测试 FAQ 搜索(无效查询)"""
    result = search_faq.invoke({"query": "askdjflkajsdf"})

    assert "没有找到" in result or "抱歉" in result

def test_cancel_order_without_permission():
    """测试取消订单(无权限)"""
    mock_runtime = Mock()
    mock_runtime.context = {"user_id": "wrong_user"}

    result = cancel_order.invoke({
        "order_id": "ORDER-2024001",
        "reason": "测试",
        "runtime": mock_runtime
    })

    assert "未找到" in result or "无法取消" in result

集成测试示例

Python 🟡 中级
"""
Agent 集成测试(模拟 LLM)
"""
import pytest
from unittest.mock import patch

@patch('langchain_openai.ChatOpenAI.invoke')
def test_agent_faq_flow(mock_llm):
    """测试 FAQ 查询流程"""
    # 模拟 LLM 返回工具调用
    mock_llm.return_value = Mock(
        content="",
        tool_calls=[{
            "name": "search_faq",
            "args": {"query": "配送时间"},
            "id": "call_123"
        }]
    )

    # 创建 Agent
    agent = create_agent(
        model="gpt-4o",
        tools=[search_faq],
    )

    # 调用
    result = agent.invoke({
        "messages": [{"role": "user", "content": "多久能收到货?"}]
    })

    # 验证工具被调用
    assert any("配送" in str(msg) for msg in result["messages"])

def test_agent_with_checkpointer():
    """测试多轮对话(真实 Agent)"""
    from langgraph.checkpoint.memory import InMemorySaver

    checkpointer = InMemorySaver()
    agent = create_agent(
        model="gpt-3.5-turbo",  # 使用便宜模型测试
        tools=[get_my_orders],
        checkpointer=checkpointer,
    )

    config = {"configurable": {"thread_id": "test_001"}}

    # 第一轮对话
    result1 = agent.invoke(
        {"messages": [{"role": "user", "content": "你好"}]},
        config=config
    )

    # 第二轮对话(应该记住上下文)
    result2 = agent.invoke(
        {"messages": [{"role": "user", "content": "我刚才说了什么?"}]},
        config=config
    )

    # 验证对话历史
    assert len(result2["messages"]) > 2  # 包含历史消息

🚀 生产环境配置

完整配置示例

Python 🔴 高级 - 生产级
"""
生产环境 Agent 配置
包含所有最佳实践
"""
import os
from langchain.agents import create_agent
from langchain.agents.middleware import (
    PIIMiddleware,
    HumanInTheLoopMiddleware,
    SummarizationMiddleware,
)
from langgraph.checkpoint.postgres import PostgresSaver
from langgraph.store.postgres import PostgresStore

# ==================== 环境配置 ====================

# 数据库连接
DB_URI = os.getenv("DATABASE_URL")
assert DB_URI, "DATABASE_URL 环境变量未设置"

# LangSmith 追踪
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = os.getenv("LANGSMITH_API_KEY")
os.environ["LANGCHAIN_PROJECT"] = "production-customer-service"

# ==================== 持久化配置 ====================

with PostgresSaver.from_conn_string(DB_URI) as checkpointer:
    checkpointer.setup()

    with PostgresStore.from_conn_string(DB_URI) as store:
        store.setup()

        # ==================== 中间件配置 ====================

        # PII 保护
        pii_middleware = PIIMiddleware(
            pii_types=["email", "phone_number", "credit_card", "ip_address"],
            strategy="redact",
            custom_patterns={
                "chinese_id": r"\d{17}[\dXx]",
                "bank_card": r"\d{16,19}",
            }
        )

        # 对话摘要
        summarization = SummarizationMiddleware(
            max_messages=20,
            summarize_older=True
        )

        # 敏感操作审核
        hitl = HumanInTheLoopMiddleware(
            interrupt_on={
                "cancel_order": True,
                "refund_order": True,
                "delete_user_data": True,
            }
        )

        # 自定义中间件
        logging_middleware = LoggingMiddleware()
        content_safety = ContentSafetyGuardrail()

        # ==================== 创建 Agent ====================

        production_agent = create_agent(
            model="gpt-4o",
            tools=all_production_tools,  # 所有工具
            middleware=[
                logging_middleware,      # 日志
                pii_middleware,          # PII 保护
                summarization,           # 摘要
                hitl,                    # 人工介入
                content_safety,          # 内容安全
            ],
            checkpointer=checkpointer,   # PostgreSQL 持久化
            store=store,                 # PostgreSQL Store
            context_schema=CustomerContext,
            system_prompt=generate_production_prompt(),  # 动态提示词
        )

        # ==================== 监控和告警 ====================

        def invoke_with_monitoring(user_message: str, user_id: str, thread_id: str):
            """带监控的调用"""
            import time

            start_time = time.time()

            try:
                config = {
                    "configurable": {"thread_id": thread_id},
                    "context": {"user_id": user_id}
                }

                result = production_agent.invoke(
                    {"messages": [{"role": "user", "content": user_message}]},
                    config=config
                )

                # 记录成功
                latency = time.time() - start_time
                logger.info(json.dumps({
                    "event": "agent_success",
                    "user_id": user_id,
                    "latency": latency,
                }))

                return result

            except Exception as e:
                # 记录错误
                logger.error(json.dumps({
                    "event": "agent_error",
                    "user_id": user_id,
                    "error": str(e),
                }))

                # 发送告警
                # send_alert(f"Agent error: {e}")

                # 返回友好错误消息
                return {
                    "messages": [{
                        "role": "assistant",
                        "content": "抱歉,系统遇到了一些问题。请稍后再试或联系客服。"
                    }]
                }

        # ==================== 健康检查 ====================

        def health_check():
            """健康检查端点"""
            checks = {
                "database": check_database_connection(DB_URI),
                "model": check_model_availability(),
                "vector_store": check_vector_store(),
            }

            all_healthy = all(checks.values())

            return {
                "status": "healthy" if all_healthy else "unhealthy",
                "checks": checks
            }

❓ 常见问题

Q1: 如何平衡成本和质量?

分层策略

  • 简单任务(FAQ、问候)→ GPT-3.5-turbo
  • 中等任务(订单查询、数据分析)→ GPT-4o-mini
  • 复杂任务(复杂推理、创作)→ GPT-4o
  • 使用缓存避免重复调用
  • 监控每个任务的实际成本

Q2: Guardrails 会影响性能吗?

确定性 Guardrails(正则、关键词)几乎无影响(<5ms)
模型化 Guardrails(使用 LLM)会增加延迟和成本

建议

  • 输入验证使用确定性方法
  • 输出验证使用快速的小模型(gpt-4o-mini)
  • 异步执行非关键检查

Q3: 如何调试生产环境的问题?

  1. 启用 LangSmith:查看完整的执行轨迹
  2. 结构化日志:记录关键事件和参数
  3. 保存失败案例:自动保存错误的输入和输出
  4. 本地复现:使用相同的 thread_id 和输入复现问题
  5. A/B 测试:对比不同配置的效果

Q4: 提示词工程的优先级?

优化顺序

  1. 明确任务:清晰定义 Agent 的职责范围
  2. 提供示例:Few-shot examples 最有效
  3. 结构化输出:使用 JSON Schema 约束格式
  4. 动态上下文:注入相关信息
  5. 精简语言:去除冗余,节省 Token

Q5: 什么时候应该重构?

出现以下信号时考虑重构:

  • 单次调用成本 > $0.50
  • P95 延迟 > 10 秒
  • 错误率 > 5%
  • 用户满意度 < 3.5/5.0
  • 提示词超过 2000 tokens
  • 工具数量 > 20 个

📖 参考资源