AI 应用工作流:LangGraph 和 Solon AI Flow,我该选谁?
构建一个能聊天的客服、能总结文档的助手,或者一个能自我学习的智能体,都需要一个强大的“幕后大脑”来编排流程。LangGraph 和 Solon AI Flow 就是这样的“大脑”,但它们的工作方式和适用领域大不相同。
简单来说:
- LangGraph 就像一个拥有复杂思维的私人侦探,擅长推理、犯错和自我修正。
- Solon AI Flow 就像一家大型工厂的生产线,注重效率、稳定性和流程的标准化。
一、核心哲学:大脑结构的比喻
它们最大的区别在于如何设计 AI 的“思维路线”。
1. LangGraph:会思考的状态机
LangGraph 采用“状态机”(State Machine)和“图”(Graph)的结构。
- 比喻: 想象你在玩一个复杂的 “选择你的冒险” 游戏。
- 每个选择(节点) 都是一次操作(比如调用 AI 模型或使用工具)。
- 你的决定(边) 决定了下一步去哪里,甚至可能让你回到上一步重新思考。
- 核心优势: 它天生擅长处理 “复杂的决策和循环”。例如,如果 AI 发现第一次搜索结果不好,它可以自己决定回到上一步,换个关键词再搜一次。
- 适用人群/场景: 擅长 Python 编程的开发者,用于构建需要高度智能和动态思考的 AI 代理。
2. Solon AI Flow:标准化的生产线
Solon AI Flow 采用“流程图”(Flow Graph)和“组件化”的结构。
- 比喻: 想象一个汽车组装工厂的生产线。
- 每一步(组件) 都有明确的任务(输入、处理、输出)。
- 数据(FlowContext) 就像沿着流水线传送的零件,组件依次取用、加工、再放回。
- 核心优势: 整个流程是清晰、可预测的。虽然它也可以通过设置“条件开关”来实现循环、回退等。
- 适用人群/场景: 使用 Java 编程的开发者,用于在企业系统中快速、稳定地部署 AI 功能。
二、配置方式与用户体验
1. 写代码还是写配置?
| 特点 | LangGraph (Python) | Solon AI Flow (Java) |
|---|---|---|
| 流程定义 | 必须写代码(Python):节点和路由的逻辑都写在程序里。 | 主要写配置(YAML/JSON):流程步骤和组件参数都在配置文件里。 |
| 优势 | 灵活度最高,能实现最复杂的逻辑。 | 门槛低、易读性高,业务人员或运维人员也能看懂和调整流程。 |
2. Web 服务集成(最关键的工程差异)
在把 AI 流程变成一个网站或 APP 可以调用的 API 时,两者的体验截然不同:
| 功能 | LangGraph (Python) | Solon AI Flow (Java) |
|---|---|---|
| 接收请求 | 需要额外写代码(如用 FastAPI)来接收用户的 HTTP 请求。 | 内置组件 @WebInput:自动从用户的网页请求中获取输入文字和附件。 |
| 流式输出 | 需要手动配置和实现流式传输逻辑。 | 内置组件 @WebOutput:可以直接将 AI 结果以 SSE(流式) 方式输出到用户的浏览器。 |
| 总结 | 需要自己搭建 Web 接口和传输机制。 | 即插即用,为企业级 Web API 做了大量优化。 |
三、高级功能的实现方式
1. 智能体使用外部工具
- Solon AI Flow (MCP): 它将工具(比如“查天气”)视为独立的微服务。AI 流程通过一套标准协议 (MCP) 去远程调用这个服务。
- 好处: AI 逻辑和工具的业务逻辑完全分离,系统更稳定、更易于扩展。
- LangGraph: 通常是内部调用。AI 流程直接调用代码库里的函数。
2. RAG(文档问答)
- Solon AI Flow: 它把 RAG 的每一步(如导入文档、文档分割、建立知识库)都做成了独立的 YAML 组件。
- 好处: 像搭积木一样,通过调整配置文件,就能快速构建和切换不同的 RAG 管道。
四、我该选哪一个?
| 🎯 你的目标是... | 🔧 推荐使用 | 🚀 为什么? |
|---|---|---|
| 构建复杂的、能深度推理、自我迭代的 AI 智能体 | LangGraph | 它的状态机结构最适合处理复杂的 AI 思维逻辑和动态决策。 |
| 将 AI 功能稳定地部署到企业 Java 系统中 | Solon AI Flow | 它提供了 Java 生态的稳定性、Web 接口的便捷性,以及流程的标准化,更符合企业级工程需求。 |
| 团队主要用 Java,并追求快速实现 API 接口 | Solon AI Flow | YAML 配置和原生 Web 组件能让你更快地把 AI 变成一个可用的 API。 |
| 专注于 AI 模型和实验,使用 Python 生态 | LangGraph | 依托 LangChain 强大的工具库,让你专注于 AI 逻辑本身。 |
五、LangGraph 与 Solon Flow 简单示例参考
Solon AI Flow 就是 Solon Flow 的组件扩展。
1. LangGraph 简单示例
from langgraph.graph import StateGraph, END
from typing import Dict, Any
# 1. 定义状态类型
class SimpleState(dict):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.update({
"input": kwargs.get("input", ""),
"output": kwargs.get("output", ""),
"messages": kwargs.get("messages", [])
})
# 2. 定义节点函数
def node_a(state: SimpleState) -> Dict[str, Any]:
"""第一个节点 - 处理输入"""
user_input = state["input"]
return {
"output": f"节点A处理: {user_input.upper()}",
"messages": [f"经过节点A: {user_input}"]
}
def node_b(state: SimpleState) -> Dict[str, Any]:
"""第二个节点 - 进一步处理"""
current_output = state["output"]
current_messages = state["messages"]
return {
"output": f"{current_output} -> 节点B处理",
"messages": current_messages + ["经过节点B"]
}
# 3. 构建 workflow
def create_simple_workflow():
# 创建图
workflow = StateGraph(SimpleState)
# 添加节点
workflow.add_node("node_a", node_a)
workflow.add_node("node_b", node_b)
# 设置入口点
workflow.set_entry_point("node_a")
# 添加边(定义执行顺序)
workflow.add_edge("node_a", "node_b")
workflow.add_edge("node_b", END)
# 编译图
return workflow.compile()
# 4. 使用 workflow
if __name__ == "__main__":
# 创建 workflow
graph = create_simple_workflow()
# 执行
initial_state = SimpleState(input="hello world")
result = graph.invoke(initial_state)
print("最终结果:", result["output"])
print("消息记录:", result["messages"])
2. Solon Flow 简单示例
配置示例://task 也可以引用 java 组件(例:"@node_a"),Solon AI Flow 则是全面使用组件(对非技术人员,也很友好)。
id: demo1
layout:
- id: "node_a"
link: "node_b"
task: |
String user_input = context.getAs("input");
List<String> current_messages = context.getAs("messages");
context.put("output", "节点A处理: " + user_input.toUpperCase());
current_messages.add("经过节点A: " + user_input);
- id: "node_b"
task: |
String current_output = context.getAs("output");
List<String> current_messages = context.getAs("messages");
context.put("output", current_output + "-> 节点B处理");
current_messages.add("经过节点B");
代码示例(代码会简化)
@Component
public class DemoCom {
@Init
public void test() {
FlowContext initial_state = FlowContext.of()
.put("input", "a")
.put("output", "b")
.put("messages", Utils.asList());
flowEngine.eval("demo1", initial_state);
}
@Inject
FlowEngine flowEngine;
}
3. Solon AI Flow 简单示例(一个简单的聊天智能体)
配置示例:
id: chat1
layout:
- type: "start"
- task: "@WebInput"
- task: "@ChatModel"
meta:
systemPrompt: "你是个聊天助手"
stream: false
chatConfig: # "@type": "org.noear.solon.ai.chat.ChatConfig"
provider: "ollama"
model: "qwen2.5:1.5b"
apiUrl: "http://127.0.0.1:11434/api/chat"
- task: "@WebOutput"
- type: "end"
代码示例(代码会简化)
@Controller
public class DemoController {
@Inject
FlowEngine flowEngine;
Map<String, ChatSession> chatSessionMap = new ConcurrentHashMap<>();
@Produces(MimeType.TEXT_EVENT_STREAM_VALUE)
@Mapping("chat")
public void test(Context ctx) throws Exception {
FlowContext flowContext = FlowContext.of();
//保存会话记录
ChatSession chatSession = chatSessionMap.computeIfAbsent(ctx.sessionId(), k -> InMemoryChatSession.builder().sessionId(k).build());
flowContext.put(Attrs.CTX_CHAT_SESSION, chatSession);
flowEngine.eval("chat1", flowContext);
}
}

浙公网安备 33010602011771号