使用RunnableSequence替代LLMChain报错,LangChain升级适配求助
修正LangChain中HuggingFacePipeline的RunnableSequence调用错误
问题根源
HuggingFacePipeline与HuggingFaceEndpoint的输出格式存在差异:
- HuggingFaceEndpoint直接返回字符串结果
- HuggingFacePipeline返回模型原生输出结构(比如摘要任务会返回
[{"summary_text": "摘要内容"}]这样的字典列表),直接用prompt | llm | StrOutputParser会因为格式不匹配触发TypeError。
解决方案
需要先提取HuggingFacePipeline输出中的目标文本,再进行字符串解析。以下两种方式都可以解决问题:
方式1:自定义提取函数
from transformers import pipeline from langchain.llms import HuggingFacePipeline from langchain.prompts import PromptTemplate from langchain.schema.output_parser import StrOutputParser from langchain.schema.runnable import RunnablePassthrough # 初始化transformers文本摘要pipeline text_summarizer = pipeline( task="summarization", model="facebook/bart-large-cnn", max_length=150, min_length=40, truncation=True, return_full_text=False ) # 包装为LangChain的HuggingFacePipeline实例 llm = HuggingFacePipeline(pipeline=text_summarizer) # 定义提示模板 prompt = PromptTemplate( input_variables=["book_content"], template="请总结以下书籍内容:\n\n{book_content}" ) # 自定义提取函数,从模型输出中取出摘要文本 def extract_summary(output): return output[0]["summary_text"] # 构建完整的Runnable序列 summarization_chain = ( {"book_content": RunnablePassthrough()} # 传递输入参数 | prompt | llm | extract_summary | StrOutputParser() ) # 测试调用 sample_book_text = """你的书籍正文内容,比如一段长篇文本...""" result = summarization_chain.invoke(sample_book_text) print(result)
方式2:使用LangChain内置的TransformersPipelineOutputParser
LangChain提供了专门适配Transformers Pipeline输出的解析器,无需自定义函数:
from transformers import pipeline from langchain.llms import HuggingFacePipeline from langchain.prompts import PromptTemplate from langchain.schema.output_parser import StrOutputParser from langchain.output_parsers import TransformersPipelineOutputParser from langchain.schema.runnable import RunnablePassthrough # 初始化pipeline与LLM实例(同方式1) text_summarizer = pipeline( task="summarization", model="facebook/bart-large-cnn", max_length=150, min_length=40, truncation=True, return_full_text=False ) llm = HuggingFacePipeline(pipeline=text_summarizer) # 定义提示模板 prompt = PromptTemplate( input_variables=["book_content"], template="请总结以下书籍内容:\n\n{book_content}" ) # 使用内置解析器处理Pipeline输出 pipeline_parser = TransformersPipelineOutputParser() # 构建Runnable序列 summarization_chain = ( {"book_content": RunnablePassthrough()} | prompt | llm | pipeline_parser | StrOutputParser() ) # 测试调用 sample_book_text = """你的书籍正文内容...""" result = summarization_chain.invoke(sample_book_text) print(result)
关键说明
- 确保初始化Transformers Pipeline时设置
return_full_text=False(针对摘要任务),避免返回原始输入文本干扰结果。 - 若使用其他NLP任务(如文本生成),需根据模型输出结构调整提取逻辑(比如文本生成任务可能直接返回字符串列表,提取时取
output[0]即可)。
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

