自然语言处理从入门到应用——LangChain:链(Chains)-[通用功能:链的保存(序列化)与加载(反序列化)]

分类目录:《自然语言处理从入门到应用》总目录


本文介绍了如何将链保存(序列化)到磁盘和从磁盘加载(反序列化)。我们使用的序列化格式是jsonyaml。目前,只有一些链支持这种类型的序列化。随着时间的推移,我们将增加支持的链条数量。

将链保存(序列化)到磁盘

首先,让我们可以使用.save方法将链保存到磁盘,并指定一个带有jsonyaml扩展名的文件路径。

复制代码
from langchain import PromptTemplate, OpenAI, LLMChain
template = """Question: {question}

Answer: Let's think step by step."""
prompt = PromptTemplate(template=template, input_variables=["question"])
llm_chain = LLMChain(prompt=prompt, llm=OpenAI(temperature=0), verbose=True)

llm_chain.save("llm_chain.json")

现在让我们来看看保存的文件中的内容:

csharp 复制代码
!cat llm_chain.json

输出:

csharp 复制代码
{
    "memory": null,
    "verbose": true,
    "prompt": {
        "input_variables": [
            "question"
        ],
        "output_parser": null,
        "template": "Question: {question}\n\nAnswer: Let's think step by step.",
        "template_format": "f-string"
    },
    "llm": {
        "model_name": "text-davinci-003",
        "temperature": 0.0,
        "max_tokens": 256,
        "top_p": 1,
        "frequency_penalty": 0,
        "presence_penalty": 0,
        "n": 1,
        "best_of": 1,
        "request_timeout": null,
        "logit_bias": {},
        "_type": "openai"
    },
    "output_key": "text",
    "_type": "llm_chain"
}

从磁盘加载(反序列化)链

我们可以使用load_chain方法从磁盘加载链:

csharp 复制代码
from langchain.chains import load_chain
chain = load_chain("llm_chain.json")
chain.run("whats 2 + 2")

日志输出:

复制代码
> Entering new LLMChain chain...
Prompt after formatting:
Question: whats 2 + 2

Answer: Let's think step by step.

> Finished chain.

输出:

复制代码
' 2 + 2 = 4'

分别保存组件

在上面的例子中我们可以看到提示和LLM配置信息与整个链条保存在同一个json中,但我们也可以将它们分开保存。这通常有助于使保存的组件更加模块化。为了做到这一点,我们只需要指定llm_path而不是llm组件,并且指定prompt_path而不是prompt组件。

csharp 复制代码
llm_chain.prompt.save("prompt.json")

输入:

csharp 复制代码
!cat prompt.json

输出:

csharp 复制代码
{
    "input_variables": [
        "question"
    ],
    "output_parser": null,
    "template": "Question: {question}\n\nAnswer: Let's think step by step.",
    "template_format": "f-string"
}

输入:

复制代码
llm_chain.llm.save("llm.json")

输入:

复制代码
!cat llm.json

输出:

复制代码
{
    "model_name": "text-davinci-003",
    "temperature": 0.0,
    "max_tokens": 256,
    "top_p": 1,
    "frequency_penalty": 0,
    "presence_penalty": 0,
    "n": 1,
    "best_of": 1,
    "request_timeout": null,
    "logit_bias": {},
    "_type": "openai"
}

输入:

复制代码
config = {
    "memory": None,
    "verbose": True,
    "prompt_path": "prompt.json",
    "llm_path": "llm.json",
    "output_key": "text",
    "_type": "llm_chain"
}

import json

with open("llm_chain_separate.json", "w") as f:
    json.dump(config, f, indent=2)

输入:

复制代码
!cat llm_chain_separate.json

输出:

复制代码
{
  "memory": null,
  "verbose": true,
  "prompt_path": "prompt.json",
  "llm_path": "llm.json",
  "output_key": "text",
  "_type": "llm_chain"
}

我们可以以相同的方式加载它:

csharp 复制代码
chain = load_chain("llm_chain_separate.json")
chain.run("whats 2 + 2")

日志输出:

复制代码
> Entering new LLMChain chain...
Prompt after formatting:
Question: whats 2 + 2

Answer: Let's think step by step.

> Finished chain.

输出:

复制代码
' 2 + 2 = 4'

从LangChainHub加载

本节介绍如何从LangChainHub加载链。

csharp 复制代码
from langchain.chains import load_chain

chain = load_chain("lc://chains/llm-math/chain.json")
chain.run("whats 2 raised to .12")

日志输出:

复制代码
> Entering new LLMMathChain chain...
whats 2 raised to .12
Answer: 1.0791812460476249
> Finished chain.

输出:

复制代码
'Answer: 1.0791812460476249'

有时候链会需要额外的参数,这些参数在链序列化时未包含在内。例如,一个用于对向量数据库进行问答的链条将需要一个向量数据库作为参数。

csharp 复制代码
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain import OpenAI, VectorDBQA
from langchain.document_loaders import TextLoader
loader = TextLoader('../../state_of_the_union.txt')
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)

embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texts, embeddings)
# Running Chroma using direct local API.
# Using DuckDB in-memory for database. Data will be transient.

chain = load_chain("lc://chains/vector-db-qa/stuff/chain.json", vectorstore=vectorstore)
query = "What did the president say about Ketanji Brown Jackson"
chain.run(query)

输出:

复制代码
" The president said that Ketanji Brown Jackson is a Circuit Court of Appeals Judge, one of the nation's top legal minds, a former top litigator in private practice, a former federal public defender, has received a broad range of support from the Fraternal Order of Police to former judges appointed by Democrats and Republicans, and will continue Justice Breyer's legacy of excellence."

参考文献:

1\] LangChain官方网站:https://www.langchain.com/ \[2\] LangChain 🦜️🔗 中文网,跟着LangChain一起学LLM/GPT开发:https://www.langchain.com.cn/ \[3\] LangChain中文网 - LangChain 是一个用于开发由语言模型驱动的应用程序的框架:http://www.cnlangchain.com/

相关推荐
IT_陈寒5 分钟前
Python开发者必知的5大性能陷阱:90%的人都踩过的坑!
前端·人工智能·后端
1G42 分钟前
openclaw控制浏览器/自动化的playwright MCP + Mcporter方案实现
人工智能
踩着两条虫1 小时前
VTJ.PRO 双向代码转换原理揭秘
前端·vue.js·人工智能
扉川川1 小时前
OpenClaw 架构解析:一个生产级 AI Agent 是如何设计的
前端·人工智能
星浩AI1 小时前
让模型自己写 Skills——从素材到自动生成工作流
人工智能·后端·agent
千寻girling5 小时前
Python 是用来做 AI 人工智能 的 , 不适合开发 Web 网站 | 《Web框架》
人工智能·后端·算法
AI攻城狮5 小时前
OpenClaw 里 TAVILY_API_KEY 明明写在 ~/.bashrc,为什么还是失效?一次完整排查与修复
人工智能·云原生·aigc
stark张宇5 小时前
构建第一个AI聊天机器人:Flask+DeepSeek+Postgres实战
人工智能·postgresql·flask
yiyu07167 小时前
3分钟搞懂深度学习AI:自我进化的最简五步法
人工智能·深度学习
浪浪山_大橙子9 小时前
OpenClaw 十分钟快速,安装与接入完全指南 - 推荐使用trae 官方 skills 安装
前端·人工智能