Bisheng的工作流与编排框架
【免费下载链接】bisheng BISHENG毕昇 是一款 开源 LLM应用开发平台,主攻企业场景。 项目地址: https://gitcode.com/dataelem/bisheng
Bisheng Workflow 是一个高度灵活且功能强大的工作流编排框架,专为复杂的企业级应用场景设计。其核心设计理念围绕模块化与可扩展性、Human-in-the-Loop、灵活的逻辑控制、高性能与异步支持、状态管理与上下文传递以及丰富的节点类型展开。通过模块化设计,每个节点都是一个独立的逻辑单元,可以自由组合和扩展。同时,框架支持在流程执行过程中引入人工干预,实现多轮对话和动态调整。此外,Bisheng Workflow 还支持复杂的逻辑控制,包括条件分支、并行执行和循环,并通过高效的流程执行引擎实现高性能与异步支持。
Bisheng Workflow的设计理念
Bisheng Workflow 是一个高度灵活且功能强大的工作流编排框架,专为复杂的企业级应用场景设计。其核心设计理念围绕以下几个关键点展开:
1. 模块化与可扩展性
Bisheng Workflow 采用模块化设计,每个节点(Node)都是一个独立的逻辑单元,可以自由组合和扩展。例如,BaseNode 是所有节点的基类,定义了节点的基本行为和接口,而具体的节点类型(如 LLMNode、ToolNode、ConditionNode 等)则通过继承基类实现特定功能。
2. Human-in-the-Loop
Bisheng Workflow 支持在流程执行过程中引入人工干预(Human-in-the-Loop)。例如,InputNode 和 OutputNode 允许用户在流程的中间阶段输入数据或确认结果,从而实现多轮对话和动态调整。
3. 灵活的逻辑控制
Bisheng Workflow 支持复杂的逻辑控制,包括条件分支(ConditionNode)、并行执行(通过 GraphEngine 实现)和循环(通过动态调整节点连接实现)。例如,ConditionNode 可以根据输入数据动态选择下一个节点:
class ConditionNode(BaseNode):
def route_node(self, state: dict) -> str:
if state.get("condition"):
return "next_node_if_true"
else:
return "next_node_if_false"
4. 高性能与异步支持
Bisheng Workflow 通过 GraphEngine 和 Workflow 类实现了高效的流程执行引擎,支持同步和异步模式(run 和 arun)。例如:
class Workflow:
def __init__(self, workflow_id, user_id, workflow_data, async_mode=False):
self.async_mode = async_mode
def run(self, input_data=None):
if self.async_mode:
return self.arun(input_data)
else:
return self._run(input_data)
5. 状态管理与上下文传递
GraphState 类负责维护工作流的状态和上下文,支持跨节点共享数据。例如,可以通过 set_variable 和 get_variable 方法在不同节点之间传递数据:
class GraphState:
def set_variable(self, node_id: str, key: str, value: Any):
self.variables[f"{node_id}.{key}"] = value
def get_variable(self, node_id: str, key: str) -> Any:
return self.variables.get(f"{node_id}.{key}")
6. 丰富的节点类型
Bisheng Workflow 提供了多种内置节点类型,覆盖了从数据处理到模型推理的各类需求。以下是部分节点类型的说明:
| 节点类型 | 功能描述 |
|---|---|
LLMNode | 调用大语言模型(LLM)进行文本生成或推理。 |
ToolNode | 执行外部工具或脚本,支持动态参数传递。 |
ConditionNode | 根据条件动态选择下一个节点。 |
InputNode | 接收用户输入数据。 |
OutputNode | 输出结果或展示中间数据。 |
RAGNode | 实现检索增强生成(Retrieval-Augmented Generation)。 |
通过以上设计理念,Bisheng Workflow 能够满足企业级应用的高复杂度需求,同时保持灵活性和易用性。
工作流的独立性与完备性
Bisheng的工作流框架在设计上充分考虑了独立性与完备性,确保每个工作流能够独立运行且覆盖企业级应用中的多样化需求。以下从多个维度分析其设计特点:
1. 模块化设计
Bisheng的工作流由多个节点(Node)组成,每个节点代表一个独立的功能单元。节点之间通过边(Edge)连接,形成有向无环图(DAG)。这种模块化设计使得工作流可以灵活组合,同时保持每个节点的独立性。
2. 节点类型与功能完备性
Bisheng提供了多种节点类型,覆盖了从输入处理到输出生成的全流程需求:
| 节点类型 | 功能描述 |
|---|---|
InputNode | 处理用户输入,支持文件上传、多轮对话等复杂场景。 |
LLMNode | 调用大语言模型生成内容,支持多模型切换和参数调优。 |
ToolNode | 执行工具调用,支持自定义工具扩展。 |
ConditionNode | 实现条件分支逻辑,支持复杂业务规则的动态路由。 |
OutputNode | 生成最终输出,支持多格式(文本、文件、API响应等)。 |
3. 独立性与隔离性
每个节点在运行时具有独立的状态和上下文,确保以下特性:
- 状态隔离:节点的运行状态(如变量、中间结果)不会影响其他节点。
- 错误隔离:单个节点的失败不会导致整个工作流崩溃,支持错误捕获和恢复机制。
- 资源隔离:节点可以独立配置资源(如CPU、内存),避免资源争用。
4. 完备的输入输出支持
Bisheng的工作流支持多类型输入输出,满足企业级应用的复杂需求:
5. 动态扩展能力
Bisheng的工作流框架支持动态扩展,用户可以通过以下方式自定义节点:
- 继承
BaseNode:实现自定义节点的核心逻辑。 - 注册到
NodeFactory:通过NodeManage类动态加载新节点类型。
class CustomNode(BaseNode):
def _run(self, unique_id: str):
# 自定义逻辑
pass
6. 完备的调试与日志
每个节点提供详细的运行日志和调试接口,便于问题排查和性能优化:
def parse_log(self, unique_id: str, result: dict) -> Any:
# 解析并记录节点运行日志
return result
通过以上设计,Bisheng的工作流框架在独立性和完备性上达到了企业级应用的要求,能够高效支持复杂业务场景的实现。
Human in the loop的实现方式
在Bisheng的工作流与编排框架中,"Human in the loop"(人机交互)是一种关键机制,允许用户在流程执行过程中进行干预和反馈。这种机制不仅增强了工作流的灵活性,还支持多轮对话和复杂场景的交互。以下是其实现方式的技术细节:
1. 用户输入处理
用户输入通过input.py模块中的input节点处理。该节点负责捕获用户输入并将其保存到graph_state中,以便后续节点使用。具体实现如下:
def _run(self, unique_id: str):
human_input = ""
for key, value in self.user_input.items():
if isinstance(value, dict):
content = value.get('content', '')
label = value.get('label', key)
human_input += f"{label}: {content.rstrip(',')}\n"
else:
human_input += f"{key}: {value}\n"
self.graph_state.save_context(content=f'{human_input}', msg_sender='human')
- 功能:将用户输入格式化为字符串,并保存到
graph_state中。 - 关键点:
msg_sender='human'标记输入来源为用户,便于后续节点区分。
2. 消息传递与上下文管理
graph_state.py模块负责管理工作流的上下文,包括用户输入和历史记录。以下是其核心方法:
def save_context(self, content: str, msg_sender: str) -> None:
self.history_memory.add_message(
HumanMessage(content=content) if msg_sender == 'human' else AIMessage(content=content)
)
- 功能:根据
msg_sender类型(human或AI)保存消息到历史记录。 - 关键点:支持多轮对话,保留完整的交互历史。
3. LLM节点中的交互
在llm.py模块中,LLM节点通过HumanMessage处理用户输入,并将其与上下文结合生成响应:
human_message = HumanMessage(content=[{
'type': 'text',
'text': self._parse_input_variable(input_variable)
}])
human_message = self.contact_file_into_prompt(human_message, self._image_prompt)
inputs.append(human_message)
- 功能:将用户输入封装为
HumanMessage,并与其他上下文数据结合。 - 关键点:支持文件上传和文本输入的混合处理。
4. 条件分支与用户干预
condition.py模块支持根据用户输入动态调整工作流路径:
def route_node(self, state: dict) -> str:
if state.get('user_choice') == 'option1':
return 'node_id_1'
else:
return 'node_id_2'
- 功能:根据用户选择跳转到不同的节点。
- 关键点:用户干预直接影响工作流的执行路径。
5. 流程图展示
以下是"Human in the loop"的工作流程示意图:
6. 表格总结
| 模块 | 功能 | 关键方法/类 |
|---|---|---|
input.py | 捕获用户输入 | _run, save_context |
graph_state.py | 管理上下文和历史记录 | save_context |
llm.py | 处理用户输入生成响应 | HumanMessage |
condition.py | 动态调整工作流路径 | route_node |
通过以上机制,Bisheng实现了高效、灵活的"Human in the loop"功能,支持复杂的企业级应用场景。
复杂场景下的工作流组合
Bisheng 的工作流编排框架支持在复杂场景下灵活组合多个工作流,以满足企业级应用的需求。本节将介绍如何通过 Bisheng 的 Workflow 类和相关组件实现复杂场景下的工作流组合,包括并行执行、条件分支、循环逻辑等高级功能。
1. 并行执行工作流
在需要同时处理多个独立任务的场景下,Bisheng 支持并行执行多个工作流。通过 Workflow 类的 run 或 arun 方法,可以启动多个工作流实例,并通过回调机制监控其执行状态。
from bisheng.workflow.graph.workflow import Workflow
# 初始化多个工作流实例
workflow1 = Workflow(workflow_id="workflow1", user_id="user1")
workflow2 = Workflow(workflow_id="workflow2", user_id="user1")
# 并行执行
result1 = workflow1.run(input_data={"input_key": "value1"})
result2 = workflow2.run(input_data={"input_key": "value2"})
流程图示例
2. 条件分支与动态路由
Bisheng 的 ConditionNode 和 RouteNode 组件支持根据运行时条件动态调整工作流路径。以下是一个条件分支的示例:
from bisheng.workflow.nodes.condition import ConditionNode
# 初始化条件节点
condition_node = ConditionNode(node_data={"condition": "input_value > 10"})
# 根据条件路由
if condition_node.evaluate(input_data={"input_value": 15}):
workflow.run(input_data={"path": "high_value_path"})
else:
workflow.run(input_data={"path": "low_value_path"})
状态图示例
3. 循环逻辑与迭代处理
对于需要重复执行的任务,Bisheng 支持通过 LoopNode 实现循环逻辑。以下是一个循环处理数据的示例:
from bisheng.workflow.nodes.loop import LoopNode
# 初始化循环节点
loop_node = LoopNode(node_data={"max_iterations": 5})
# 循环执行任务
for i in range(loop_node.max_iterations):
workflow.run(input_data={"iteration": i})
时序图示例
4. 组合复杂场景
通过将并行、条件和循环逻辑组合,可以实现更复杂的业务场景。例如,以下是一个并行执行多个条件分支的示例:
# 并行执行多个条件分支
workflows = [
Workflow(workflow_id=f"workflow_{i}", user_id="user1")
for i in range(3)
]
for wf in workflows:
if condition_node.evaluate(input_data={"input_value": random.randint(1, 20)}):
wf.run(input_data={"path": "branch_a"})
else:
wf.run(input_data={"path": "branch_b"})
类图示例
5. 总结
Bisheng 的工作流编排框架通过灵活的组件和强大的组合能力,能够满足复杂场景下的需求。无论是并行执行、条件分支还是循环逻辑,都可以通过简单的配置和代码实现。开发者可以根据具体业务需求,自由组合这些功能,构建高效、可靠的企业级应用。
总结
Bisheng 的工作流编排框架通过灵活的组件和强大的组合能力,能够满足复杂场景下的需求。无论是并行执行、条件分支还是循环逻辑,都可以通过简单的配置和代码实现。开发者可以根据具体业务需求,自由组合这些功能,构建高效、可靠的企业级应用。该框架在独立性和完备性上达到了企业级应用的要求,支持多类型输入输出、动态扩展能力以及完备的调试与日志功能,能够高效支持复杂业务场景的实现。
【免费下载链接】bisheng BISHENG毕昇 是一款 开源 LLM应用开发平台,主攻企业场景。 项目地址: https://gitcode.com/dataelem/bisheng
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



