2828< meta property ="og:description " content ="source venv/bin/activatepip install langgraph python-dotenv openai LangGraph Demo 1.0 State State就是AI流转的全局变量 class InputState(TypedDict): question: str llm_answer: Optional[str] # None or strc ">
2929< meta property ="og:locale " content ="zh_CN ">
3030< meta property ="article:published_time " content ="2025-08-05T16:00:00.000Z ">
31- < meta property ="article:modified_time " content ="2025-08-06T01:12:54.014Z ">
31+ < meta property ="article:modified_time " content ="2025-08-07T00:55:58.371Z ">
3232< meta property ="article:author " content ="SIMULEITE ">
3333< meta property ="article:tag " content ="知识 ">
3434< meta name ="twitter:card " content ="summary ">
141141 < div class ="sidebar-panel-container ">
142142 <!--noindex-->
143143 < div class ="post-toc-wrap sidebar-panel ">
144- < div class ="post-toc animated "> < ol class ="nav "> < li class ="nav-item nav-level-1 "> < a class ="nav-link " href ="#langgraph-demo "> < span class ="nav-text "> LangGraph Demo</ span > </ a > < ol class ="nav-child "> < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#10-state "> < span class ="nav-text "> 1.0 State</ span > </ a > </ li > < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#20-node "> < span class ="nav-text "> 2.0 Node</ span > </ a > </ li > < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#30-graph-compile "> < span class ="nav-text "> 3.0 Graph Compile</ span > </ a > </ li > </ ol > </ li > < li class ="nav-item nav-level-1 "> < a class ="nav-link " href ="#draw-graph "> < span class ="nav-text "> Draw Graph</ span > </ a > </ li > </ ol > </ div >
144+ < div class ="post-toc animated "> < ol class ="nav "> < li class ="nav-item nav-level-1 "> < a class ="nav-link " href ="#langgraph-demo "> < span class ="nav-text "> LangGraph Demo</ span > </ a > < ol class ="nav-child "> < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#10-state "> < span class ="nav-text "> 1.0 State</ span > </ a > </ li > < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#20-node "> < span class ="nav-text "> 2.0 Node</ span > </ a > </ li > < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#30-graph-compile "> < span class ="nav-text "> 3.0 Graph Compile</ span > </ a > </ li > < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#draw-graph "> < span class ="nav-text "> Draw Graph</ span > </ a > </ li > < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#messages-history "> < span class ="nav-text "> Messages History</ span > </ a > </ li > </ ol > </ li > < li class ="nav-item nav-level-1 "> < a class ="nav-link " href ="#messagegraph "> < span class ="nav-text "> MessageGraph</ span > </ a > </ li > < li class ="nav-item nav-level-1 "> < a class ="nav-link " href ="#structured-output "> < span class ="nav-text "> Structured Output</ span > </ a > </ li > </ ol > </ div >
145145 </ div >
146146 <!--/noindex-->
147147
@@ -215,9 +215,15 @@ <h1 class="post-title" itemprop="name headline">
215215 < i class ="far fa-calendar "> </ i >
216216 </ span >
217217 < span class ="post-meta-item-text "> 发表于</ span >
218-
219218
220- < time title ="创建时间:2025-08-06 00:00:00 / 修改时间:09:12:54 " itemprop ="dateCreated datePublished " datetime ="2025-08-06T00:00:00+08:00 "> 2025-08-06</ time >
219+ < time title ="创建时间:2025-08-06 00:00:00 " itemprop ="dateCreated datePublished " datetime ="2025-08-06T00:00:00+08:00 "> 2025-08-06</ time >
220+ </ span >
221+ < span class ="post-meta-item ">
222+ < span class ="post-meta-item-icon ">
223+ < i class ="far fa-calendar-check "> </ i >
224+ </ span >
225+ < span class ="post-meta-item-text "> 更新于</ span >
226+ < time title ="修改时间:2025-08-07 08:55:58 " itemprop ="dateModified " datetime ="2025-08-07T08:55:58+08:00 "> 2025-08-07</ time >
221227 </ span >
222228
223229
@@ -238,8 +244,16 @@ <h2 id="20-node"><a class="markdownIt-Anchor" href="#20-node"></a> 2.0 Node</h2>
238244< figure class ="highlight python "> < table > < tr > < td class ="code "> < pre > < span class ="line "> < span class ="keyword "> def</ span > < span class ="title function_ "> llm_node</ span > (< span class ="params "> state: InputeState</ span > ):</ span > < br > < span class ="line "> msg = [</ span > < br > < span class ="line "> (< span class ="string "> "system"</ span > , readMd(< span class ="string "> "system.md"</ span > )),</ span > < br > < span class ="line "> (< span class ="string "> "human"</ span > , state[< span class ="string "> "question"</ span > ])</ span > < br > < span class ="line "> ]</ span > < br > < span class ="line "> </ span > < br > < span class ="line "> llm = ChatOpenAI(model=< span class ="string "> "gpt-4o"</ span > )</ span > < br > < span class ="line "> </ span > < br > < span class ="line "> resp = llm.invoke(msg)</ span > < br > < span class ="line "> < span class ="keyword "> return</ span > {< span class ="string "> "answer"</ span > : resp.content}</ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
239245< h2 id ="30-graph-compile "> < a class ="markdownIt-Anchor " href ="#30-graph-compile "> </ a > 3.0 Graph Compile</ h2 >
240246< figure class ="highlight python "> < table > < tr > < td class ="code "> < pre > < span class ="line "> builder = StateGraph(OverallState, < span class ="built_in "> input</ span > =InputState, output=OutputState)</ span > < br > < span class ="line "> </ span > < br > < span class ="line "> builder.add_node(< span class ="string "> "llm"</ span > , llm_node)</ span > < br > < span class ="line "> builder.add_edge(START, < span class ="string "> "llm"</ span > )</ span > < br > < span class ="line "> builder.add_edge(< span class ="string "> "llm"</ span > , END)</ span > < br > < span class ="line "> </ span > < br > < span class ="line "> graph = builder.< span class ="built_in "> compile</ span > ()</ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
241- < h1 id ="draw-graph "> < a class ="markdownIt-Anchor " href ="#draw-graph "> </ a > Draw Graph</ h1 >
247+ < h2 id ="draw-graph "> < a class ="markdownIt-Anchor " href ="#draw-graph "> </ a > Draw Graph</ h2 >
242248< figure class ="highlight python "> < table > < tr > < td class ="code "> < pre > < span class ="line "> display(Image(graph.get_graph(xray=< span class ="literal "> True</ span > ).draw_mermaid_png()))</ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
249+ < h2 id ="messages-history "> < a class ="markdownIt-Anchor " href ="#messages-history "> </ a > Messages History</ h2 >
250+ < figure class ="highlight python "> < table > < tr > < td class ="code "> < pre > < span class ="line "> < span class ="keyword "> class</ span > < span class ="title class_ "> State</ span > (< span class ="title class_ inherited__ "> TypedDict</ span > ):</ span > < br > < span class ="line "> msgs: Annotated[< span class ="built_in "> list</ span > , operator.add]</ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
251+ < h1 id ="messagegraph "> < a class ="markdownIt-Anchor " href ="#messagegraph "> </ a > MessageGraph</ h1 >
252+ < p > 使用Reducer追加消息,但是可以对已有消息做更新、合并、删除操作(Context Engine)</ p >
253+ < figure class ="highlight python "> < table > < tr > < td class ="code "> < pre > < span class ="line "> < span class ="keyword "> class</ span > < span class ="title class_ "> MessageGraph</ span > (< span class ="title class_ inherited__ "> StateGraph</ span > ):</ span > < br > < span class ="line "> < span class ="keyword "> def</ span > < span class ="title function_ "> __init__</ span > (< span class ="params "> self</ span > ) -> < span class ="literal "> None</ span > :</ span > < br > < span class ="line "> < span class ="built_in "> super</ span > ().__init__(Annotated[< span class ="built_in "> list</ span > [AnyMessage], add_message])</ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
254+ < figure class ="highlight python "> < table > < tr > < td class ="code "> < pre > < span class ="line "> builder = MessageGraph()</ span > < br > < span class ="line "> < span class ="comment "> # ...</ span > </ span > < br > < span class ="line "> graph = builder.< span class ="built_in "> compile</ span > ()</ span > < br > < span class ="line "> </ span > < br > < span class ="line "> msgs2 = [HumanMessage(content=< span class ="string "> "xxx"</ span > , < span class ="built_in "> id</ span > =msg1.< span class ="built_in "> id</ span > )]</ span > < br > < span class ="line "> < span class ="comment "> # ID相同,覆盖消息</ span > </ span > < br > < span class ="line "> add_messages(msgs1, msgs2)</ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
255+ < h1 id ="structured-output "> < a class ="markdownIt-Anchor " href ="#structured-output "> </ a > Structured Output</ h1 >
256+ < figure class ="highlight python "> < table > < tr > < td class ="code "> < pre > < span class ="line "> < span class ="keyword "> class</ span > < span class ="title class_ "> UserInfo</ span > (< span class ="title class_ inherited__ "> BaseModel</ span > ):</ span > < br > < span class ="line "> name: < span class ="built_in "> str</ span > = Field(description=< span class ="string "> "The name of the user"</ span > )</ span > < br > < span class ="line "> < span class ="comment "> # ...</ span > </ span > < br > < span class ="line "> </ span > < br > < span class ="line "> < span class ="comment "> # Runnable对象</ span > </ span > < br > < span class ="line "> structured_llm = llm.with_structured_output(UserInfo)</ span > < br > < span class ="line "> </ span > < br > < span class ="line "> < span class ="comment "> # UserInfo对象</ span > </ span > < br > < span class ="line "> resp = structured_llm.invoke(msg)</ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
243257 </ div >
244258
245259
0 commit comments