如何高效地保存和加载LangChain对象
在使用LangChain库进行开发时,保存和加载对象是一个常见需求。LangChain提供了一套标准方法来实现对象的序列化和反序列化,这不仅分离了API密钥等敏感信息,还确保了跨版本的兼容性。本文将详细介绍如何使用这些方法。
LangChain对象的序列化与反序列化
LangChain的类通过继承Serializable来实现JSON序列化。主要的实用方法包括dumpd、dumps、load和loads,这些方法被封装在langchain-core的load模块中。支持JSON和JSON可序列化对象。
以下是一个使用简单LLM链的示例:
from langchain_core.load import dumpd, dumps, load, loads
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# 创建ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages(
[
("system", "Translate the following into {language}:"),
("user", "{text}"),
],
)
# 创建ChatOpenAI对象
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", api_key="llm-api-key")
# 创建链
chain = prompt | llm
# 使用API代理服务提高访问稳定性
保存对象
保存为JSON字符串
string_representation = dumps(chain, pretty=True)
print(string_representation[:500])
保存为JSON可序列化的Python字典
dict_representation = dumpd(chain)
print(type(dict_representation)) # <class 'dict'>
保存到磁盘
import json
with open("/tmp/chain.json", "w") as fp:
json.dump(string_representation, fp)
值得注意的是,API密钥在序列化表示中被排除在外。这些被认为是机密的参数通过LangChain对象的lc_secrets属性指定。
加载对象
在反序列化过程中,可以通过secrets_map参数来加载相应的机密信息:
从字符串加载
chain = loads(string_representation, secrets_map={"OPENAI_API_KEY": "llm-api-key"})
从字典加载
chain = load(dict_representation, secrets_map={"OPENAI_API_KEY": "llm-api-key"})
从磁盘加载
with open("/tmp/chain.json", "r") as fp:
chain = loads(json.load(fp), secrets_map={"OPENAI_API_KEY": "llm-api-key"})
通过这种方式,我们可以恢复在指南开始时指定的API密钥。
常见问题和解决方案
- 安全风险: 由于反序列化可能实例化任何可序列化的LangChain对象,确保输入数据来源可信。
- 版本兼容性: 虽然LangChain努力保持版本间兼容性,但反序列化仍为beta功能,未来可能会有更改。
总结和进一步学习资源
保存和加载LangChain对象的方法使得在开发和生产中使用这些工具更加灵活和安全。不过,在使用这些方法时,请始终注意数据的安全性。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---