灰度策略配置
GRAYSCALE_CONFIG = {
"enable_percentage": 0.3, # 初始灰度 30% 流量
"target_percentage": 1.0, # 目标 100% 流量
"increment_step": 0.1, # 每次增加 10%
"check_interval_hours": 24 # 每 24 小时评估一次
}
ConversationBufferMemory 核心实现
ConversationBufferMemory 是 LangChain 提供的一种简单但强大的记忆管理方式。它将所有对话历史存储在内存中,适合对话轮次较少的场景(推荐 10-20 轮以内)。我建议在生产环境中配合消息窗口限制使用:
# memory_manager.py
from langchain.memory import ConversationBufferMemory
from langchain.schema import HumanMessage, AIMessage, SystemMessage
from typing import List, Optional
import json
import logging
logger = logging.getLogger(__name__)
class ConversationBufferMemoryManager:
"""多轮对话上下文管理器
支持:
- 自动消息窗口截断(防止 token 溢出)
- 对话历史持久化(JSON 格式)
- 上下文语义压缩
"""
def __init__(
self,
max_messages: int = 20,
max_tokens: int = 8000,
session_id: str = "default"
):
self.max_messages = max_messages
self.max_tokens = max_tokens
self.session_id = session_id
self.memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True,
output_key="answer"
)
self._message_count = 0
def add_user_message(self, message: str) -> None:
"""添加用户消息"""
self.memory.chat_memory.add_user_message(message)
self._message_count += 1
logger.info(f"[{self.session_id}] 添加用户消息 #{self._message_count}")
def add_ai_message(self, message: str) -> None:
"""添加 AI 回复"""
self.memory.chat_memory.add_ai_message(message)
def get_context(self) -> str:
"""获取格式化后的对话历史"""
return self.memory.load_memory_variables({})["chat_history"]
def trim_context(self, estimated_token_per_msg: int = 50) -> None:
"""智能截断旧消息,保留最新上下文
当消息数量超过 max_messages 或估算 token 超过 max_tokens 时触发
"""
messages = self.memory.chat_memory.messages
# 计算当前 token 估算值
total_tokens = sum(len(msg.content) // 4 for msg in messages)
if len(messages) > self.max_messages or total_tokens > self.max_tokens:
# 保留系统提示和最近的 N 条消息
system_msg = [msg for msg in messages if isinstance(msg, SystemMessage)]
recent_msgs = [msg for msg in messages if not isinstance(msg, SystemMessage)][-(self.max_messages - 1):]
self.memory.chat_memory.messages = system_msg + recent_msgs
logger.warning(
f"[{self.session_id}] 上下文截断完成,"
f"保留 {len(system_msg)} 条系统消息 + {len(recent_msgs)} 条对话"
)
def save_to_file(self, filepath: str) -> None:
"""持久化对话历史到文件"""
messages = self.memory.chat_memory.messages
data = {
"session_id": self.session_id,
"message_count": len(messages),
"messages": [
{"type": type(msg).__name__, "content": msg.content}
for msg in messages
]
}
with open(filepath, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
def clear(self) -> None:
"""清空记忆"""
self.memory.clear()
self._message_count = 0
logger.info(f"[{self.session_id}] 记忆已清空")
工厂函数,便于快速创建
def create_memory(session_id: str = "default") -> ConversationBufferMemoryManager:
"""创建对话上下文管理器实例"""
return ConversationBufferMemoryManager(
max_messages=15,
max_tokens=6000,
session_id=session_id
)
完整对话处理链路
# chat_handler.py
from langchain_openai import ChatOpenAI
from langchain.chains import LLMChain
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from config import HOLYSHEEP_CONFIG
from memory_manager import ConversationBufferMemoryManager
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class ChatHandler:
"""对话处理器 - 使用 HolySheep API"""
def __init__(self, session_id: str = "default"):
self.session_id = session_id
self.memory = ConversationBufferMemoryManager(session_id=session_id)
# 初始化 HolySheep LLM(关键配置点)
self.llm = ChatOpenAI(
base_url=HOLYSHEEP_CONFIG["base_url"],
api_key=HOLYSHEEP_CONFIG["api_key"],
model=HOLYSHEEP_CONFIG["model"],
temperature=HOLYSHEEP_CONFIG["temperature"],
max_tokens=HOLYSHEEP_CONFIG["max_tokens"]
)
# 构建带上下文的 Prompt
self.prompt = ChatPromptTemplate.from_messages([
("system", """你是一个专业的跨境电商智能客服助手。
请根据对话历史上下文,准确回答用户问题。
保持专业、耐心的服务态度。"""),
MessagesPlaceholder(variable_name="chat_history"),
("human", "{user_input}")
])
self.chain = LLMChain(llm=self.llm, prompt=self.prompt)
def chat(self, user_input: str) -> str:
"""处理单轮对话"""
try:
# 1. 添加用户消息
self.memory.add_user_message(user_input)
# 2. 上下文检查与截断
self.memory.trim_context()
# 3. 调用 HolySheep API
response = self.chain.invoke({
"user_input": user_input,
"chat_history": self.memory.get_context()
})
# 4. 添加 AI 回复
ai_response = response["text"]
self.memory.add_ai_message(ai_response)
logger.info(f"[{self.session_id}] 响应延迟: {response.get('latency', 'N/A')}ms")
return ai_response
except Exception as e:
logger.error(f"[{self.session_id}] 处理失败: {str(e)}")
return f"抱歉,处理您的请求时遇到问题:{str(e)}"
def get_conversation_summary(self) -> dict:
"""获取对话统计摘要"""
return {
"session_id": self.session_id,
"message_count": self.memory._message_count,
"context_tokens_estimate": sum(
len(msg.content) // 4
for msg in self.memory.memory.chat_memory.messages
)
}
入口文件
if __name__ == "__main__":
handler = ChatHandler(session_id="test_001")
# 模拟多轮对话
questions = [
"你好,我想咨询一下物流时效",
"从广州发到纽约大概需要几天?",
"那空运和海运分别多少钱?",
"有没有推荐的物流方案?",
"好的,我选择空运,请帮我下单"
]
for q in questions:
print(f"👤 用户: {q}")
response = handler.chat(q)
print(f"🤖 AI: {response}")
print("-" * 50)
# 打印对话统计
summary = handler.get_conversation_summary()
print(f"\n📊 对话统计: {summary}")
灰度发布与密钥轮换策略
在生产环境中,我建议采用渐进式灰度发布策略,降低迁移风险。下面是一个完整的灰度控制器实现:
# grayscale_controller.py
import time
import random
from typing import Callable
from config import GRAYSCALE_CONFIG, HOLYSHEEP_CONFIG
class GrayscaleController:
"""HolySheep API 灰度控制器"""
def __init__(self):
self.current_percentage = GRAYSCALE_CONFIG["enable_percentage"]
self.target_percentage = GRAYSCALE_CONFIG["target_percentage"]
self.increment_step = GRAYSCALE_CONFIG["increment_step"]
self.last_check_time = time.time()
self.metrics = {
"total_requests": 0,
"holysheep_requests": 0,
"success_count": 0,
"error_count": 0,
"avg_latency_ms": 0
}
def should_use_holysheep(self) -> bool:
"""判断当前请求是否应该路由到 HolySheep"""
return random.random() < self.current_percentage
def record_request(self, success: bool, latency_ms: float, use_holysheep: bool):
"""记录请求指标"""
self.metrics["total_requests"] += 1
if use_holysheep:
self.metrics["holysheep_requests"] += 1
if success:
self.metrics["success_count"] += 1
else:
self.metrics["error_count"] += 1
# 滑动平均计算延迟
n = self.metrics["total_requests"]
self.metrics["avg_latency_ms"] = (
(self.metrics["avg_latency_ms"] * (n - 1) + latency_ms) / n
)
def evaluate_and_increment(self) -> bool:
"""评估指标并决定是否增加灰度比例
返回: 是否进行了灰度调整
"""
current_time = time.time()
elapsed_hours = (current_time - self.last_check_time) / 3600
if elapsed_hours < GRAYSCALE_CONFIG["check_interval_hours"]:
return False
# 评估条件
success_rate = (
self.metrics["success_count"] /
max(self.metrics["holysheep_requests"], 1)
)
error_threshold = 0.05 # 5% 错误率阈值
if success_rate < (1 - error_threshold):
print(f"⚠️ HolySheep 错误率 {1-success_rate:.2%} 超过阈值,暂停灰度提升")
return False
if self.current_percentage < self.target_percentage:
self.current_percentage = min(
self.current_percentage + self.increment_step,
self.target_percentage
)
self.last_check_time = current_time
print(f"✅ 灰度比例提升至 {self.current_percentage:.0%}")
return True
return False
def get_report(self) -> dict:
"""生成灰度发布报告"""
return {
"current_percentage": f"{self.current_percentage:.0%}",
"total_requests": self.metrics["total_requests"],
"holysheep_requests": self.metrics["holysheep_requests"],
"success_rate": f"{self.metrics['success_count'] / max(self.metrics['total_requests'], 1):.2%}",
"avg_latency_ms": f"{self.metrics['avg_latency_ms']:.1f}ms"
}
实际使用示例
def route_request(user_id: str, grayscale: GrayscaleController):
"""请求路由示例"""
if grayscale.should_use_holysheep():
print(f"用户 {user_id} -> HolySheep API (延迟预期 <50ms)")
return "holysheep"
else:
print(f"用户 {user_id} -> 原有 API")
return "original"
上线后 30 天性能与成本数据
根据客户提供的真实数据,我们可以看到迁移后的显著改善: