由于 Orchestrator 工作线程工作流很常见,因此 LangGraph 具有 Send API 来支持此功能。它允许您动态创建 worker 节点并为每个节点发送特定的输入。每个工作程序都有自己的状态,所有工作程序输出都写入业务流程协调程序图形可访问的共享状态键。这使编排器能够访问所有工作程序输出,并允许它将它们合成为最终输出。正如你在下面看到的,我们遍历一个部分列表,每个部分都迭代到一个 worker 节点

from typing import Annotated, List

from langchain_core.messages import SystemMessage, HumanMessage
from langgraph.constants import Send
from langchain_openai import ChatOpenAI
from openai import BaseModel
from pydantic import Field
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
import operator
OPENAI_API_KEY= "lm-studio"
OPENAI_MODEL_NAME = "qwen2.5-3b-instruct"
OPENAI_BASE_URL="http://localhost:9999/v1"
llm = ChatOpenAI(
    openai_api_key=OPENAI_API_KEY,
    model_name=OPENAI_MODEL_NAME,
    openai_api_base=OPENAI_BASE_URL,
    temperature=1
)
# 定义 Section 类型
class Section(BaseModel):
    name: str
    description: str

class Sections(BaseModel):
    sections: List[Section] = Field(
        description="报告的段落.",
    )
planner = llm.with_structured_output(Sections)


# Graph state
class State(TypedDict):
    topic: str  # 报告主题
    sections: list[Section]  # 报告章节列表
    completed_sections: Annotated[
        list, operator.add
    ]  # 所有工作进程并行写入此键
    final_report: str  # 最终报告


# Worker state
class WorkerState(TypedDict):
    section: Section
    completed_sections: Annotated[list, operator.add]


# Nodes
def orchestrator(state: State):
    """生成报告计划的协调器"""

    # 生成查询
    report_sections = planner.invoke(
        [
            SystemMessage(content="为报告生成一个计划。"),
            HumanMessage(content=f"这是报告主题: {state['topic']}"),
        ]
    )
    print("生成的段落->",report_sections)
    return {"sections": report_sections.sections}


def llm_call(state: WorkerState):
    """工作进程编写报告的一个章节"""
    print(f"llm_call被调用,state->{state}")
    # 生成章节
    section = llm.invoke(
        [
            SystemMessage(
                content="根据提供的名称和描述编写一份报告章节。每个章节无需前言。使用 Markdown 格式。"
            ),
            HumanMessage(
                content=f"这是章节名称: {state['section'].name} 和描述: {state['section'].description}"
            ),
        ]
    )
    # 将更新后的章节写入已完成章节列表
    return {"completed_sections": [section.content]}


def synthesizer(state: State):
    """从各章节合成完整报告"""

    # 已完成章节列表
    completed_sections = state["completed_sections"]

    # 将已完成章节格式化为字符串,用作最终章节的上下文
    completed_report_sections = "\n\n---\n\n".join(completed_sections)
    print("最终报告->",completed_report_sections)
    return {"final_report": completed_report_sections}


# 条件边函数,创建每个都编写报告一个章节的 llm_call 工作进程
def assign_workers(state: State):
    """为计划中的每个章节分配一个工作进程"""

    # 通过 Send() API 并行启动章节编写
    return [Send("llm_call", {"section": s}) for s in state["sections"]]


# Build workflow
orchestrator_worker_builder = StateGraph(State)

# Add the nodes
orchestrator_worker_builder.add_node("orchestrator", orchestrator)
orchestrator_worker_builder.add_node("llm_call", llm_call)
orchestrator_worker_builder.add_node("synthesizer", synthesizer)

# Add edges to connect nodes
orchestrator_worker_builder.add_edge(START, "orchestrator")
orchestrator_worker_builder.add_conditional_edges(
    "orchestrator", assign_workers, ["llm_call"]
)
orchestrator_worker_builder.add_edge("llm_call", "synthesizer")
orchestrator_worker_builder.add_edge("synthesizer", END)

# Compile the workflow
orchestrator_worker = orchestrator_worker_builder.compile()

# Show the workflow

# Invoke
state = orchestrator_worker.invoke({"topic": "创建一份关于刻舟求剑的故事描写"})
print("finish->",state)

 orchestrator-worker 进行报表规划和编写的项目

输出:

成的段落-> Sections(sections=[Section(name='引言', description='介绍刻舟求剑的背景及故事梗概'), Section(name='历史与文化', description='阐述刻舟求剑在不同文化和时期的应用,以及背后蕴含的哲学含义'), Section(name='文本创作计划', description='详细规划如何创作故事描述部分,并列举可能采用的主题或视角'), Section(name='实施步骤', description='明确从构思到完成文本的具体流程和时间安排。包括但不限于搜集资料、创意构思、写作与修订等阶段的时间表。'), Section(name='评估与反馈', description='制定一个计划,以便在完成后邀请不同读者或专家给予反馈,并根据他们的建议进行调整。')])
llm_call被调用,state->{'section': Section(name='引言', description='介绍刻舟求剑的背景及故事梗概')}
llm_call被调用,state->{'section': Section(name='历史与文化', description='阐述刻舟求剑在不同文化和时期的应用,以及背后蕴含的哲学含义')}
llm_call被调用,state->{'section': Section(name='文本创作计划', description='详细规划如何创作故事描述部分,并列举可能采用的主题或视角')}
llm_call被调用,state->{'section': Section(name='实施步骤', description='明确从构思到完成文本的具体流程和时间安排。包括但不限于搜集资料、创意构思、写作与修订等阶段的时间表。')}
llm_call被调用,state->{'section': Section(name='评估与反馈', description='制定一个计划,以便在完成后邀请不同读者或专家给予反馈,并根据他们的建议进行调整。')}
最终报告-> # 引言
刻舟求剑的故事源自中国古代《吕氏春秋·察今》一书,讲述了一位古代士人乘船经过楚国时遗失了宝剑。他在船上找到一块刻有他位置的木板,便认为自己可以通过这根木板找到宝剑的位置。然而,当他在岸边重新寻找宝剑时,发现他所依赖的木板已经移动了,从而导致寻物无果的故事。
通过这个故事,我们不仅能够理解到固执于错误观点而不愿接受新事实的人容易做出与实际情况不符的行为,还能够提醒我们在面对问题和困难时不能一味地依赖过去的经验。

---

# 历史与文化

## 刻舟求剑的历史变迁及其背后的哲思

### 背景与起源
刻舟求剑的故事起源于古代中国战国时期的《吕氏春秋》,作为一则寓言故事被记录下来。这个故事讲述了一位舟子不慎将宝剑掉落水中,他用木条在船上刻画了位置试图找回宝剑,但最终未果的曲折经历。这一事件不仅成为了中国古代教育中一个重要的教训案例,在后世的发展中也逐渐演化为“刻舟求剑”这四个字,常被用来比喻那些因固执不变而错失机遇的行为。

### 不同历史时期的演变
随着历史发展与文化的交融,在不同的时代和地区,“刻舟求剑”的故事亦受到了不同程度的改编与拓展。比如,在元代文学作品中,“刻舟求剑”常常被赋予新的含义,用于描述人面对困难时的创新思维和解决问题的态度;而在当代中国语境下,则可能被用来比喻那些固守传统而无法适应新时代变化的行为。

### 文化意义与现代解读
在西方文化中,“刻舟求剑”更多地被理解为一种对技术变革与社会发展的批判性反思。例如,有人可能会用它来提醒人们不要死守陈旧的规则或方法,应勇于探索新思路。而在现代中国语境下,“刻舟求剑”则可能更侧重于强调坚持创新和适应变化的重要性——鼓励那些敢于打破传统束缚、积极探索未知领域的个人。

### 总结
“刻舟求剑”这一故事不仅在中国古代有着广泛的应用,在不同历史时期与文化背景下,其含义也得以丰富和发展。它所蕴含的哲学思想对于当代社会依然具有重要指导意义:无论是面对变革时坚持创新的态度,还是在困境中保持灵活思考的能力,“刻舟求剑”都为我们提供了一个深刻的启示——唯有勇于突破旧有框架,才能抓住时代的脉搏,实现个人与集体的成功与发展。

---

# 文本创作计划

## 故事描述的创作方向
在进行故事叙述时,我们将遵循一种结构化的策略来确保每一个情节都紧密相连、有逻辑性。故事主题将围绕着个人成长和人性探索展开,通过多维度的人物刻画与深入的人际关系探讨,以此展现主人公的成长历程及其面对人生挑战的方式。

## 可能采用的主题或视角
1. **家庭与社会**:我们将探讨主人公在家庭背景和社会环境下的成长经历,揭示两者对个体性格形成及价值观塑造的影响。
2. **爱与牺牲**:故事中将深刻描绘亲情、友情和爱情等关系的复杂性和力量,通过展现不同人物之间的互动与抉择来呈现爱的主题及其背后的心理动力。
3. **自我发现与接纳**:主人公将在个人成长的过程中逐渐理解并接受自身的独特性以及来自外界的挑战,这一过程既是挑战也是机遇。

## 创作计划
### 脚本结构规划
- 第一章:引言部分将详细介绍故事背景和主题设定,并介绍主要人物及其关系网。
- 第二章至第四章:情节发展部分,分别围绕主人公经历的家庭、友情和社会的多维度互动展开。
- 第五章:高潮与转折点:通过重要事件揭示主角内心世界的变化及其对周围环境的影响。
- 第六章:结局总结:呈现故事收尾处主角所达到的心理状态及未来方向。

### 写作周期
整个项目计划在接下来的一年时间内完成,具体时间分配如下:
- 3月起至6月:进行主题选择、人物设定和情节大纲制定等前期准备;
- 7月开始第一稿的创作;
- 10月底前进行第一轮修改与审阅。
- 每一轮完成后均需留出至少一个月时间供团队成员分享反馈意见并进一步完善。

## 资源需求
为了实现上述目标,我们计划邀请一些在相关领域拥有丰富经验的专业人士加入到项目组内。他们包括但不限于编剧、导演、演员和心理学专家等,为我们的创作提供专业支持与建议。此外,还会有专门的编辑人员负责文本校对工作,确保最终作品的文字质量。

总之,通过科学合理的规划流程以及多方力量的合作配合,我们将致力于创作出一部引人深思又充满人性关怀的作品。

---

# 实施步骤
本部分详细阐述了从构思到完成文本的具体实施流程和时间安排,确保每一环节都井然有序地进行。

### 1. 搜集资料
- 第一周:进行深入的网络搜索及文献收集,了解最新的研究动态。
- 第二周:组织并整理搜集到的信息,为后续创意构思提供坚实的基础。

### 2. 创意构思
- 第三周:基于所收集的资料和信息,确定文章的核心观点与论点。在头脑风暴时,可以邀请同事参与讨论,以获得不同的视角。
- 第四周:将所有信息进行归纳整合,并根据主题需求拟定草稿大纲。

### 3. 写作与修订
- 第五周:依据大纲开始撰写初稿。在此过程中不断调整和完善结构及内容。
- 第六周:对初步完成的稿件进行仔细审阅并做出必要修改,包括语法、拼写和排版等问题。
- 第七周:最后的细致修订阶段,确保文章通顺流畅,语言表达准确无误。

### 4. 完成与提交
- 确保所有细节都符合格式要求之后,便可正式定稿并提交给相关负责人。

---

# 评估与反馈

制定一个计划,以便在完成项目后邀请不同读者或专家提供反馈,并基于他们提供的意见进行必要的调整。以下是一些建议的步骤来执行此计划:

1. **选择合适的评审者**:确定可能对您的工作感兴趣和有能力提供有用反馈的专家群体。这些可以是同行、学生或其他有相关研究经验的专业人士。考虑包括具有不同背景的个体,以获取更全面的意见。

2. **明确评估标准与框架**:为了确保每位参与评论的读者或专家都理解预期的目标,清晰地定义评审的标准和评价框架至关重要。这可以帮助他们专注于关键点上,并使反馈更加有针对性和建设性。

3. **通知与邀请**:在适当的时间通过电子邮件或其他方式正式通知您选择的专家或读者团队,解释项目的基本信息、目标以及为什么他们的专业知识将对评估有帮助。如果适用,提供一份详细的报告草案供他们在审阅时参考。

4. **设定截止日期**:为每位评审者规定一个具体的提交反馈的截止日期,确保他们有足够的时间深入阅读和分析您的工作,并提供细致的意见。

5. **收集与处理反馈**:从收到的评论中提取核心观点,包括优点、可能的问题区域以及任何改进或补充的建议。记录所有反馈以供日后参考,在最终修改之前整理并组织这些信息。

6. **响应并行动**:根据您从反馈中学到的知识对项目进行调整和改进,并与审阅者分享这些变化。表达对他们帮助的感激之情,这是对他们的投入的肯定也是合作的良好开端。

通过遵循以上步骤,可以有效地收集外部视角下的反馈,并将其纳入您的工作流程中,这不仅有助于提高质量,还能促进更广泛的传播和社会影响。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐