LLM结构化的概念讲解

1. 如何使用 Pydantic 定义结构化输出 Schema?(接口契约)

在没有结构化输出之前,让 LLM 写代码就像是对着对讲机喊话,对方回复的格式完全不可控。

你可以把Pydantic 定义的 Schema ,类比为微服务 RPC 通信中定义的 Protobuf ( .proto****文件) ,或者是 C++ 中的强类型结构体(Struct)。它明确规定了数据的"形状"。

思考逻辑:它是如何约束 Claude 的?

这并非简单的魔法,而是一个严密的转换流程:

  • 第一步(定义) :我们写下 class CoderOutputSchema(BaseModel),并用 Field 注释每个字段。
  • 第二步(翻译) :LangChain 底层的 **.with_structured_output()**会自动把这个 Python 类 ,翻译成标准的 JSON Schema。
  • 第三步(调用) :LangChain 在向 Claude 发起 HTTP 请求时,会利用 Claude 的 Tool Calling(工具调用) 能力。它告诉 Claude:"你现在不是在聊天,你必须调用一个名为 CoderOutputSchema****的工具,并且必须填满 code****和 description****这两个参数。"
  • 第四步(解析):Claude 乖乖按要求返回了一段 JSON。LangChain 拿到后,又会自动用 Pydantic 把这段 JSON 反序列化成一个 Python 对象。

代码细节剖析:

复制代码
class CoderOutputSchema(BaseModel):
    # Field 的 description 非常关键!
    # 它不仅是给程序员看的注释,它会被作为 Prompt 的一部分直接喂给大模型。
    code: str = Field(description="生成的 Python 技能代码。必须是纯代码...")
    description: str = Field(description="对这段代码功能的简要描述。")
  • 防呆设计 :通过设定 code: str,如果 Claude 脑抽返回了一个数字或者列表,Pydantic 会在这一层直接抛出校验异常(ValidationError),而不会让这个脏数据流到下一个节点去引发崩溃。

2. 节点如何处理 LLM 的响应?(适配器模式)

在 LangGraph 中,节点(Node)本质上扮演着"适配器(Adapter)"的角色。

它像一个中间件,屏蔽了上下游的数据差异。它的左手边是 LangGraph 的全局 State,右手边是外部的 LLM。

思考逻辑:节点的数据流转过程

我们可以把 real_coder_node 的内部处理过程拆分为"拆解、调用、组装"三步:

  • 步骤一:拆解入参(从 State 提取上下文)
    • 节点接收到全局的字典 state。
    • 它从中提取 LLM 需要的信息:user_req = state.get("user_requirement")。节点就像一个尽职的拦截器,只拿自己需要的数据,不管全局状态里还有什么其他乱七八糟的字段(比如之前的报错日志)。
  • 步骤二:执行调用(拿到结构化对象)
    • 调用 response = structured_llm.invoke(prompt)。
    • 重点来了 :因为前面绑定了 Pydantic,这里的 response 已经不再是一段字符串文本了!它是一个实例化的 Python 对象。
    • 这就意味着,我们不需要写繁琐的代码去解析诸如 {"code": "...", "desc": "..."} 这样的字符串,而是可以直接通过点属性(点操作符)来访问数据:response.code。这就像在操作一个强类型的对象,极其安全和方便。
  • 步骤三:组装返回值(构建 State 补丁)
    • 节点不能把 response 这个对象直接丢给 LangGraph(因为 LangGraph 不认识它,只认识 State 中定义好的字段)。

    • 所以节点需要做一个"数据映射",把 LLM 的结果组装成图引擎要求的补丁包(Patch):

      return {
      "current_code": response.code, # 把对象里的代码提取出来,对齐到 State 的字段
      "execution_logs": [f"生成的技能: {response.description}"] # 追加一条日志
      }


相关推荐
flash俊杰7 小时前
给 7B 小模型当 Agent 框架:真机三轮排障,十条失败链逐个补
langchain
打工仔折腾 AI9 小时前
LangChain 工具调用实战:从 Tool 定义到 Agent 执行链路拆解
java·前端·人工智能·后端·python·langchain·ai agent 实战
for_ever_love__10 小时前
LangChain 上线部署:把链和 Agent 变成能对外服务的 API
langchain·部署·fastapi·rest api·服务·上线·langserve
染指111012 小时前
145.Agent-LangGraph基础概念和安装和简单代码示例
java·服务器·数据库·langchain·agents
一木 之林12 小时前
LangChain 第6章 Agent 智能体核心:create_agent 统一入口与 ReAct 循环
前端·react.js·langchain
小王师傅6613 小时前
LangChain 系统化学习入门
学习·langchain
for_ever_love__13 小时前
LangChain 多工具协作:一个 Agent 不够用时怎么办
人工智能·langchain·langgraph·协作·多agent·多工具·工具编排
for_ever_love__13 小时前
LangChain 效果评测:没有评测,优化就是在瞎调
人工智能·学习·langchain·rag·评估·langsmith·评测指标
BD_Marathon14 小时前
ChatPromptTemplate初始化的六种参数类型
langchain
寻道码路14 小时前
AI Agent 工程化开发实战(一):Agent 开发的四个层次——积木、运行时、薄壳、套件
人工智能·langchain·大模型·ai agent·langgraph·ai工程化·deep agents