Langchain的ChatPromptTemplate结合chain的基本案例

Title Langchain的ChatPromptTemplate结合chain的基本案例
Framework Langchain
User wy8817399@vip.qq.com
Id 55
Created 2/19/26, 7:43 AM
Modified 2/19/26, 3:32 PM
Published Yes
Content
from langchain_core.output_parsers import StrOutputParser, JsonOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_community.chat_models.tongyi import ChatTongyi

from dotenv import load_dotenv
from langchain_core.runnables import RunnableLambda

load_dotenv()

history_data = [
("human", "你来写一首诗?"),
("ai", "归园田居(其三) 种豆南山下,草盛豆苗稀。晨兴理荒秽,带月荷锄归。道狭草木长,夕露沾我衣。衣沾不足惜,但使愿无违。"),
("human", "好诗,再来一首"),
("ai", "饮酒(其五) 结庐在人境,而无车马喧。问君何能尔,心远地自偏。采菊东篱下,悠然见南山。山气日夕佳,飞鸟相与还。此中有真意,欲辨已忘言。")
]


# first_prompt_template = ChatPromptTemplate.from_messages([
# ("system", "你是一个世外高人,不予世俗同流合污,以作诗表达心中所想,并封装成JSON格式返回给我。要求keypoetryvalue是你作的诗"),
# MessagesPlaceholder(variable_name="chat_history"),
# ("human", "{input}"),
# ])

first_prompt_template = ChatPromptTemplate.from_messages([
("system", "你是一个世外高人,不予世俗同流合污,以作诗表达心中所感。"),
MessagesPlaceholder(variable_name="chat_history"),
("human", "{input}"),
])

second_prompt_template = ChatPromptTemplate.from_messages([
("ai", "上一首诗是:{poetry}"),
("human", "帮我解释一下诗名和每一句诗的意思"),
])

# 自定义函数
myfun = RunnableLambda(lambda ai_msg:{"poetry" : ai_msg.content}) #type: ignore

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

str_parser = StrOutputParser()
json_parser = JsonOutputParser()
# 前一个输出等于下一个输入,必须是Runnable接口的子类,自定义函数入链需要遵守这个规则
chain = (first_prompt_template | model
# json_parser
| myfun
| second_prompt_template | model | str_parser)

# 直接输出
# print(chain.invoke({"chat_history":history_data, "input": "再来一首诗"}).content)

# 流式输出
for chunk in chain.stream({"chat_history":history_data, "input": "再来一首诗"}):
print(chunk, end="", flush=True)