☰
双非AI求职备战 Day23-28:LangChain + LangGraph,构建有状态Agent工作流
2026/10/1 8:45:23 网站建设 项目流程

双非AI求职备战 Day23-28:LangChain + LangGraph,构建有状态Agent工作流

我把代码和修改过程都上传到了我的github仓库(点击蓝字即可跳转)

前言

熟悉OpenAI官方SDK之后,学习国内生态更常用的LangChain,以及LangGraph图式Agent框架。LangGraph可以可视化、可控地编排Agent的执行流程,面试高频考点。

1. LangChain 最小Agent示例

使用create_agent快速创建Agent,开箱即可调用工具。
感受:LangChain封装度很高,一行代码就能搭建基础智能代理,快速验证想法。

提交:2d8f4b5 用langchain框架跑了一遍基础的东西,使用起来很方便

下面是我的代码

importosfromlangchain.agentsimportcreate_agentfromlangchain_openaiimportChatOpenAI# 用智谱(OpenAI 兼容接口)model=ChatOpenAI(model="glm-4-flash",api_key="API密钥",base_url="https://open.bigmodel.cn/api/paas/v4")defget_weather(city:str)->str:"""查询指定城市的天气。参数 city 是城市名。"""returnf"{city}今天晴天,25度"agent=create_agent(model=model,tools=[get_weather],system_prompt="你是一个助手,可以用工具查天气。")result=agent.invoke({"messages":[{"role":"user","content":"太原天气怎么样?"}]})print(result["messages"][-1].content)

2. LangGraph基础状态图

核心概念学习:StateGraph状态图、节点Node、边Edge。
先搭建最简单线性图,节点顺序执行,无循环分支,理解图编排的基础思想。

提交:c1666ab 用langGraph框架跑了一遍基础的东西,最基础的图:一条直线,没有循环

fromlanggraph.graphimportStateGraph,START,ENDfromlangchain_openaiimportChatOpenAIfromtypingimportTypedDict# 1. 定义状态:图里流转的数据classState(TypedDict):question:stranswer:str# 2. 定义节点:一个函数,接收状态,返回更新model=ChatOpenAI(model="glm-4-flash",api_key="你的APIKey",base_url="https://open.bigmodel.cn/api/paas/v4")defanswer_node(state:State):response=model.invoke(state["question"])return{"answer":response.content}# 3. 建图graph=StateGraph(State)graph.add_node("answer",answer_node)graph.add_edge(START,"answer")graph.add_edge("answer",END)app=graph.compile()# 4. 运行result=app.invoke({"question":"用一句话解释什么是Agent"})print(result["answer"])

3. LangGraph + RAG 融合

把之前手写完成的RAG检索模块,封装成LangGraph可调用的工具。
添加环境变量开启HF离线模式HF_HUB_OFFLINE,在无网络环境加载本地向量模型。

提交:00ec9db 把RAG加到agent里面了…加了# 开启HF离线模式

importosimporttimeimportrequestsimportstreamlitasst# HF离线模式,直接读本地缓存os.environ["HF_HUB_OFFLINE"]="1"os.environ["TRANSFORMERS_OFFLINE"]="1"fromtypingimportTypedDict,Annotatedimportnumpyasnpimportfaissfromsentence_transformersimportSentenceTransformerfromlanggraph.graphimportStateGraph,START,ENDfromlanggraph.graph.messageimportadd_messagesfromlanggraph.prebuiltimportToolNode# 替换成Sqlite持久化fromlanggraph.checkpoint.sqliteimportSqliteSaverfromlangchain_openaiimportChatOpenAIfromlangchain_core.toolsimporttoolfromlangchain_core.messagesimportHumanMessageimportstreamlitasst# ========== 1. RAG 资源 ==========model_embed=SentenceTransformer('BAAI/bge-small-zh-v1.5')index=faiss.read_index("my_index.faiss")withopen("../my-agent/my_docs.txt",encoding="utf-8")asf:documents=[p.strip()forpinf.read().split("\n\n")ifp.strip()]# ========== 2. 工具 ==========@tooldefsearch_my_docs(query:str)->str:"""搜索我的资料库。当用户问关于太原、山西的问题时使用。"""t0=time.time()q_vector=model_embed.encode(query).astype('float32')_,indices=index.search(np.array([q_vector]),3)res="\n".join(documents[i]foriinindices[0])t1=time.time()print(f"【RAG检索总耗时】{t1-t0:.2f}s")returnres@tooldefget_weather(city,**kwargs):forattemptinrange(3):try:url=f"https://wttr.in/{city}?format=3"response=requests.get(url,timeout=10)returnresponse.textexceptExceptionase:ifattempt==2:# 最后一次还失败returnf"查天气失败:{e}"time.sleep(1)tools=[search_my_docs,get_weather]# ========== 3. 状态与模型 ==========classState(TypedDict):messages:Annotated[list,add_messages]model=ChatOpenAI(model="glm-4-flash",api_key="API密钥",base_url="https://open.bigmodel.cn/api/paas/v4").bind_tools(tools)defllm_node(state:State):t0=time.time()resp=model.invoke(state["messages"])t1=time.time()print(f"【LLM API耗时】{t1-t0:.2f}s")return{"messages":[resp]}defshould_continue(state:State):return"tools"ifstate["messages"][-1].tool_callselseEND# ========== 4. 建图 + SQLite记忆 ==========graph=StateGraph(State)graph.add_node("llm",llm_node)graph.add_node("tools",ToolNode(tools))graph.add_edge(START,"llm")graph.add_conditional_edges("llm",should_continue,{"tools":"tools",END:END})graph.add_edge("tools","llm")# 打开sqlite数据库,文件名叫 chat_memory.dbconn_string="chat_memory.db"withSqliteSaver.from_conn_string(conn_string)asmemory:app=graph.compile(checkpointer=memory)config={"configurable":{"thread_id":"user_1"}}# ========== 5. 运行 ==========print("输入「退出」结束对话")whileTrue:question=input("你:").strip()ifquestionin("退出","exit","quit"):breakifnotquestion:continueresult=app.invoke({"messages":[HumanMessage(content=question)]},config=config)print("Agent:",result["messages"][-1].content)

4. ToolNode自动工具分发 + 多轮记忆

ToolNode(tools)自动处理工具调用分发,不用手写工具路由逻辑。
整合多轮对话+记忆持久化,实现完整的RAG Agent工作流。

提交:7878cda 添加了多轮对话功能,实现了记忆功能,使用了ToolNode(tools)自动分配

阶段收获

LangGraph把Agent从简单循环升级成状态驱动的图工作流,可以实现分支、循环、人工介入。企业很多生产级Agent都基于LangGraph开发,也是AI岗位面试重点。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询