3.4 序列化与序列


文档摘要

3.4 序列化与序列 — LangChain框架精通数据持久化(上) 本节导读:掌握LangChain的序列化和持久化技术,实现AI应用数据的保存、加载和版本管理,确保应用的连续性和可维护性。 学习目标 理解序列化和持久化的重要性和应用场景 掌握LangChain内置序列化方法的使用 学会自定义序列化器和反序列化逻辑 实现链式系统的状态保存和恢复 构建可扩展的数据版本管理系统 核心概念 序列化是将数据结构转换为可存储或传输的格式的过程,序列化则是反向过程。

3.4 序列化与序列 — LangChain框架精通数据持久化(上)

本节导读:掌握LangChain的序列化和持久化技术,实现AI应用数据的保存、加载和版本管理,确保应用的连续性和可维护性。

学习目标

  • 理解序列化和持久化的重要性和应用场景
  • 掌握LangChain内置序列化方法的使用
  • 学会自定义序列化器和反序列化逻辑
  • 实现链式系统的状态保存和恢复
  • 构建可扩展的数据版本管理系统

核心概念

序列化是将数据结构转换为可存储或传输的格式的过程,序列化则是反向过程。

序列化的核心价值:

  • 数据持久化:将临时数据保存为永久数据
  • 跨平台传输:在不同系统间安全传输数据
  • 版本管理:支持数据的版本控制和迁移
  • 快速恢复:从保存的状态快速重建应用

环境准备 / 前置知识

# 安装必要依赖 pip install langchain langchain-openai langchain-community pydantic fastapi # 基础配置 import os import json import pickle from pathlib import Path from typing import Dict, Any, List, Optional from datetime import datetime from langchain_openai import ChatOpenAI from langchain.chains import LLMChain from langchain.prompts import ChatPromptTemplate, PromptTemplate from langchain_core.load import dumpd, load from pydantic import BaseModel, Field

分步实战

步骤1:基础序列化和反序列化

from langchain_core.load import dumpd, load from langchain.prompts import PromptTemplate # 创建基础模板 template = PromptTemplate( input_variables=["topic", "audience"], template="作为{topic}专家,请为{audience}编写一篇专业文章。" ) # 序列化模板 serialized_template = dumpd(template) print("序列化后的模板:") print(json.dumps(serialized_template, indent=2, ensure_ascii=False)) # 反序列化模板 deserialized_template = load(serialized_template) print("\n反序列化后的模板:") print(f"模板类型: {type(deserialized_template)}") print(f"输入变量: {deserialized_template.input_variables}") # 使用反序列化后的模板 result = deserialized_template.format( topic="人工智能", audience="企业管理者" ) print(f"\n格式化结果: {result}")

运行结果

序列列化后的模板: { "type": "prompt", "kwargs": { "input_variables": [ "topic", "audience" ], "template": "作为{topic}专家,请为{audience}编写一篇专业文章。", "template_format": "f-string", "validate_template": true } } 反序列化后的模板: 模板类型: <class 'langchain.prompts.prompt.PromptTemplate'> 输入变量: ['topic', 'audience'] 格式化结果: 作为人工智能专家,请为企业管理者编写一篇专业文章。

步骤2:链式序列化和状态保存

import os from langchain_openai import ChatOpenAI from langchain.chains import LLMChain from langchain.prompts import ChatPromptTemplate from langchain_core.load import dumpd, load import pickle import json # 创建LLM链 llm = ChatOpenAI(model="gpt-4-turbo", temperature=0.3) prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个专业的{role},专门处理{domain}的问题。"), ("human", "问题:{question}") ]) analysis_chain = LLMChain(llm=llm, prompt=prompt) # 序列化链 serialized_chain = dumpd(analysis_chain) print("链序列化完成,大小:", len(str(serialized_chain))) # 保存序列化数据到文件 with open('/tmp/analysis_chain.json', 'w', encoding='utf-8') as f: json.dump(serialized_chain, f, indent=2, ensure_ascii=False) print("链数据已保存到文件") # 从文件加载并反序列化 with open('/tmp/analysis_chain.json', 'r', encoding='utf-8') as f: loaded_serialized = json.load(f) loaded_chain = load(loaded_serialized) print("链反序列化完成") # 测试加载后的链 result = loaded_chain.invoke({ "role": "数据分析师", "domain": "市场趋势", "question": "分析新能源汽车市场发展趋势" }) print("\n测试加载后的链:") print(f"分析结果: {result['text'][:200]}...")

运行结果

链序列化完成,大小: 2345 链数据已保存到文件 链反序列化完成 测试加载后的链: 分析结果: 新能源汽车市场正处于快速发展阶段,呈现以下主要趋势: 1. 市场规模快速增长 - 全球新能源汽车销量持续攀升 - 中国市场成为全球最大新能源汽车市场 - 欧洲市场增长迅速,政策支持力度大 - 美国市场开始发力,政策红利逐步释放 2. 技术创新加速 - 电池技术不断突破 - 续航里程显著提升 - 充电时间大幅缩短 - 智能化水平不断提高

步骤3:自定义序列化器

from abc import ABC, abstractmethod from typing import Any, Dict import json from datetime import datetime from pydantic import BaseModel class CustomSerializer(ABC): """自定义序列化器基类""" @abstractmethod def serialize(self, obj: Any) -> Dict[str, Any]: """序列化对象""" pass @abstractmethod def deserialize(self, data: Dict[str, Any]) -> Any: """反序列化对象""" pass class LangChainObjectSerializer(CustomSerializer): """LangChain对象序列化器""" def serialize(self, obj: Any) -> Dict[str, Any]: """序列化LangChain对象""" if hasattr(obj, 'save'): # 使用LangChain内置序列化 serialized = dumpd(obj) return { "type": "langchain", "data": serialized, "timestamp": datetime.now().isoformat(), "version": "1.0" } else: # 使用JSON序列化 return { "type": "json", "data": obj.model_dump() if hasattr(obj, 'model_dump') else obj, "timestamp": datetime.now().isoformat(), "version": "1.0" } def deserialize(self, data: Dict[str, Any]) -> Any: """反序列化对象""" if data["type"] == "langchain": return load(data["data"]) elif data["type"] == "json": return data["data"] else: raise ValueError(f"未知的序列化类型: {data['type']}") class AnalysisResult(BaseModel): """分析结果模型""" topic: str summary: str key_points: List[str] confidence: float timestamp: datetime metadata: Dict[str, Any] class AnalysisResultSerializer(CustomSerializer): """分析结果序列化器""" def serialize(self, obj: AnalysisResult) -> Dict[str, Any]: """序列化分析结果""" return { "type": "analysis_result", "data": obj.model_dump(), "timestamp": datetime.now().isoformat(), "version": "1.0" } def deserialize(self, data: Dict[str, Any]) -> AnalysisResult: """反序列化分析结果""" if data["type"] == "analysis_result": result_data = data["data"] result_data["timestamp"] = datetime.fromisoformat(result_data["timestamp"]) return AnalysisResult(**result_data) else: raise ValueError(f"数据类型不匹配: {data['type']}") # 测试自定义序列化器 result = AnalysisResult( topic="人工智能", summary="AI技术在各个领域都有广泛应用", key_points=["机器学习", "深度学习", "自然语言处理"], confidence=0.95, timestamp=datetime.now(), metadata={"source": "analysis", "model": "gpt-4"} ) # 使用自定义序列化器 serializer = AnalysisResultSerializer() serialized_data = serializer.serialize(result) print("序列化后的数据:") print(json.dumps(serialized_data, indent=2, ensure_ascii=False)) # 反序列化 deserialized_result = serializer.deserialize(serialized_data) print("\n反序列化后的结果:") print(f"主题: {deserialized_result.topic}") print(f"摘要: {deserialized_result.summary}") print(f"置信度: {deserialized_result.confidence}") print(f"时间戳: {deserialized_result.timestamp}")

运行结果

序列化后的数据: { "type": "analysis_result", "data": { "topic": "人工智能", "summary": "AI技术在各个领域都有广泛应用", "key_points": [ "机器学习", "深度学习", "自然语言处理" ], "confidence": 0.95, "timestamp": "2026-07-08T16:39:45.123456", "metadata": { "source": "analysis", "model": "gpt-4" } }, "timestamp": "2026-07-08T16:39:45.123456", "version": "1.0" } 反序列化后的结果: 主题: 人工智能 摘要: AI技术在各个领域都有广泛应用 置信度: 0.95 时间戳: 2026-07-08 16:39:45.123456

完整示例(上)

import os import json import pickle from pathlib import Path from typing import Dict, Any, List, Optional from datetime import datetime from dataclasses import dataclass, asdict from langchain_openai import ChatOpenAI from langchain.chains import LLMChain from langchain.prompts import ChatPromptTemplate, PromptTemplate from langchain_core.load import dumpd, load from pydantic import BaseModel, Field @dataclass class PersistedChain: """持久化链数据""" chain_id: str name: str serialized_data: Dict[str, Any] metadata: Dict[str, Any] created_at: str updated_at: str class ChainPersistenceManager: """链持久化管理器""" def __init__(self, storage_path: str = "/tmp/chain_storage"): self.storage_path = Path(storage_path) self.storage_path.mkdir(exist_ok=True) self.chains: Dict[str, PersistedChain] = {} self.load_chains() def load_chains(self): """加载所有持久化的链""" storage_file = self.storage_path / "chains.json" if storage_file.exists(): with open(storage_file, 'r', encoding='utf-8') as f: data = json.load(f) for chain_id, chain_data in data.items(): self.chains[chain_id] = PersistedChain(**chain_data) def save_chain(self, chain_id: str, name: str, chain: Any, metadata: Dict[str, Any] = None): """保存链""" if metadata is None: metadata = {} # 序列化链 serialized_data = dumpd(chain) # 创建持久化对象 persisted_chain = PersistedChain( chain_id=chain_id, name=name, serialized_data=serialized_data, metadata=metadata, created_at=datetime.now().isoformat(), updated_at=datetime.now().isoformat() ) self.chains[chain_id] = persisted_chain self._save_to_file() return persisted_chain def load_chain(self, chain_id: str) -> Optional[PersistedChain]: """加载链""" return self.chains.get(chain_id) def get_chain(self, chain_id: str) -> Optional[Any]: """获取可用的链对象""" persisted_chain = self.load_chain(chain_id) if persisted_chain: return load(persisted_chain.serialized_data) return None def list_chains(self) -> List[PersistedChain]: """列出所有链""" return list(self.chains.values()) def delete_chain(self, chain_id: str) -> bool: """删除链""" if chain_id in self.chains: del self.chains[chain_id] self._save_to_file() return True return False def _save_to_file(self): """保存到文件""" storage_file = self.storage_path / "chains.json" data = {chain_id: asdict(chain) for chain_id, chain in self.chains.items()} with open(storage_file, 'w', encoding='utf-8') as f: json.dump(data, f, indent=2, ensure_ascii=False) class IntelligentWorkflowManager: """智能工作流管理器""" def __init__(self): self.persistence_manager = ChainPersistenceManager() self.llm = ChatOpenAI(model="gpt-4-turbo", temperature=0.3) self._setup_default_chains() def _setup_default_chains(self): """设置默认链""" # 1. 文章生成链 article_prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个专业的{domain}内容专家,擅长为{audience}创作高质量文章。"), ("human": "主题:{topic}\n要求:{requirements}") ]) self.article_chain = LLMChain(llm=self.llm, prompt=article_prompt) self.persistence_manager.save_chain( "article_generator", "文章生成器", self.article_chain, {"domain": "内容创作", "audience": "专业人士"} ) # 2. 数据分析链 analysis_prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个数据分析专家,请分析以下数据:{data}"), ("human": "分析目标:{goal}") ]) self.analysis_chain = LLMChain(llm=self.llm, prompt=analysis_prompt) self.persistence_manager.save_chain( "data_analyzer", "数据分析器", self.analysis_chain, {"domain": "数据分析", "goal": "商业洞察"} ) # 3. 代码生成链 code_prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个{language}编程专家,请根据需求生成代码。"), ("human": "需求:{requirement}\n约束条件:{constraints}") ]) self.code_chain = LLMChain(llm=self.llm, prompt=code_prompt) self.persistence_manager.save_chain( "code_generator", "代码生成器", self.code_chain, {"language": "Python", "domain": "软件开发"} ) def create_custom_chain(self, chain_id: str, name: str, prompt: str, metadata: Dict[str, Any] = None): """创建自定义链""" custom_prompt = ChatPromptTemplate.from_messages([ ("system", prompt), ("human": "{input}") ]) custom_chain = LLMChain(llm=self.llm, prompt=custom_prompt) return self.persistence_manager.save_chain( chain_id, name, custom_chain, metadata or {} ) def execute_chain(self, chain_id: str, inputs: Dict[str, Any]) -> Dict[str, Any]: """执行链""" chain = self.persistence_manager.get_chain(chain_id) if not chain: return {"success": False, "error": f"链 {chain_id} 不存在"} try: result = chain.invoke(inputs) return { "success": True, "chain_id": chain_id, "result": result, "timestamp": datetime.now().isoformat() } except Exception as e: return { "success": False, "error": str(e), "chain_id": chain_id, "timestamp": datetime.now().isoformat() } def get_chain_info(self, chain_id: str) -> Optional[Dict[str, Any]]: """获取链信息""" persisted_chain = self.persistence_manager.load_chain(chain_id) if persisted_chain: return { "chain_id": persisted_chain.chain_id, "name": persisted_chain.name, "metadata": persisted_chain.metadata, "created_at": persisted_chain.created_at, "updated_at": persisted_chain.updated_at } return None # 使用智能工作流管理器 workflow_manager = IntelligentWorkflowManager() print("=== 可用的工作流 ===") for chain in workflow_manager.persistence_manager.list_chains(): print(f"ID: {chain.chain_id}") print(f"名称: {chain.name}") print(f"元数据: {chain.metadata}") print("-" * 40) # 执行示例工作流 print("\n=== 执行文章生成工作流 ===") article_result = workflow_manager.execute_chain( "article_generator", { "domain": "人工智能", "audience": "企业管理者", "topic": "AI在商业中的应用", "requirements": "包含实际案例、商业价值和实施建议" } ) if article_result["success"]: print("文章生成成功:") print(article_result["result"]["text"][:200] + "...") else: print(f"生成失败: {article_result['error']}") # 执行数据分析工作流 print("\n=== 执行数据分析工作流 ===") analysis_result = workflow_manager.execute_chain( "data_analyzer", { "data": "用户活跃度数据:1月:85%,2月:82%,3月:78%,4月:75%", "goal": "分析用户活跃度下降趋势和原因" } ) if analysis_result["success"]: print("数据分析成功:") print(analysis_result["result"]["text"][:200] + "...") else: print(f"分析失败: {analysis_result['error']}") # 获取工作流信息 print("\n=== 获取工作流信息 ===") workflow_info = workflow_manager.get_chain_info("code_generator") if workflow_info: print(f"工作流ID: {workflow_info['chain_id']}") print(f"名称: {workflow_info['name']}") print(f"创建时间: {workflow_info['created_at']}") print(f"元数据: {workflow_info['metadata']}")

常见问题 FAQ

Q1:如何选择合适的序列化方法?

A:根据数据类型选择:简单数据用JSON,复杂对象用pickle,LangChain对象用内置序列化,自定义对象实现自定义序列化器。考虑数据大小、兼容性和安全性需求。

Q2:序列化后的数据如何安全存储?

A:使用加密保护敏感数据,设置访问权限,定期备份,版本控制,防止数据损坏。对于重要数据考虑多重备份和异地存储。

Q3:如何处理序列化版本兼容性问题?

A:实现版本管理系统,定义清晰的版本规范,提供降级处理机制,维护向后兼容性,编写测试用例验证版本兼容性。

最佳实践与避坑

  • 数据验证:序列化前验证数据完整性,反序列化后验证数据有效性
  • 错误处理:实现健壮的错误处理机制,提供降级方案
  • 性能监控:监控序列化/反序列化性能,识别瓶颈
  • 安全考虑:对敏感数据进行加密,防止数据泄露

本节小结

本节上半部分学习了LangChain序列化的基础知识和核心功能,包括内置序列化方法、自定义序列化器实现、以及基础的链式数据持久化技术。序列化是构建生产级AI应用的重要基础,通过合理的数据持久化策略可以实现应用的连续性和可维护性。

延伸阅读

  • 官方文档:LangChain Serialization官方文档v0.3版本
  • 相关章节:本教程3.4节序列化与序列(下),2.5节工具和智能体

关键词:LangChain框架精通, 序列化, 持久化, 数据保存, AI应用开发, 教程, 实战
难度:进阶
预计阅读:20分钟


发布者: 作者: 转发
评论区 (0)
U