Skip to main content

StrOutputParser字符串输出解析器

案例​

有如下代码,想要以第一次模型的输出结果,第二次去询问模型:

from langchain_core.prompts import PromptTemplate
from langchain_community.chat_models.tongyi import ChatTongyi

model = ChatTongyi(model="qwen3-max")

prompt = PromptTemplate.from_template(
"我邻居姓:{lastname},刚生了{gender},请起名,仅告知名字无需其它内容"
)

chain = prompt | model | model
res = chain.invoke({"lastname": "张", "gender": "女儿"})
print(res.content)
  • 链的构建完全符合要求(参与的组件)
  • 但是运行报错(ValueError: Invalid input type <class 'langchain_core.messages.ai.AIMessage'>. Must be a PromptValue, str, or list of BaseMessages.)
chain = prompt | model | model

错误的主要原因是:

  • prompt的结果是PromptValue类型,输入给了model
  • model的输出结果是:AIMessage

模型(ChatTongyi)源码中关于invoke方法明确指定了input的类型:

@override
def invoke(
self,
input: LanguageModelInput,
config: RunnableConfig | None = None,
*,
stop: list[str] | None = None,
**kwargs: Any,
) -> AIMessage:
LanguageModelInput = PromptValue | str | Sequence[MessageLikeRepresentation]
"""Input to a language model."""

需要做类型转换:

  • 可以借助LangChain内置的解析器
  • StrOutputParser字符串输出解析器

简介​

StrOutputParser是LangChain内置的简单字符串解析器

  • 可以将AIMessage解析为简单的字符串,符合了模型invoke方法要求(可传入字符串,不接收AIMessage类型)
  • 是Runnable接口的子类(可以加入链)
parser = StrOutputParser()
chain = prompt | model | parser | model

代码​

import os

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_community.chat_models.tongyi import ChatTongyi
from dotenv import load_dotenv

load_dotenv()
LLM_API_KEY = os.getenv("LLM_API_KEY")

parser = StrOutputParser()
model = ChatTongyi(model="qwen3-max",api_key=LLM_API_KEY)
prompt = PromptTemplate.from_template(
"我姓:{lastname},刚生了{gender},请给我起名字,不要有其他废话"
)

chain = prompt | model | parser | model | parser

res:str = chain.invoke({"lastname":"黄","gender":"女儿"})

print(res)
print(type(res))

总结​

StrOutputParser是LangChain内置的简单字符串解析器。

  • 可以将AIMessage类型转换为基础字符串
  • 可以加入chain作为组件存在(Runnable接口子类)