前面文章中说过,spring-ai-alibaba-graph 可以通过实现 NodeAction 来自定义节点
但是不想自定义的话,spring-ai-alibaba-graph 针对日常常用的场景,也封装了一批常用节点,例如大语言模型节点、工具节点等,方便直接使用
内置节点列表
|------------------------|--------------------------------|
| 内置节点 | 作用 |
| LlmNode | 根据输入的模板及参数调用大语言模型 |
| ToolNode | 获取OverAllState中的大语言模型回复并调用对应工具 |
| HttpNode | 执行http请求 |
| HumanNode | 人工干预的节点,支持条件中断和总是中断两种策略 |
| McpNode | 调用Mcp服务器 |
| QuestionClassifierNode | 文本分类 |
| DocumentExtractorNode | 从不同格式的文件中提取文本内容 |
| KnowledgeRetrievalNode | 从向量存储中检索内容 |
| 。。。 | 其他还有若干内置节点,感兴趣可以参考开源仓库 |
以LlmNode和ToolNode 为例来看两种节点的使用和执行过程(其他节点的样例可以参考官方示例spring-ai-alibaba-examples/spring-ai-alibaba-graph-example at main · springaialibaba/spring-ai-alibaba-examples)
大语言模型节点 LlmNode
样例
使用方式
java
LlmNode llmNode = LlmNode.builder()
.chatClient(chatClient)
.systemPromptTemplate("你是客服助手,请基于以下信息撰写回复:")
.userPromptTemplateKey("http_response")
.messagesKey("user_prompt")
.outputKey("llm_response")
.build();
graph.addNode("invokeLLM", AsyncNodeAction.node_async(llmNode));
LlmNode 提供了4个key字段和默认实现
|-----------------|--------------|
| key | 默认实现 |
| systemPromptKey | systemPrompt |
| userPromptKey | userPrompt |
| paramsKey | params |
| messagesKey | messages |
ps:Builder中部分字段带有Template
以上四种属性 LlmNode 优先从 OverAllState 中以key获取,获取不到则取默认实现:
state.value(xxxKey).orElse(xxx)
除此之外还有拦截器 advisors,工具 toolCallbacks,输出key outputKey,聊天客户端 chatClient,流式标志 stream等字段
执行过程:以 param 渲染用户提示词,然后根据流式标志调用 stream 或 call 方法,结果放入 OverAllState 的 outputKey 对应槽位中,outputKey 为空则默认放入 messages中
工具节点 ToolNode
样例
使用方式
java
ToolNode toolNode = ToolNode.builder()
.llmResponseKey("llm_response")
.outputKey("tool_result")
.toolCallbackResolver(toolCallbackResolver)
.toolNames(List.of("sendEmail", "updateCRM"))
.build();
graph.addNode("invokeTool", AsyncNodeAction.node_async(toolNode));
ToolNode 包含一个输入key llmResponseKey,一个输出key outputKey,两个工具提供者 toolCallbacks 和 toolCallbackResolver
执行过程:
1)获取大模型回复:ToolNode 首先根据 llmResponseKey 从 OverAllState 获取,llmResponseKey 未设置则默认取key为 "llm_response",若未取到则取 OverAllState 的 messages 的最后一条
2)获取工具:从大模型回复中获取工具列表,然后从 toolCallbacks 中匹配同名工具,若未找到则由 toolCallbackResolver 根据工具名获取
3)执行工具:从大模型回复中获取工具对应参数,连同 OverAllState 一起传入工具,获得工具调用结果
4)封装结果:结果会放入结果Map,key为 messages 和 输出key
注意:有些内置节点会根据传入的OverAllState更新内部成员变量,在多用户并发请求时可能会存在覆盖的问题