当前位置: 首页 > news >正文

LangGraph:构建有状态智能体工作流的底层编排框架

1. 项目概述:LangGraph,一个为状态智能体而生的底层编排框架

如果你正在构建基于大语言模型的智能体应用,并且已经受够了那些只能处理简单、无状态对话的玩具级框架,那么LangGraph的出现,或许能解决你真正的痛点。简单来说,LangGraph是一个用于构建、管理和部署长期运行、有状态的智能体工作流的底层编排框架。它不像一些高级封装库那样给你一个“开箱即用”但功能受限的黑盒,而是提供了一套强大、灵活的基础设施,让你能够像搭积木一样,设计出能够处理复杂、多步骤、需要记忆上下文任务的智能系统。

想象一下,你需要构建一个客户服务智能体,它不仅要能回答当前问题,还要能记住用户之前咨询过的订单信息,在后续对话中主动引用,甚至能在处理一个长达数小时的复杂退换货流程中,随时暂停等待人工审核,并在审核后从断点处无缝恢复。这种“状态持久化”和“流程编排”能力,正是LangGraph的核心价值所在。它由LangChain团队打造,但设计上完全独立,可以与任何LLM组件配合使用,目前已被Klarna、Replit、Elastic等前沿公司用于构建其核心的智能体产品。

2. 核心设计理念与架构解析

2.1 为什么需要“有状态”与“编排”?

传统基于LLM的聊天应用,大多是“一问一答”的无状态模式。每次请求都是独立的,模型不记得之前的对话历史(除非显式地将历史记录作为上下文传入)。这对于简单查询尚可,但一旦涉及需要多轮交互、决策分支、工具调用序列的复杂任务,这种模式的局限性就暴露无遗。

状态是智能体“记忆”和“情境”的载体。它不仅仅指对话历史,还包括:

  • 工作内存:当前任务执行中的临时变量,如已收集的用户信息、中间计算结果。
  • 长期记忆:跨会话保存的用户偏好、知识库索引等。
  • 执行上下文:当前流程走到了哪一步,下一个该调用什么工具。

编排则是管理状态如何随着智能体的每一步行动(调用LLM、执行工具、等待用户输入)而演变的规则。LangGraph将智能体工作流抽象为一个有向图,图中的节点代表一个可执行的动作(如“调用LLM分析用户意图”、“调用API查询数据库”),边则定义了基于当前状态,下一步应该执行哪个节点。

这种图结构带来了几个关键优势:

  1. 显式控制流:你可以清晰地定义循环、条件分支(if-else)、并行执行等复杂逻辑,这是编写线性提示词或简单链式调用难以实现的。
  2. 状态集中管理:所有数据流动都在一个中心化的状态对象中,便于调试、持久化和人工干预。
  3. 模块化与复用:每个节点(或子图)可以独立开发和测试,然后像乐高一样组合成更复杂的工作流。

2.2 LangGraph 的核心抽象:StateGraph

LangGraph最核心的类是StateGraph。你需要为其定义一个状态模式(通常是一个Pydantic模型),然后添加节点和边。

from typing import TypedDict, Annotated from langgraph.graph import StateGraph, END import operator # 1. 定义状态模式 class AgentState(TypedDict): # 用户输入的问题 question: str # 累积的对话历史 messages: Annotated[list, operator.add] # 从知识库检索到的相关文档 context: str # LLM生成的最终答案 answer: str # 2. 初始化图 workflow = StateGraph(AgentState) # 3. 定义节点函数 def retrieve_node(state: AgentState): # 模拟检索过程:这里可以根据state[‘question’]去查询向量数据库 retrieved_docs = “相关文档内容...” return {“context”: retrieved_docs} def generate_node(state: AgentState): # 组合问题和上下文,调用LLM生成答案 prompt = f“基于以下上下文:{state[‘context’]}, 回答问题:{state[‘question’]}” # 假设调用LLM llm_response = “生成的答案...” return {“answer”: llm_response, “messages”: [(“assistant”, llm_response)]} # 4. 添加节点 workflow.add_node(“retrieve”, retrieve_node) workflow.add_node(“generate”, generate_node) # 5. 设置入口点 workflow.set_entry_point(“retrieve”) # 6. 添加边,定义流程 workflow.add_edge(“retrieve”, “generate”) workflow.add_edge(“generate”, END) # 7. 编译图 app = workflow.compile()

这个简单的例子构建了一个“检索-生成”工作流。但LangGraph的强大之处在于其条件边循环

2.3 实现复杂逻辑:条件边与循环

假设我们想让智能体在生成答案后,自我检查答案的质量,如果不够好,就重新检索或生成。

from langgraph.graph import StateGraph, END from langgraph.checkpoint import MemorySaver from langgraph.prebuilt import ToolNode from langchain_core.tools import tool # 定义一个自我评估的工具/节点 @tool def evaluate_answer(question: str, answer: str) -> str: “”“评估答案是否充分回答了问题。返回 ‘good’ 或 ‘bad’。 ”“” # 这里可以调用另一个LLM进行评估 return “good” if len(answer) > 20 else “bad” def routing_node(state: AgentState): # 根据评估结果决定下一步 eval_result = state.get(“evaluation”) if eval_result == “good”: return “end” else: return “revise” # 创建图... workflow = StateGraph(AgentState) workflow.add_node(“retrieve”, retrieve_node) workflow.add_node(“generate”, generate_node) workflow.add_node(“evaluate”, ToolNode([evaluate_answer])) workflow.add_node(“revise”, some_revision_function) workflow.set_entry_point(“retrieve”) workflow.add_edge(“retrieve”, “generate”) workflow.add_edge(“generate”, “evaluate”) # 关键:条件边 workflow.add_conditional_edges( “evaluate”, routing_node, # 这个函数返回下一个节点的名字 { “end”: END, “revise”: “revise” } ) workflow.add_edge(“revise”, “evaluate”) # 形成循环:修订后再次评估 app = workflow.compile()

通过add_conditional_edges,我们实现了基于动态评估结果的分支逻辑,并且通过将“修订”节点指回“评估”节点,形成了一个潜在的循环,直到答案被评估为“good”为止。这是构建具有自我修正能力的智能体的基础。

注意:在定义循环时,务必确保存在一个明确的退出条件(比如重试次数上限、评估通过),否则工作流可能会陷入无限循环。

3. 核心特性深度剖析与实操

3.1 持久化执行:构建“打不死”的智能体

这是LangGraph区别于许多框架的杀手级特性。持久化执行意味着智能体的状态可以被保存到外部存储(数据库、Redis、文件系统),并在中断后(如进程崩溃、服务器重启、计划暂停)精确地从断点恢复。

实现原理:LangGraph通过“检查点”机制实现。在每个节点执行后,框架可以选择将当前完整状态序列化并存储。恢复时,只需加载最新的检查点,图就会从该节点继续执行。

实操示例(使用内存检查点)

from langgraph.checkpoint import MemorySaver memory = MemorySaver() # 内存存储,适用于演示。生产环境需用RedisSaver等。 app = workflow.compile(checkpointer=memory) # 第一次执行,传入一个线程ID(thread_id)来标识这个会话 config = {“configurable”: {“thread_id”: “user_123_session_1”}} initial_state = {“question”: “LangGraph是什么?”, “messages”: []} result = app.invoke(initial_state, config=config) print(result[“answer”]) # 模拟中断... 程序重启 # 恢复执行:使用相同的thread_id,无需传入初始状态 # LangGraph会自动加载该线程的最新状态,并询问下一步该执行哪个节点 continued_result = app.invoke({“question”: “它和LangChain有什么区别?”}, config=config) # 此时,新的问题会被追加到状态中,并且工作流会基于已有的上下文继续运行。

生产环境配置:对于需要高可用的服务,应使用持久化存储。LangGraph提供了RedisSaverPostgresSaver等扩展。

# 示例:使用Redis(需安装langgraph-redis) from langgraph_redis import RedisSaver import redis redis_client = redis.Redis.from_url(“redis://localhost:6379”) checkpointer = RedisSaver(redis_client) app = workflow.compile(checkpointer=checkpointer)

实操心得:thread_id的设计非常巧妙。它不仅可以用于恢复会话,还可以用于实现“用户隔离”。每个用户或每个对话线程拥有独立的ID,确保状态不会互相污染。在设计系统时,可以将user_idsession_id组合起来生成thread_id

3.2 人工介入:将人类智能融入自动化流程

在关键决策点引入人工审核,是确保AI应用安全、可靠的重要手段。LangGraph的“中断”机制让这变得异常简单。

核心概念:在图的特定节点,你可以声明一个“中断”。当执行流到达该节点时,整个工作流会暂停,并将当前状态暴露出来,等待外部信号(如人工在UI上点击“批准”)后再继续。

实操示例

from langgraph.graph import StateGraph, END from langgraph.checkpoint import MemorySaver class StateWithApproval(TypedDict): input: str draft_response: str final_response: str approved: bool def draft_node(state: StateWithApproval): # 生成草稿回复 return {“draft_response”: “这是生成的草稿...”} def human_review_node(state: StateWithApproval): # 这个节点什么都不做,只是触发一个中断,等待人工输入。 # 关键:返回一个标记,告诉框架需要暂停。 return {“approved”: None} # 或者抛出一个特定异常,新版API有更优雅的方式 def publish_node(state: StateWithApproval): if state[“approved”]: return {“final_response”: state[“draft_response”]} else: return {“final_response”: “请求已被人工驳回。”} workflow = StateGraph(StateWithApproval) workflow.add_node(“draft”, draft_node) workflow.add_node(“human_review”, human_review_node) workflow.add_node(“publish”, publish_node) workflow.set_entry_point(“draft”) workflow.add_edge(“draft”, “human_review”) # 注意:从human_review到publish的边不是固定的,取决于人工输入后的状态。 workflow.add_conditional_edges( “human_review”, # 这个路由函数现在会检查人工审核后更新的state[‘approved’]值 lambda s: “publish”, {“publish”: “publish”} ) workflow.add_edge(“publish”, END) app = workflow.compile(checkpointer=MemorySaver()) # 执行到人工审核节点会暂停 config = {“configurable”: {“thread_id”: “review_1”}} try: result = app.invoke({“input”: “需要审核的内容”}, config=config) except Exception as e: # 这里会捕获到中断异常,在实际应用中,这个异常信息会被前端捕获 print(“工作流已暂停,等待人工审核。”) # 此时,可以从检查点中加载出当前状态,展示给审核员 # snapshot = app.get_state(config) # print(snapshot.values[‘draft_response’]) # 模拟人工在UI上点击“批准” # 我们需要更新状态中的 ‘approved’ 字段,然后继续执行 app.update_state(config, {“approved”: True}) # 继续执行 final_result = app.invoke(None, config=config) # 传入None表示从暂停处继续 print(final_result[“final_response”])

在实际部署中,你的后端服务会捕获中断,将thread_id和当前状态存入数据库,并通知前端。审核员在界面上看到草稿,点击按钮后,后端调用app.update_state更新状态并触发app.invoke继续执行。

3.3 与LangChain生态的集成

虽然LangGraph可独立使用,但与LangChain结合能极大提升开发效率。你可以直接使用LangChain的LCEL(LangChain Expression Language)来定义节点,并集成海量的工具、检索器等组件。

from langchain_openai import ChatOpenAI from langchain_community.tools import DuckDuckGoSearchRun from langgraph.prebuilt import ToolNode, create_react_agent from langgraph.graph import StateGraph, MessagesState # 使用LangChain的ChatModel和Tools llm = ChatOpenAI(model=“gpt-4-turbo”) tools = [DuckDuckGoSearchRun()] # 方法1:使用预建的ReAct智能体 # create_react_agent内部已经构建好了一个标准的思考-行动-观察循环图 agent = create_react_agent(llm, tools) # 方法2:自定义图,但节点使用LangChain组件 def llm_node(state: MessagesState): # state[‘messages’] 是一个LangChain格式的消息列表 response = llm.invoke(state[‘messages’]) return {“messages”: [response]} def tool_node(state: MessagesState): # 使用预建的ToolNode,它能自动根据消息内容选择并执行工具 tool_node = ToolNode(tools) return tool_node.invoke(state) workflow = StateGraph(MessagesState) workflow.add_node(“agent”, llm_node) # 思考 workflow.add_node(“action”, tool_node) # 行动 workflow.add_edge(“agent”, “action”) workflow.add_edge(“action”, “agent”) # 形成ReAct循环 # 还需要条件边来决定何时结束,这里简化了

集成心得ToolNodecreate_react_agent这类预构建模块能快速搭建原型。但在复杂场景下,你往往需要更精细的控制,例如定制工具的选择逻辑、修改ReAct的提示词模板。这时,理解底层图结构,自己从头构建或继承修改这些预建模块,是更优的选择。

4. 生产环境部署与调试实战

4.1 利用LangSmith进行深度可观测性

当你构建的智能体工作流拥有几十个节点和复杂分支时,仅靠打印日志来调试将是噩梦。LangSmith提供了对LangGraph工作流的原生深度支持。

核心功能

  1. 轨迹可视化:以图的形式完整展示一次调用的执行路径,哪个节点被执行了,输入输出状态是什么,一目了然。
  2. 状态快照:查看每个步骤前后状态的完整差异,精准定位数据是如何被修改的。
  3. 性能指标:记录每个节点(LLM调用、工具执行)的耗时,帮助进行性能优化。
  4. 在线调试:可以直接在LangSmith UI中修改某个节点的输入,重新运行后续流程,进行“时间旅行”调试。

配置步骤

  1. 设置环境变量。
    export LANGCHAIN_TRACING_V2=true export LANGCHAIN_API_KEY=“your_langchain_api_key” export LANGCHAIN_PROJECT=“your_project_name” # 可选,默认为default
  2. 正常执行你的LangGraph应用。所有调用轨迹会自动发送到LangSmith。
  3. 登录LangSmith平台,在“Traces”页面即可查看详细的执行记录。

调试案例:假设你的智能体在某个节点给出了错误答案。你可以在LangSmith中打开这次轨迹,点击出错的节点,查看当时传入该节点的完整state是什么,LLM接收到的提示词是否准确,工具返回的结果是否正确。你甚至可以复制该节点的状态,在Playground中修改提示词或参数,重新运行看结果是否改善。

4.2 部署策略与模式

将LangGraph应用部署为长期运行的服务,需要考虑以下几个关键点:

1. 无状态服务 + 外部检查点存储这是推荐的主流架构。你的Web服务器(如FastAPI)本身是无状态的,它只承载业务逻辑和LangGraph图的定义。所有会话状态都通过RedisSaverPostgresSaver保存在外部数据库中。

  • 优点:服务可以水平扩展,任何一台服务器实例都能处理任何用户的请求,只需从共享存储中加载对应的检查点。
  • 架构示例
    用户请求 -> [负载均衡器] -> [Web服务器实例 (FastAPI + LangGraph App)] | v [Redis/Postgres (存储检查点)] | v [LangSmith (监控)] [LLM API (如OpenAI)]

2. 异步与流式响应对于需要长时间运行的任务(如文档处理、复杂数据分析),应使用异步端点,避免阻塞HTTP请求。同时,利用LangGraph和LLM的流式输出能力,逐步将结果返回给客户端,提升用户体验。

from fastapi import FastAPI, BackgroundTasks from pydantic import BaseModel import asyncio app_fastapi = FastAPI() # 假设这是你已经编译好的LangGraph应用 langgraph_app = workflow.compile(checkpointer=RedisSaver(...)) class TaskRequest(BaseModel): thread_id: str input: str @app_fastapi.post(“/run”) async def run_agent(request: TaskRequest, background_tasks: BackgroundTasks): # 异步执行长任务 background_tasks.add_task(execute_agent, request.thread_id, request.input) return {“message”: “任务已开始”, “thread_id”: request.thread_id} async def execute_agent(thread_id: str, user_input: str): config = {“configurable”: {“thread_id”: thread_id}} initial_state = {“messages”: [(“user”, user_input)]} # 如果是支持流式的图,可以使用 .astream() async for event in langgraph_app.astream(initial_state, config=config): # 处理流式事件,例如发送到WebSocket # event 类型可能是 ‘on_chain_start‘, ‘on_chain_end‘, ‘on_llm_stream‘ 等 if hasattr(event, ‘data’) and hasattr(event.data, ‘chunk’): # 假设我们只处理LLM的token流 token = event.data.chunk.content # 通过WebSocket发送token给前端 # await websocket.send_text(token) pass

3. 错误处理与重试在节点函数中实现健壮的错误处理。对于暂时性错误(如网络超时),可以使用指数退避策略进行重试。LangGraph的持久化特性使得重试非常安全,即使重试过程中服务器重启,也能从上一个成功检查点继续。

from tenacity import retry, stop_after_attempt, wait_exponential import httpx @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10)) def call_external_api_safely(params): # 调用外部API,失败时会自动重试最多3次 response = httpx.post(“https://api.example.com”, json=params, timeout=30.0) response.raise_for_status() return response.json() def my_risky_node(state): try: result = call_external_api_safely(state[‘query’]) return {“api_result”: result} except Exception as e: # 如果重试后仍然失败,可以更新状态,让工作流进入错误处理分支 return {“error”: str(e), “status”: “failed”}

4.3 性能优化与成本控制

节点粒度:节点的设计不宜过粗也不宜过细。过粗(一个节点做太多事)不利于复用和调试;过细(每个LLM调用都是一个节点)会增加图遍历的开销。一个好的实践是,将一次完整的“思考-行动”循环或一个清晰的业务步骤作为一个节点。

状态设计:状态对象应只包含必要的数据。避免将大型、不常修改的对象(如整个知识库索引)放在状态中频繁序列化/反序列化。可以将它们放在节点的闭包或全局上下文中,状态里只保存引用ID。

LLM调用优化

  • 缓存:对内容确定、结果可复用的LLM调用(如固定指令的格式化)使用缓存。LangChain支持多种缓存后端(InMemory, Redis, SQLite)。
  • 批处理:如果应用场景允许,将多个独立的问题批量发送给LLM API,可以显著降低延迟和成本。
  • 模型选型:在非关键路径或简单任务上使用小型、快速的模型(如gpt-3.5-turbo),只在复杂推理时使用大模型(如gpt-4)。

5. 常见问题与排查技巧实录

在实际开发和运维中,你肯定会遇到各种问题。以下是一些典型场景及解决思路。

5.1 状态管理相关问题

问题1:状态对象在节点间传递时,数据丢失或覆盖。

  • 原因:每个节点返回的字典用于更新全局状态。如果返回{“key”: “new_value”},它会完全替换掉状态中原有的key字段。对于列表等可变对象,直接赋值会导致旧数据丢失。
  • 解决方案:使用Annotated类型提示。这是LangGraph推荐的方式,它定义了如何合并更新。
    from typing import TypedDict, Annotated import operator class MyState(TypedDict): # 使用 operator.add 来合并列表 conversation_history: Annotated[list, operator.add] # 对于字典,可以使用 operator.or_ 来合并更新 metadata: Annotated[dict, operator.or_] # 标量值直接替换 current_step: str
  • 排查工具:在LangSmith中查看每个节点执行前后的状态差异(Diff视图),这是定位数据流问题的利器。

问题2:检查点文件过大,导致存储和加载缓慢。

  • 原因:状态中存储了大型二进制数据(如图片、长文档文本)。
  • 解决方案
    1. 外部存储:将大文件存储到对象存储(如S3)或文件系统,在状态中只保存其URL或文件路径。
    2. 惰性加载:在节点函数中,根据路径动态加载所需的数据,而不是在初始化状态时就全部载入。
    3. 压缩:如果必须存储文本,考虑使用zlib等库进行压缩。

5.2 工作流执行逻辑问题

问题3:智能体陷入无限循环,无法结束。

  • 原因:条件边(add_conditional_edges)的路由函数逻辑有误,或者循环缺少终止条件。
  • 排查步骤
    1. 打印路由决策:在路由函数中加入日志,输出其判断逻辑和返回值。
    2. 使用LangSmith可视化:查看轨迹图,循环路径会非常明显。
    3. 设置最大迭代次数:这是最有效的防护措施。可以在状态中增加一个计数器(如iteration_count),在循环节点中递增它,并在路由函数中检查是否超过阈值。
      def routing_node(state): if state.get(“iteration_count”, 0) > 10: return “force_end” # ... 原有的路由逻辑

问题4:人工中断后,无法正确恢复执行。

  • 原因:恢复执行时,传入的config(特别是thread_id)与中断时不匹配,或者中断节点的状态更新逻辑有误。
  • 检查清单
    • 确保前端传递的thread_id与创建会话时完全一致。
    • 确保在调用app.update_state(config, update_dict)时,update_dict中包含能改变路由决策的关键字段(例如将approvedNone改为True)。
    • 检查中断节点的设计,确保它确实会触发等待(例如,在旧版中可能通过抛出HumanInTheLoop异常实现,新版有更明确的interrupt机制)。

5.3 与外部系统集成问题

问题5:工具调用(如API请求)失败,导致整个工作流阻塞。

  • 原因:网络波动、第三方服务不可用、参数错误等。
  • 解决方案
    1. 节点内部重试:如前文所述,使用tenacity等库在节点函数内部实现重试逻辑。
    2. 设置备用路径:在图中设计一个“降级”或“错误处理”节点。当工具节点失败时,通过条件边将状态路由到该节点,执行备用逻辑(如返回缓存数据、提示用户稍后重试)。
    3. 超时控制:为所有外部调用设置合理的超时时间,避免长时间阻塞。

问题6:并发执行时,同一thread_id的状态发生冲突。

  • 原因:两个并发的请求(如来自同一用户的快速连续点击)试图同时修改同一个检查点。
  • 解决方案
    • 乐观锁:许多检查点存储实现(如RedisSaver)支持乐观并发控制。确保你使用的存储后端支持此功能。
    • 请求队列:对于关键工作流,在网关层对同一thread_id的请求进行序列化处理,确保同一时间只有一个请求在处理。
    • 设计幂等性:确保你的节点函数和工作流是幂等的,即使被重复执行,最终结果也是一致的。结合检查点机制,这能有效缓解并发问题。

构建基于LangGraph的智能体系统是一个将复杂业务逻辑清晰化、模块化的过程。它要求开发者从“链式思维”转向“图思维”,更关注状态流转和决策逻辑。初期学习曲线可能稍陡,但一旦掌握,你将获得构建真正强大、可靠、可维护的AI应用的能力。从我个人的经验来看,从简单的线性流程开始,逐步引入条件分支、循环和人工中断,是快速上手的最佳路径。多利用LangSmith进行调试和观察,它能让你直观地理解你的智能体是如何“思考”和“行动”的,这是任何日志都无法替代的。

http://www.jsqmd.com/news/773908/

相关文章:

  • C3TL框架:轻量级基因表达扰动预测新方法
  • 国产CRM系统排名:国产八大主流CRM软件系统排行
  • 如何快速定位Windows热键冲突:Hotkey Detective实用指南
  • Three.js实时调试新范式:基于MCP协议的AI对话式开发工具箱
  • 专业指南:5步高效使用AMD Ryzen调试工具SMUDebugTool
  • 基于LLM的学术论文智能摘要与思维导图自动生成工具实践
  • 掌握3大技巧:用Marketch插件实现Sketch到HTML的高效转换
  • 2026年评价高的深圳公寓床横向对比厂家推荐 - 品牌宣传支持者
  • 小米手表表盘设计工具Mi-Create:零代码打造个性智能穿戴界面
  • 规范驱动开发:从OpenAPI到自动化代码与测试的工程实践
  • AISMM汇报模板进入倒计时适配期:SITS2026明确要求2024年Q4起强制启用V3.1——现在不学,下次报送即触发监管问询
  • 开源项目文档优化终极指南:从README到API文档的完整方法论
  • 白嫖半年免费手机录音转文字亏大了,2026实测29块用一年每月多省22小时血赚
  • Godot多语言绑定全景指南:从GDScript到Rust的选型与实践
  • 2025届必备的五大降AI率助手横评
  • 深度强化学习在电压源逆变器控制中的创新应用
  • 从Cursor实战工作坊看AI编程协作:思维转变与高效工作流
  • csdn-mcp-server
  • Godot Pixel Renderer:3D模型实时渲染像素艺术工作流详解
  • 如何高效将漫画转换为电子书格式:KCC完整实用指南
  • 基于MCP协议的AI驱动SSH工具:让AI助手远程管理服务器
  • AISMM Level 3→Level 4跃迁卡点全拆解,技术雷达如何成为唯一可信度量仪表盘?
  • 百度网盘直链解析工具完整指南:三步实现高效下载方案
  • WatermarkRemover:如何用AI技术一键清除视频中的固定水印?
  • 智能穿戴健康系统:AI+物联网,筑牢ToB组织健康安全防线
  • 批量导入私域客户数据的 API 使用方法
  • 为什么Windows系统强制使用Edge?理解协议劫持与EdgeDeflector的解决方案
  • 第七篇 量子模拟民用场景:金融、新材料、生物医药全域低成本落地应用
  • 2026年推荐一家吉林市隔热窗膜实力排行榜 - 品牌宣传支持者
  • 收藏!小白程序员必看:如何用Tair构建秒级响应的AI Agent记忆系统?