如何高效地保存和加载LangChain对象

62 阅读2分钟

如何高效地保存和加载LangChain对象

在使用LangChain库进行开发时,保存和加载对象是一个常见需求。LangChain提供了一套标准方法来实现对象的序列化和反序列化,这不仅分离了API密钥等敏感信息,还确保了跨版本的兼容性。本文将详细介绍如何使用这些方法。

LangChain对象的序列化与反序列化

LangChain的类通过继承Serializable来实现JSON序列化。主要的实用方法包括dumpddumpsloadloads,这些方法被封装在langchain-coreload模块中。支持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---