LangGraph 交织上 ModelRiver 的千层套环

把挂着图形排布结成大串长连有着全系自动大转移抗摔的网端长线代理连剧走下去。盖一座具备自身持久态和包含兜圈环跳、分道并线死磕记录不坠不损特质并全都无差别发包经向 ModelRiver 内走堂巡检之神兵级代客系统。

纵览俯探个究竟 (Overview)

要知道 LangGraph 就是当年发源从 LangChain 家后院走脱出来衍生拉出单起一支的大架构,图的是那把要起阵布那具自身持久性不灭记忆并有着无数小干练步凑分岔的代理列大帮并让其具挂象于大横大纵图型网线之中的做工排场。其一节节节眼叫网关节点本尊多为大 LLM 头目挂领承上发应之发令接口职事而串成它们彼此关联这管牵脉的导引线即那所谓的顺向关联行走向 (且尤擅拉线倒扣打转套形成在人代理团之间相互盘回的大阵循环口)。您只需信手向它所导往所及所向全都推包经由 ModelRiver 端截胡统抓代揽,那图纲下结落串套在这上的万千微末端结子便能瞬间尽数得到带自动闪避下补的防雷神力、把账管严记死的监统跟硬绑这格式死口不化样式的定边输出成色了。

到你手里的实落筹码和进账项到底能有啥:

  • 大阵下牵出来的一脉一相各小段挂结死点皆被同笼一气发向 ModelRiver 作分发管控中转过关
  • 在群阵干员那多重车轮战绕圈踢皮球流转打圈走步过堂之时带无形暗器被动唤出挂起防摔保护重拾重启机制的救难主意法术
  • 散挂至大树梢尽头在每片落枝网孔单结处耗下几多大洋分文无错必记挂明晃悬顶在大堂案版之上见 求征单册录表 (Request Logs)
  • 手拿自带留存死档挂着记印子断而还能重拉接上旧档再做续写流连执行之本场连脉大法

疾启开步拉引索 (Quick start)

拉上料先装填安包齐好

Bash
pip install langgraph langchain-openai

收绳向桩连进挂靠到 ModelRiver 开槽眼扣口里

PYTHON
1from langchain_openai import ChatOpenAI
2 
3llm = ChatOpenAI(
4 openai_api_base="https://api.modelriver.com/v1",
5 openai_api_key="mr_live_YOUR_API_KEY",
6 model="my-chat-workflow",
7)

主导打量发愿与操练实践并行的二重奏神代 ReAct agent

亲手砌一座以最为经典的老行规做根骨拉起的 审视推演 + 跨大步动大招之干将死卷复回循环体回路 (Reason + Act agent loop):

PYTHON
1from langgraph.prebuilt import create_react_agent
2from langchain_core.tools import tool
3 
4@tool
5def search(query: str) -> str:
6 """替主到门外海阔无沿互联网深层地盘里刨坑挖寻干货下落。"""
7 return f"顺着那串指令 '{query}' 大海捞针最终带回的宝贝面儿长这样了: ModelRiver 它自打问世生来干的就是做 AI 闸口的买卖啊。"
8 
9@tool
10def calculate(expression: str) -> str:
11 """专门出这解拿数学天书式字排阵盘符硬骨头这重任大计定断活路。"""
12 return str(eval(expression))
13 
14agent = create_react_agent(
15 model=llm,
16 tools=[search, calculate],
17)
18 
19result = agent.invoke({
20 "messages": [{"role": "user", "content": "那请问这叫 ModelRiver 家口倒底是做什么门道混饭局的,另外去给解解若是拿 42 去乘上 17 该是何解的数?"}]
21})
22 
23for msg in result["messages"]:
24 print(f"[{msg.type}]: {msg.content[:200] if msg.content else '(工具大爷的下发调拨动响声罢了)'}")

手刻订烧造设的大画幅神图连线脉络网 (Custom graph)

手动扯皮攒个拉了多截断节和在中间能有按道门发兵走岔支路门派大分的连缀行活干串线:

PYTHON
1from langgraph.graph import StateGraph, START, END
2from typing import TypedDict, Annotated
3from langchain_core.messages import HumanMessage, AIMessage
4import operator
5 
6class State(TypedDict):
7 messages: Annotated[list, operator.add]
8 classification: str
9 
10def classify(state: State) -> State:
11 """把这位门客看官甩来的要门旨意给起底照清并给画定成哪一路的牌派去号底。"""
12 response = llm.invoke([
13 {"role": "system", "content": "快来定夺把它划分归宗到是属 'technical' 还是个 'general' 两方阵营头号之列里并严令哪怕死也决计只能落着一个字往外吐。"},
14 state["messages"][-1],
15 ])
16 return {"classification": response.content.strip().lower()}
17 
18def handle_technical(state: State) -> State:
19 """去伺候主理化解有沾了硬冷器机工深奥大硬骨头理路上的破事难题且奉以事无巨细皆为全须实指打底的大长篇释答册。"""
20 response = llm.invoke([
21 {"role": "system", "content": "你大老现可是满肚子洋墨水能说破万门经史原理的老底子高工大匠级人物。必须给人上呈并甩脸拿出深通极道扎心窝级大块底板拆骨式大解题原章案。"},
22 state["messages"][-1],
23 ])
24 return {"messages": [response]}
25 
26def handle_general(state: State) -> State:
27 """去当笑脸迎人包办大堂宽怀泛泛大流大流随缘事随口带打太极接招用且还需作答讨喜又不多费人眼目的精短对板俏话。"""
28 response = llm.invoke([
29 {"role": "system", "content": "把自身定位于如沐春风的看院打杂小热心快肠闲差大拿。大可长着一张极精小巧带善助人绝不多带绕废话的大巧工嘴面呈相与去发人交谈。"},
30 state["messages"][-1],
31 ])
32 return {"messages": [response]}
33 
34def route(state: State) -> str:
35 if "technical" in state["classification"]:
36 return "technical"
37 return "general"
38 
39# 架这梁开拔这天阵排定 (Build the graph)
40graph = StateGraph(State)
41graph.add_node("classify", classify)
42graph.add_node("technical", handle_technical)
43graph.add_node("general", handle_general)
44 
45graph.add_edge(START, "classify")
46graph.add_conditional_edges("classify", route, {"technical": "technical", "general": "general"})
47graph.add_edge("technical", END)
48graph.add_edge("general", END)
49 
50app = graph.compile()
51 
52result = app.invoke({
53 "messages": [HumanMessage(content="劳请拨冗赐道以解惑,这江湖上传的神乎其神所谓 TCP/IP 它到底是走着何种筋络发功造势来连通其间的运转作派机制名堂在运作下功?")],
54 "classification": "",
55})
56print(result["messages"][-1].content)

逐字连流不绝如瀑下落飞溅如雨帘漫挂 (Streaming)

PYTHON
1async for event in app.astream_events(
2 {"messages": [HumanMessage(content="大谈特说给俺拨云撩雾抖透漏说明白神经大网络矩阵这茬机巧算盘是怎么个回事")], "classification": ""},
3 version="v2",
4):
5 if event["event"] == "on_chat_model_stream":
6 print(event["data"]["chunk"].content, end="", flush=True)

随时给设案落标留案卷落底档存本 (Checkpointing and persistence)

PYTHON
1from langgraph.checkpoint.memory import MemorySaver
2 
3checkpointer = MemorySaver()
4app = graph.compile(checkpointer=checkpointer)
5 
6# 初相认碰个头的一交头 (First turn)
7config = {"configurable": {"thread_id": "user-123"}}
8result = app.invoke(
9 {"messages": [HumanMessage(content="名下小字号爱丽丝 (Alice) 请多多指看。")], "classification": ""},
10 config=config,
11)
12 
13# 兜着圈走二茬回头来时: 大脑中依然存死记得当年下案底的老情分旧交扯不清的原脉情由故事 (Second turn: remembers context)
14result = app.invoke(
15 {"messages": [HumanMessage(content="喂,你看清楚我是报过的名头唤的哪方神圣来着?")], "classification": ""},
16 config=config,
17)
18print(result["messages"][-1].content) # "您的名头招牌是叫作那爱丽丝呀"

精准落到下达每一单个网口挂扣大节点分发专属不通吃定制工作槽流水路道大统配号

放飞去随性为长在这整个宏广大图阵上的每一各不相同面貌的扣口小打杂网关头节点发配定制独享单列属于它自己大不同品味专属 ModelRiver 专特列直挂快速配输管:

PYTHON
1# 要快如闪电手眼通天般迅速就给你归集定门类作分划阵列用这个脚程最快的战队牌号快马加鞭版
2classifier_llm = ChatOpenAI(
3 openai_api_base="https://api.modelriver.com/v1",
4 openai_api_key="mr_live_YOUR_API_KEY",
5 model="fast-classifier",
6)
7 
8# 对文字深耕精雕细作穷思极想耗尽家底大显重文火武火熬煮提笔作赋大加铺排的强劲火眼大杀器
9generator_llm = ChatOpenAI(
10 openai_api_base="https://api.modelriver.com/v1",
11 openai_api_key="mr_live_YOUR_API_KEY",
12 model="deep-generator",
13)
14 
15def classify(state):
16 response = classifier_llm.invoke(...) # 走那只讲效率又极为粗贱便宜大白菜门板 (Fast + cheap)
17 return {"classification": response.content}
18 
19def generate(state):
20 response = generator_llm.invoke(...) # 上强器大威力并且给的是精挖详探重活足道 (Powerful + thorough)
21 return {"messages": [response]}

被供进圈子神坛受世代瞻仰金句奉为圭臬不得乱逾这层高高大雷防线之准则行规 (Best practices)

  1. 一把钥匙必然开准只能去解它那最相切对口的铁头大锁结去 (Match model to node): 分干粗活派分拣定性的它就是天生只长在图快图个顺溜极速 (speed),要起大工出造大篇文生大货的那叫必须用慢功求出细活的能保证其生产品大档出货底气 (quality)
  2. 挂死打档设下定更留底之神位这招是为留待给打拉回马多轮交叠缠斗死循环时来复盘重见用的救急方块大法储备的 (Use checkpointing)
  3. 点灯去打着火把下沉看穿把死每一只落在末端网点头上究竟啃了你大库大账总包下流了多少块私钱花差出去 (Monitor per-node costs): 随时去到大总门 清查底案日志薄本明细台 (Request Logs) 那里揪出来那只在黑灯瞎火干背着大发吞吃大量元宝银锞钱吃人不吐骨大耗户节点到底是谁
  4. 强上一把巨锁去给大环环生生锁紧其去兜圈子能跳死圈折叠反滚复往的最大上限周转回旋数字顶死卡定这最后发作大额 (Set recursion limits): 就此斩草打断其身在此等环环死结大代包死旋跑腿迷阵深海圈中给拉断防止把血气力道全抽干死大断弦大祸无限灾
  5. 拉下瀑布水门让那成带滚滚字面跳频倾泻连作大泄向面幕屏端飞出显带生给生人眼去见观色 (Stream for interactive graphs): 祭出 astream_events 以款待并且来作脸服全副供送专用来当场面面对前台待客的大应用局上接引

这茬后边还有指路明灯去往下深翻可觅好寻处