案例概述
在 LLM 代理构建的背景下,反思(Reflection)指的是通过提示 LLM 回顾其过去的步骤(以及可能来自工具/环境的观察)来评估所选择动作的质量。然后,这些评估结果可以用于下游任务,如重新规划、搜索或评估。
本案例通过一个生成五段式作文的例子,展示了如何在 LangGraph 中实现反思机制。
1. 环境设置(Setup)
首先,安装所需的包并设置 API 密钥。
安装依赖包
%pip install -U --quiet langgraph langchain-fireworks
%pip install -U --quiet tavily-python
- langgraph:用于构建和管理图形化的 LLM 代理。
- langchain-fireworks:LangChain 的扩展,用于与 Fireworks 模型集成。
- tavily-python:可能用于其他辅助功能。
设置环境变量
import getpass
import os
def _set_if_undefined(var: str) -> None:
if os.environ.get(var):
return
os.environ[var] = getpass.getpass(var)
_set_if_undefined("TAVILY_API_KEY")
_set_if_undefined("FIREWORKS_API_KEY")
- 通过
getpass.getpass
提示用户输入 API 密钥,并将其设置为环境变量。 - 确保在代码运行时,所需的 API 密钥已正确设置。
设置 LangSmith
LangSmith 是一个用于 LangGraph 开发的调试和监控工具。通过注册 LangSmith,可以使用跟踪数据来调试、测试和监控用 LangGraph 构建的 LLM 应用。
2. 生成作文(Generate)
创建一个生成五段式作文的生成器。
导入必要的模块
from langchain_core.messages import AIMessage, BaseMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_fireworks import ChatFireworks
- AIMessage, HumanMessage:用于表示 AI 和用户的消息。
- ChatPromptTemplate:用于创建聊天提示模板。
- ChatFireworks:与 Fireworks 模型交互的 LangChain 扩展。
定义生成提示模板
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"你是一个作文助手,负责撰写优秀的五段式作文。"
" 根据用户的请求生成最好的作文。"
" 如果用户提供了批评,请根据之前的尝试生成修改后的版本。",
),
MessagesPlaceholder(variable_name="messages"),
]
)
- system 消息:定义了 AI 的角色和任务,即作为作文助手,生成优秀的五段式作文。
- MessagesPlaceholder:占位符,用于插入用户的请求和之前的消息。
初始化 LLM
llm = ChatFireworks(
model="accounts/fireworks/models/mixtral-8x7b-instruct", max_tokens=32768
)
- model:指定使用的 Fireworks 模型。
- max_tokens:设置生成文本的最大长度。
创建生成链
generate = prompt | llm
- 使用管道(
|
)将提示模板和 LLM 连接起来,形成一个生成链。
生成作文
essay = ""
request = HumanMessage(
content="写一篇关于《小王子》在现代童年中的相关性的作文"
)
for chunk in generate.stream({"messages": [request]}):
print(chunk.content, end="")
essay += chunk.content
- request:用户的请求,要求写一篇关于《小王子》在现代童年中的相关性的作文。
- generate.stream:逐块生成作文内容,并实时打印和累积。
生成的作文示例如下:
标题: 《小王子》在现代童年中的永恒相关性
引言:
安托万·德·圣埃克苏佩里的《小王子》是一部永恒的中篇小说,七十多年来一直深受儿童和成人的喜爱。其持久的魅力和深刻的智慧跨越了几代人,使其成为童年文学中的经典。本篇作文探讨了《小王子》在现代童年中保持相关性的原因。
第一段:
《小王子》之所以相关,主要原因之一是其探讨了与当今儿童共鸣的主题。故事涉及童年中的普遍问题,如理解世界的挣扎、对友谊和爱的渴望,以及失落和孤独的痛苦。《小王子》与各种成年人相遇,每一个成年人都代表着不同的成人荒谬之处,反映了儿童在成长过程中所经历的困惑和幻灭。
...(中间内容省略)
结论:
总之,《小王子》之所以在现代童年中保持相关性,是因为其探讨了永恒的主题,推广了基本的价值观,强调了自然和环境管理的重要性,并敏感地处理了心理健康和情感健康问题。通过与这一经典故事的互动,儿童可以获得宝贵的见解和技能,这将伴随他们一生。《小王子》的持久遗产证明了其吸引、激励和教育几代儿童的能力,使其成为童年文学中不可或缺的一部分。
3. 反思(Reflection)
对生成的作文进行批改和建议,以改进其质量。
定义反思提示模板
reflection_prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"你是一名批改作文的老师。为用户提交的作文生成批评和建议。"
" 提供详细的建议,包括长度、深度、风格等方面的要求。",
),
MessagesPlaceholder(variable_name="messages"),
]
)
- system 消息:定义了 AI 的角色为批改老师,生成对用户提交作文的批评和建议。
- MessagesPlaceholder:占位符,用于插入用户的请求和作文内容。
创建反思链
reflect = reflection_prompt | llm
- 将反思提示模板和 LLM 连接起来,形成反思链。
生成反思内容
reflection = ""
for chunk in reflect.stream({"messages": [request, HumanMessage(content=essay)]}):
print(chunk.content, end="")
reflection += chunk.content
- 将用户请求和生成的作文作为消息输入反思链。
- 逐块生成批评和建议,并累积保存。
生成的反思示例如下:
作文批改与建议:
标题: 《小王子》在现代童年中的永恒相关性
引言:
引言部分提供了清晰简洁的主题概述,为整篇作文奠定了基础。作者在确立《小王子》的重要性及其持久吸引力方面做得非常出色。
第一段:
第一段有效地突出了《小王子》中存在的与当今儿童共鸣的普遍主题。作者可以通过提供书中的具体例子来说明每个主题,使作文更具吸引力,并展示对文本的更深入理解。
第二段:
第二段强调了《小王子》所推广的对现代童年至关重要的价值观。作者可以通过讨论这些价值观在日常生活中的应用来扩展这部分内容,为儿童提供实际的例子。此外,作者可以深入探讨狐狸在故事中的角色及其对小王子性格发展的影响。
第三段:
第三段讨论了自然和环境管理在《小王子》中的重要性。作者可以通过将故事的主题与当前的环境问题联系起来,增强这一段的内容,帮助儿童理解保护地球的重要性和紧迫性。此外,作者可以包括儿童可以采取的具体策略,以促进环境保护。
第四段:
第四段涉及了《小王子》中对心理健康和情感健康的独特视角。作者可以通过提供更多关于这些问题在故事中的表现的背景信息,并为可能面临类似情绪的儿童提供资源或建议,来改进这一段。这种方法不仅使作文内容信息丰富,还具有支持性和同理心。
结论:
结论部分有效地总结了作文的主要观点,同时强调了《小王子》在现代童年中的重要性。作者可以考虑添加一个行动呼吁,鼓励儿童阅读或重温这部小说,并反思其教训。此外,作者可以简要说明《小王子》的持久影响及其对未来几代人的潜在影响。
建议:
1. 引用更多直接来自文本的语句,以支持论点并吸引读者。
2. 扩展具体的主题、价值观和概念,以提供更深入的见解。
3. 提供实际应用和策略,帮助儿童将《小王子》的教训应用到日常生活中。
4. 考虑目标受众的年龄范围和阅读水平,调整语言和内容。
5. 确保摘要、分析和解释的平衡,以保持读者的兴趣并展示对文本的全面理解。
4. 重复生成(Repeat)
根据反思内容,修改并重新生成作文,以不断优化输出质量。
生成修改后的作文
for chunk in generate.stream(
{"messages": [request, AIMessage(content=essay), HumanMessage(content=reflection)]}
):
print(chunk.content, end="")
- 将用户请求、生成的作文以及反思内容作为消息输入生成链。
- 生成修改后的作文,进一步优化质量。
生成的修改后作文示例如下:
标题: 《小王子》在现代童年中的永恒相关性
引言:
安托万·德·圣埃克苏佩里的《小王子》是一部永恒的中篇小说,七十多年来一直深受儿童和成人的喜爱。其持久的魅力和深刻的智慧跨越了几代人,使其成为童年文学中的经典。本篇作文探讨了《小王子》在现代童年中保持相关性的原因,重点关注其对普遍主题的探讨、基本价值观的推广、对自然和环境管理的强调以及对心理健康和情感健康的敏感处理。
第一段:
《小王子》探讨了与当今儿童共鸣的主题,如理解世界的挣扎、对友谊和爱的渴望以及失落和孤独的痛苦。例如,小王子与自负之人的相遇(第四章)反映了儿童在与优先考虑自我而非真正连接的成年人互动时所经历的挫折。通过以可理解且适龄的方式呈现这些主题,《小王子》帮助儿童发展情感智力和韧性,使他们能够更好地应对日常生活中的挑战。
第二段:
《小王子》推广了对现代童年至关重要的价值观。它强调想象力、创造力和好奇心的重要性,鼓励儿童质疑、探索并寻求自己的真理。例如,小王子与狐狸的友谊教会儿童情感连接、同理心和责任感的价值。在我们这个技术驱动、节奏快速的社会中,这些价值观对于建立有意义的人际关系和促进情感健康越来越重要。
第三段:
《小王子》还提醒我们自然和环境在生活中的重要性。故事中对沙漠、猴面包树和神秘的小行星 B-612 的描绘培养了对自然界美丽和脆弱的欣赏。在气候变化和环境恶化的时代,《小王子》关于培养和保护地球的重要性的讯息比以往任何时候都更加相关。为了促进环境保护,儿童可以采取简单的策略,如减少浪费、种植树木和在社区中提高环境问题的意识。
第四段:
此外,《小王子》对心理健康和情感健康提供了独特的视角。故事巧妙地处理了抑郁、孤立和对意义的追寻等问题,提供了对这些复杂主题的细腻理解。通过以可理解且适龄的方式呈现这些主题,《小王子》帮助儿童发展情感智力和韧性,使他们能够更好地应对日常生活中的挑战。对于那些在心理健康方面挣扎的儿童,寻求来自可信赖的成年人(如父母、老师或心理健康专业人士)的帮助至关重要。
结论:
总之,《小王子》的持久遗产证明了其吸引、激励和教育几代儿童的能力,使其成为童年文学中不可或缺的一部分。通过与这一经典故事的互动,儿童可以获得宝贵的见解和技能,这将伴随他们一生。作者鼓励儿童阅读或重温《小王子》,并反思其教训,最终将其永恒的智慧应用到日常生活中。
5. 定义图(Define graph)
将生成和反思的步骤连接成一个图形化的工作流,以实现自动化的生成和优化过程。
导入必要模块
from typing import Annotated, List, Sequence
from langgraph.graph import END, StateGraph, START
from langgraph.graph.message import add_messages
from langgraph.checkpoint.memory import MemorySaver
from typing_extensions import TypedDict
定义状态
class State(TypedDict):
messages: Annotated[list, add_messages]
- 定义状态字典,包含消息列表。
定义生成节点
async def generation_node(state: State) -> State:
return {"messages": [await generate.ainvoke(state["messages"])]}
- generation_node:调用生成链,生成作文内容,并更新状态中的消息列表。
定义反思节点
async def reflection_node(state: State) -> State:
# 需要调整的其他消息
cls_map = {"ai": HumanMessage, "human": AIMessage}
# 第一条消息是原始用户请求。我们为所有节点保持不变
translated = [state["messages"][0]] + [
cls_map[msg.type](content=msg.content) for msg in state["messages"][1:]
]
res = await reflect.ainvoke(translated)
# 我们将反思的输出视为生成器的人类反馈
return {"messages": [HumanMessage(content=res.content)]}
- reflection_node:
- 将现有消息翻译为反思所需的格式(将 AI 消息转为人类消息,反之亦然)。
- 调用反思链,生成批评和建议。
- 将反思结果作为人类反馈添加到消息列表中。
构建状态图
builder = StateGraph(State)
builder.add_node("generate", generation_node)
builder.add_node("reflect", reflection_node)
builder.add_edge(START, "generate")
- StateGraph:定义状态图,指定初始状态。
- 添加生成和反思节点,并连接起始节点到生成节点。
定义条件边
def should_continue(state: State):
if len(state["messages"]) > 6:
# 达到3次迭代后结束
return END
return "reflect"
builder.add_conditional_edges("generate", should_continue)
builder.add_edge("reflect", "generate")
- should_continue:根据消息数量决定是否继续反思生成循环,超过一定次数后结束。
- 如果未达到结束条件,生成节点连接到反思节点,反之结束。
编译图
memory = MemorySaver()
graph = builder.compile(checkpointer=memory)
- MemorySaver:用于保存和恢复图的状态。
- 编译状态图,生成可执行的图对象。
执行图
config = {"configurable": {"thread_id": "1"}}
async for event in graph.astream(
{
"messages": [
HumanMessage(
content="生成一篇关于《小王子》在现代生活中话题性的作文及其信息的作文"
)
],
},
config,
):
print(event)
print("---")
- 定义配置,如线程 ID。
- 以异步方式执行图,传入初始消息(用户请求)。
- 逐步打印每个事件,展示生成和反思的过程。
执行结果示例
生成和反思过程会不断循环,直到达到结束条件。每次循环都会生成新的作文内容,并根据反思内容进行优化。
{'generate': {'messages': [AIMessage(content='标题: 《小王子》:现代生活中的话题性寓言...')]}
---
{'reflect': {'messages': [HumanMessage(content='作文批改与建议:...')]}
---
{'generate': {'messages': [AIMessage(content='标题: 《小王子》:现代生活中的话题性寓言... 修改后...')]}
---
{'reflect': {'messages': [HumanMessage(content='你的修改后的作文展示了对任务和源材料的清晰理解...')]}
---
...
6. 获取最终状态并展示
state = graph.get_state(config)
ChatPromptTemplate.from_messages(state.values["messages"]).pretty_print()
- 获取最终状态中的消息列表。
- 使用
ChatPromptTemplate
将消息格式化并打印,展示最终生成的作文和反思内容。
执行后的输出示例如下:
=============================== 人类消息 =================================
生成一篇关于《小王子》在现代生活中话题性的作文及其信息的作文
================================= AI 消息 ===================================
标题: 《小王子》:现代生活中的话题性寓言
引言:
安托万·德·圣埃克苏佩里的《小王子》是一部经典的中篇小说,自1943年出版以来,已经捕获了数百万读者的心。虽然这部作品可能被轻易地视为儿童故事,但其深刻的主题和永恒的信息使其在现代生活中依然具有相关性。这篇作文将探讨《小王子》的寓言性质,并讨论其信息如何应用于现代世界的复杂性。
...(中间内容省略)
结论:
总之,《小王子》由于其寓言性质、永恒的信息和对现代社会的批判,在现代生活中依然是一个话题性和相关性的作品。其对人际关系、物质主义和权力追求的探讨为各年龄段的读者提供了宝贵的见解。通过拥抱故事的智慧,我们可以更好地应对现代世界的复杂性,促进一个更有同情心、可持续和互联的社会。
================================= 人类消息 ==================================
作文批改与建议:
标题: 《小王子》:现代生活中的话题性寓言
引言:
引言部分通过提供《小王子》及其在现代生活中的相关性的背景信息,有效地为作文奠定了基础。然而,可以考虑添加一个吸引读者注意力的引子,以创造更强烈的第一印象。
...(中间内容省略)
建议:
1. 将作文扩展至大约1,200-1,500字,以允许更深入的分析。
2. 引用《小王子》中的具体例子和语句,以支持你的论点并吸引读者。例如,使用诸如“你永远要对你所驯养的负有责任”这样的语句,以强调形成真正联系的重要性。
3. 确保每个主体段落包含明确的论点陈述、支持证据和分析。
4. 考虑讨论《小王子》信息的反面观点或潜在批评,以增加作文的深度和复杂性。例如,探讨追求物质财产可能带来的安全感和舒适感。
5. 修订和编辑作文以确保清晰、连贯和语法正确。确保段落之间的过渡顺畅,并且你的论点逻辑流畅。
================================= AI 消息 ===================================
标题: 《小王子》:现代生活中的话题性寓言
引言:
安托万·德·圣埃克苏佩里的经典中篇小说《小王子》讲述了一个小男孩在宇宙中的旅程,遇见了象征成人生活不同方面的各种角色。这部自1943年出版以来的永恒故事在当今现代世界中依然极具相关性。其寓言性质、发人深省的信息和对现代社会的批判为各年龄段的读者提供了宝贵的见解。这篇作文将探讨《小王子》的寓言意义,分析其信息的相关性,并讨论其对现代社会的批判,展示其在当代生活中的话题性。
...(中间内容省略)
扩展作文建议:
1. 将作文扩展至大约1,200-1,500字,以允许更深入的分析。
2. 引用《小王子》中的具体例子和语句,以支持你的论点并吸引读者。例如,使用诸如“你永远要对你所驯养的负有责任”这样的语句,以强调形成真正联系的重要性。
3. 确保每个主体段落包含明确的论点陈述、支持证据和分析。
4. 考虑讨论《小王子》信息的反面观点或潜在批评,以增加作文的深度和复杂性。例如,探讨追求物质财产可能带来的安全感和舒适感。
5. 修订和编辑作文以确保清晰、连贯和语法正确。确保段落之间的过渡顺畅,并且你的论点逻辑流畅。
7. 结论
通过这个案例,您可以看到如何在 LangGraph 中实现一个简单的反思机制,用于生成和优化内容。以下是关键步骤的总结:
- 环境设置:安装必要的包,设置 API 密钥,并配置调试工具。
- 生成内容:定义生成提示模板,初始化 LLM,并创建生成链来生成初始内容。
- 反思:定义反思提示模板,创建反思链,对生成的内容进行批改和优化建议。
- 重复生成:将生成和反思步骤连接起来,形成一个循环过程,不断优化输出质量。
- 定义图:使用 LangGraph 构建状态图,将生成和反思节点连接起来,并定义终止条件。
- 执行图:配置并执行状态图,实时生成和优化内容。
- 获取结果:获取最终生成的内容和反思结果,展示优化后的作文。
进一步优化
在实际应用中,可以通过以下方式进一步优化反思机制:
- 多源反馈:不仅依赖反思步骤,还可以结合工具的观察或其他外部反馈来提升反思的质量。
- 动态终止条件:使用更智能的机制来决定何时终止循环,如质量评分达到一定阈值。
- 多轮优化:增加更多的优化步骤,如风格调整、内容扩展等,以实现更高质量的输出。
通过这些方法,可以构建更为复杂和高效的 LLM 代理,满足多样化的应用需求。
结语
本案例通过详细的步骤展示了如何在 LangGraph 中实现一个简单但有效的反思机制,帮助生成和优化高质量的内容。通过不断的生成和反思循环,可以显著提升输出的质量和相关性。这一方法不仅适用于作文生成,也可扩展应用于其他需要内容生成和优化的场景。
汇总
好的,以下是一个汇总的 Python 脚本,将您提供的 LangGraph 入门案例整合到一个 .py
文件中。所有的提示词、问题和注释均已翻译成中文,以便于您运行和整体理解。
文件名建议
您可以将以下代码保存为 langgraph_reflection.py
。
依赖安装
在运行脚本之前,请确保安装了所需的依赖包。您可以使用以下命令通过 pip
安装:
pip install -U langgraph langchain-fireworks tavily-python
完整的 langgraph_reflection.py
脚本
# langgraph_reflection.py
import asyncio
import getpass
import os
from typing import Annotated, List, Sequence
from typing_extensions import TypedDict
from langchain_core.messages import AIMessage, BaseMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_fireworks import ChatFireworks
from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import END, StateGraph, START
from langgraph.graph.message import add_messages
# 1. 环境设置(Setup)
def set_api_keys():
"""
设置 API 密钥,如果环境变量未定义,则提示用户输入。
"""
def _set_if_undefined(var: str) -> None:
if os.environ.get(var):
return
os.environ[var] = getpass.getpass(f"请输入 {var}: ")
_set_if_undefined("TAVILY_API_KEY")
_set_if_undefined("FIREWORKS_API_KEY")
# 2. 生成作文(Generate)
# 定义生成提示模板
generate_prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"你是一个作文助手,负责撰写优秀的五段式作文。"
" 根据用户的请求生成最好的作文。"
" 如果用户提供了批评,请根据之前的尝试生成修改后的版本。",
),
MessagesPlaceholder(variable_name="messages"),
]
)
# 初始化 LLM
llm = ChatFireworks(
model="accounts/fireworks/models/mixtral-8x7b-instruct", # 请确保模型路径正确
max_tokens=32768
)
# 创建生成链
generate = generate_prompt | llm
# 定义生成作文的函数
async def generate_essay(request_content: str) -> str:
"""
根据用户请求生成作文。
"""
essay = ""
request = HumanMessage(content=request_content)
async for chunk in generate.stream({"messages": [request]}):
print(chunk.content, end="")
essay += chunk.content
return essay
# 3. 反思(Reflection)
# 定义反思提示模板
reflection_prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"你是一名批改作文的老师。为用户提交的作文生成批评和建议。"
" 提供详细的建议,包括长度、深度、风格等方面的要求。",
),
MessagesPlaceholder(variable_name="messages"),
]
)
# 创建反思链
reflect = reflection_prompt | llm
# 定义生成反思内容的函数
async def reflect_essay(request_content: str, essay: str) -> str:
"""
对生成的作文进行批改和建议。
"""
reflection = ""
request = HumanMessage(content=request_content)
essay_message = HumanMessage(content=essay)
async for chunk in reflect.stream({"messages": [request, essay_message]}):
print(chunk.content, end="")
reflection += chunk.content
return reflection
# 4. 定义状态图(Define graph)
# 定义状态类型
class State(TypedDict):
messages: Annotated[List[BaseMessage], add_messages]
# 定义生成节点
async def generation_node(state: State) -> State:
new_essay = await generate.ainvoke(state["messages"])
return {"messages": [new_essay]}
# 定义反思节点
async def reflection_node(state: State) -> State:
# 需要调整的其他消息
cls_map = {"ai": HumanMessage, "human": AIMessage}
# 第一条消息是原始用户请求。我们为所有节点保持不变
translated = [state["messages"][0]] + [
cls_map[msg.type](content=msg.content) for msg in state["messages"][1:]
]
# 调用反思链
res = await reflect.ainvoke(translated)
# 将反思结果作为人类反馈添加到消息列表中
return {"messages": [HumanMessage(content=res.content)]}
# 构建状态图
def build_graph() -> StateGraph:
builder = StateGraph(State)
builder.add_node("generate", generation_node)
builder.add_node("reflect", reflection_node)
builder.add_edge(START, "generate")
# 定义是否继续的条件
def should_continue(state: State):
if len(state["messages"]) > 6:
# 达到3次迭代后结束
return END
return "reflect"
builder.add_conditional_edges("generate", should_continue)
builder.add_edge("reflect", "generate")
memory = MemorySaver()
graph = builder.compile(checkpointer=memory)
return graph
# 5. 执行图(Execute graph)
async def run_graph():
"""
执行状态图,生成并反思作文,直到达到终止条件。
"""
graph = build_graph()
config = {"configurable": {"thread_id": "1"}}
initial_message = HumanMessage(
content="生成一篇关于《小王子》在现代生活中话题性的作文及其信息的作文"
)
async for event in graph.astream(
{
"messages": [initial_message],
},
config,
):
print(event)
print("---")
# 6. 获取最终状态并展示
def display_final_state(graph: StateGraph, config: dict):
"""
获取最终状态并打印生成的消息。
"""
state = graph.get_state(config)
final_messages = state.values["messages"]
formatted = ChatPromptTemplate.from_messages(final_messages).pretty_print()
print(formatted)
# 7. 主函数
async def main():
# 设置 API 密钥
set_api_keys()
# 运行状态图
graph = build_graph()
config = {"configurable": {"thread_id": "1"}}
initial_message = HumanMessage(
content="生成一篇关于《小王子》在现代生活中话题性的作文及其信息的作文"
)
async for event in graph.astream(
{
"messages": [initial_message],
},
config,
):
print(event)
print("---")
# 获取最终状态并展示
display_final_state(graph, config)
# 运行主函数
if __name__ == "__main__":
asyncio.run(main())
脚本说明
-
环境设置(Setup):
- 通过
set_api_keys
函数设置 API 密钥。如果环境变量中未定义相应的密钥,将提示用户输入。 - 请确保您有
TAVILY_API_KEY
和FIREWORKS_API_KEY
,并在运行脚本时输入正确的值。
- 通过
-
生成作文(Generate):
- 定义了一个生成作文的提示模板
generate_prompt
,并初始化了 Fireworks 模型。 generate_essay
函数根据用户请求生成作文。
- 定义了一个生成作文的提示模板
-
反思(Reflection):
- 定义了一个反思的提示模板
reflection_prompt
,并创建了反思链reflect
。 reflect_essay
函数对生成的作文进行批改和建议。
- 定义了一个反思的提示模板
-
定义状态图(Define graph):
- 定义了状态类型
State
,包含消息列表。 - 定义了生成节点
generation_node
和反思节点reflection_node
。 - 构建了状态图
build_graph
,并设置了循环条件(最多3次迭代后结束)。
- 定义了状态类型
-
执行图(Execute graph):
run_graph
函数执行状态图,生成并反思作文,直到达到终止条件。
-
获取最终状态并展示:
display_final_state
函数获取最终状态中的消息列表,并格式化打印出来。
-
主函数:
main
函数设置 API 密钥,运行状态图,并展示最终生成的作文和反思内容。
运行脚本
确保您已安装所有依赖,并将脚本保存为 langgraph_reflection.py
。然后,在终端或命令提示符中运行以下命令:
python langgraph_reflection.py