LangGraph 极简入门
·
阿里云百炼的通义千问系列模型支持 Anthropic API 兼容接口。通过修改以下参数,即可将原有的 Anthropic 应用迁移至阿里云百炼。https://help.aliyun.com/zh/model-studio/anthropic-
api-messages
加入条件分支(Conditional Edge)
根据 LLM 返回内容决定走 “A 工具” 还是 “B 工具”
条件分支:
Claude 先判断用户问的是“数学题”还是“其他问题”
-
数学题 → 走
calc_node(用 Python 算答案) -
其他 → 走
chat_node(直接让 Claude 回答)

# cond_demo.py
import os, getpass, re
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langchain_anthropic import ChatAnthropic
if not (key := os.getenv("ANTHROPIC_API_KEY")):
# os.environ["ANTHROPIC_API_KEY"] = getpass.getpass("ANTHROPIC_API_KEY: ")
os.environ["ANTHROPIC_API_KEY"] = 'sk-3ad75cfac6b****9ab00f8d3d473b2a'
os.environ['ANTHROPIC_BASE_URL'] = 'https://dashscope.aliyuncs.com/apps/anthropic'
# ---------------- 1. 状态结构 ----------------
class State(TypedDict):
query: str
answer: str
route: str # 分支标记:math | chat
# ---------------- 2. 节点 ----------------
llm = ChatAnthropic(model="qwen-plus", temperature=0)
# res = llm.invoke([{"role": "system", "content": "你只需回答一个单词:若问题是纯数学题(含四则运算、方程、几何)回答 math,否则回答 chat。"},
# {"role": "user", "content": "3加3等于多少"}])
def router_node(state: State) -> State:
"""让 Claude 给 query 分类,返回路由标记"""
sys_prompt = "你只需回答一个单词:若问题是纯数学题(含四则运算、方程、几何)回答 math,否则回答 chat。"
response = llm.invoke([{"role": "system", "content": sys_prompt},
{"role": "user", "content": state["query"]}])
return {"route": response.content.strip().lower()}
def calc_node(state: State) -> State:
"""提取算式并计算"""
expr = re.search(r"[\d\s\+\-\*\/\(\)\.]+", state["query"])
if expr:
try:
ans = eval(expr.group())
return {"answer": f"计算结果:{ans}"}
except Exception as e:
return {"answer": f"计算出错:{e}"}
return {"answer": "未识别到算式"}
def chat_node(state: State) -> State:
"""普通对话"""
response = llm.invoke(state["query"])
return {"answer": response.content}
# ---------------- 3. 条件分支函数 ----------------
def route_rule(state: State) -> str:
return state["route"]
# ---------------- 4. 建图 ----------------
builder = StateGraph(State)
builder.add_node("router", router_node)
builder.add_node("calc", calc_node)
builder.add_node("chat", chat_node)
builder.add_edge(START, "router")
# 关键:条件边
builder.add_conditional_edges(
"router",
route_rule,
{"math": "calc", "chat": "chat"} # 映射表
)
builder.add_edge("calc", END)
builder.add_edge("chat", END)
graph = builder.compile()
# ---------------- 5. 测试 ----------------
if __name__ == "__main__":
q = "123 * 456 + 78 等于多少?"
print("问题:", q)
result = graph.invoke({"query": q, "route": ""})
print("答案:", result["answer"])
# 再试一个开放问题
q2 = "LangGraph 是什么?"
print("\n问题:", q2)
result2 = graph.invoke({"query": q2, "route": ""})
print("答案:", result2["answer"])
# 导出流程图
with open("cond_graph.png", "wb") as f:
f.write(graph.get_graph().draw_mermaid_png())
print("\n条件分支流程图已保存为 cond_graph.png")
更多推荐

所有评论(0)