boxmoe_header_banner_img

Welcome to TrailblazerWu's world !

加载中

文章导读

Langchain&&Langgraph Agent框架


avatar
TrailblazerWu 2026年4月22日 171

开发代码

相关概念

智能体系统的组成结构和运行机制

智能体四大核心模块:感知,决策,行动,记忆

1.感知模块:输入理解与解析

感知模块是智能体架构中最前置的子系统,其主要职责是接受外部输入,并将非结构化的信息进行语义解析与任务意图识别,为后续的推理与执行模块提供标准化的中间表示,将原始输入转换为具备结构语义的任务元信息。

感知模块与决策模块之间构成直接的数据传导通路,同时,感知结果也被写入记忆系统用于上下文追踪

在基于大模型的智能体系统中,感知模块多由Prompt解析器和辅助函数组成,通过预设提示词模板引导模型识别输入中的意图类别、实体要素、任务参数与上下文状态,并以JSON,函数调用,标签结构等形式输出解析结果

2.决策模块:推理与规划逻辑

决策模块是智能体系统中的核心逻辑单元,主要负责在感知模块完成输入解析后,基于当前任务状态、上下文信息及历史交互轨迹,进行行为推理与任务规划。

该模块的本质是将语言模型的生成能力结构化应用于操作选择、路径规划与条件判断等任务控制环节。

整体决策过程中,RL方法用于优化策略迭代过程

在部分框架中,决策模块可嵌入ReAct策略,实现推理-行动-观察循环;也可结合函数调用协议,将模型推理结果映射为结构化调用指令。

3.行动模块:工具执行与响应

行动模块主要职责是将决策模块输出的行动计划映射为可执行的具体操作,并通过调用工具、接口、或系统组件完成实际任务执行。行动模块往往直连数据库,API接口、本地函数、设备驱动或自动化执行脚本。

行动模块通常由工具注册机制、执行调度器、输入参数适配器、结果反馈管理器构成

在以大模型为核心的智能体系统中,行动模块的实现依赖于函数调用机制的标准化定义,主流方法包括构建Function Schema,通过JSON Schema等方式明确定义工具函数的输入参数类型、输出结构与调用约束,模型生成结构化调用请求后,由框架完成实际函数绑定与执行。

多工具协同-工具链管理能力,支持多步工具组合调用与中间结果传递

4.记忆模块:上下文与持久状态

短期记忆:模型当前可直接读取的提示词上下文,包括最近若干轮对话、任务参数、中间调用结果,通常以内联方式拼接到提示词输入中,形式为本地变量或临时数据库中的缓存

长期记忆:持久化的数据结构,通常存储在外部数据库、文件系统或向量索引,保存重要实体信息、用户偏好、历史决策、领域知识。

智能体生命周期

1.启动与初始化

核心环节:

(1) 加载模型配置,包括模型名称、温度、最大Token长度等

(2) 注册工具函数并声明其功能及参数结构,供后续模型使用

(3) 加载模型记忆或上下文,以支持上下文拼接与长期记忆初始化

(4) 定义智能体的元信息,包括名称,角色设定,行为边界

(5) 对接数据库,API,或存储系统

为了提升可维护性,Agent 启动过程应支持配置项参数化,日志追踪,启动失败回退机制

还可进一步配置权限认证,模型热更新,工具动态注册

2.对话状态追踪机制

状态追踪可通过记忆模块来实现,通过注入回合内容、关键标记、上下文信息来实现(也可决定是否调用某个工具,是否进入子任务,是否回退)

3.中断恢复与持久化上下文

4.智能体注销与资源释放

(1)释放与模型、数据库、文件系统相关的句柄或连接资源

(2)清理会话中的临时状态变量、缓存数据与所占用的内存

(3)持久化必要的日志记录与上下文内容

(4)在多智能体协作场景下,通过广播或注销事件通知其他组件完成状态收敛

与外部系统的集成方式

1.WebAPI(通常注册为Tool)和插件机制

2.数据库系统:

(1) 基于自然语言解析,将用户指令映射为SQL操作

(2) 将数据库读写操作封装为tool

(3) 结合对话与记忆系统,将查询结果写入记忆用于后续推理

3.文件系统与代码执行环境(在沙盒或隔离环境中运行|可以在本地运行):具备受控访问本地文件系统,接入操作系统的能力

4.UI接口与中间层(前端与Agent的数据桥梁)数据封装传输

UI前端 Sreamlit react Gradio

中间层接口 HTTP REST API、WebSocket、FastAPI 负责接收用户输入、调度智能体响应、结构化输出格式、状态跟踪、文件上传、消息标识

Langchain框架

核心组件

底层Langchain Langgraph提供语言模型的控制流和有向状态图,作为核心接口抽象层,支持函数调用、链式调用、消息代理调度

中间组件层封装第三方插件、api、数据库、模型适配器、形成统一的工具集成接口

上层部署层由Langgraph Platgorm 与LangSmith组成,前者负责商业化流程编排与智能体运行调度,后者提供调试、测试、监控与提示词管理能力

1.chains 链式逻辑构造器

SimpleSequentialChain: 单输入单输出

SequentialChain: 多输入多输出  (eg.LLMChain封装每个子任务,SequentialChain将多个子任务串行执行)

2.Tools 集成

每个tool本质是带有描述信息(功能、输入参数输出接口格式)的函数包装器,通过tool装饰器,或继承BaseTool类注册为可调用对象

@tool(description="从向量存储中检索参考资料")
def rag_summarize(query: str)->str:
    return rag.rag_summarize(query)
from langchain.tools import BaseTool

class MyCustomTool(BaseTool): # 必须注册name description 必须覆写_run
    # 
    @property
    def name(self):
        return "The unique name of the tool that clearly communicates its purpose"  

    @property
    def description(self):
        return "Used to tell the model how/when/why to use the tool"

    
    def _run(self, query: str):
        return "result"

3.Memory管理

Langchain内置多种记忆类 如ConversationBufferMemory, ConversationBufferWindowMemory, ConversationSummaryMemory等分别适用于缓存

完整历史、滑动窗口或摘要式记忆需求

可通过配置Memory模块,控制字段参与记忆,缓存对话历史,也可通过回调接口将记忆信息持久化存储于数据库或向量索引

工具集成与函数调用机制

对外部函数、API、插件的封装与注册

包装规范

  • 继承BaseTool,@tool注册
  • 错误回退机制:避免重复写入数据库或出发外部接口变更等,异常捕获要清晰,以便向模型返回
  • 具备独立调试能力
  • 日志记录

执行环境与沙箱控制

  • 资源限制:时间、内存、调用深度
  • 沙箱环境,局部作用域或容器化环境,避免污染主进程及其他模块
  • 输入输出校验(正则校验、JSON Schema等),确保参数合法合规,可控
  • 日志记录

常用沙箱策略:Python multiprocessing;Docker;基于RestrictedPython的安全解释器

多工具顺序调用

  • 多个子工具合为一个工具
  • 借助chain等机制
  • 引入中间变量、上下文记忆、prompt

Langchain Agent

Langchain支持多种Agent类型,如ReActAgent,ChatAgent,ZeroShotAgent

Langgraph架构

优点:更复杂的逻辑控制(尤其多agent),error回退功能,或分支(不必像Langchain一样从头开始),工具也可作为节点

节点:定义执行内容,承载输入/输出接口,维护自身State->支持回溯 .add_node

边:定义执行顺序,支持条件判断、分支 .add_edge , .add_conditional_edges

状态(State):输入数据、中间计算结果、外部调用反馈、执行标记,在多智能体协作中还承担信息交换的作用

状态更偏重瞬时与局部,上下文则提供全局记忆

协作:Langchain提供功能实现和工具封装,Langgraph提供流程调度和状态管理

MCP 官方文档

to be continued…

实现分析

Langchain

Langchain 是一个LLM 应用开发框架,为各种LLM实现通用接口,简化LLM应用开发

主要框架:

1. PromptTemplate: 提示词模板,用于生成提示词

2. LLM

3. History 管理会话历史

4. Indexes 管理分析文档

5. Chains 构建功能的执行链条

6. Agents 构建智能体

支持LLMs ,聊天模型  invoke 批量 stream 流式

文本嵌入模型  embed_query 单个 embed_documents 批量

提示词模板 PromptTemplate FewShotPromptTemplate ChatPromptTemplate 都有format,invoke方法

ChatPromptTemplate 使用from_messages方法创建模板中若有MessagesPlaceholder提供一个key作为history的占位,则只能使用invoke注入history会话记录

RAG

Retrieval Augmented Generation: 检索增强生成,利用检索外部文档提升生成结果质量

标准流程:

1. 索引阶段:通过处理多种来源多种格式的文档提取其中文本,将其分为文本chunk,并进行向量化,存储在向量数据库中。

2. 检索阶段,用户输入的query被转换成向量表示,相似度匹配从数据库中检索相关性最强的文本chunk

3. 生成阶段:原始query和检索得到的文本chunk共同构成prompt提供给LLM

chain

Runnable 子类对象才能入链(以及Callable,Mapping接口子类对象)

class Runnable(ABC, Generic[Input, Output]):
    """A unit of work that can be invoked, batched, streamed, transformed and composed.

    Key Methods
    ===========

    - `invoke`/`ainvoke`: Transforms a single input into an output.
    - `batch`/`abatch`: Efficiently transforms multiple inputs into outputs.
    - `stream`/`astream`: Streams output from a single input as it's produced.
    - `astream_log`: Streams output and selected intermediate results from an
        input.

    Built-in optimizations:

    - **Batch**: By default, batch runs invoke() in parallel using a thread pool
        executor. Override to optimize batching.

    - **Async**: Methods with `'a'` prefix are asynchronous. By default, they execute
        the sync counterpart using asyncio's thread pool.
        Override for native async.

    All methods accept an optional config argument, which can be used to configure
    execution, add tags and metadata for tracing and debugging etc.

    Runnables expose schematic information about their input, output and config via
    the `input_schema` property, the `output_schema` property and `config_schema`
    method.

    Composition
    ===========

    Runnable objects can be composed together to create chains in a declarative way.

    Any chain constructed this way will automatically have sync, async, batch, and
    streaming support.

    The main composition primitives are `RunnableSequence` and `RunnableParallel`.

    **`RunnableSequence`** invokes a series of runnables sequentially, with
    one Runnable's output serving as the next's input. Construct using
    the `|` operator or by passing a list of runnables to `RunnableSequence`.

    **`RunnableParallel`** invokes runnables concurrently, providing the same input
    to each. Construct it using a dict literal within a sequence or by passing a
    dict to `RunnableParallel`.

通过|链接提示词模板对象和模型对象 ,返回RunnableSequence对象,是RunnableSerilalizable子类,也是一个Runnable的子类对象

StrOutputParser

用于将模型输出(AIMessage类型)解析为字符串,以便再输入模型(模型输入支持str,PromptTemplate等),是Runnable的子类,可以加入链中

JsonOutputParser

用于将模型输出(AIMessage类型)解析为Dict(json),再输入提示词模板,对上一个模型的输出进行处理,传入下个模型

RunnableLambda

Langchain内置,将普通函数转换为Runnable接口实例,方便自定义函数接入chain

RunnableLambda(func或lambda函数)

**直接将函数加入chain,也是可以的,这是因为Runnable接口类在实现__or__时,支持callable接口的实例**

History 临时记忆

基于RunnableWithMessageHistory类在原有chain基础上创建带有历史记录功能的新chain(新Runnable实例)

基于InMemoryChatMessageHistory类为历史记录提供内存存储(临时)

长期记忆

自行实现,基于BaseChatMessageHistory类,实现 add_messages(同步模式,添加消息),messages(同步模式,获取消息),clear(同步模式,清除消息)方法

document 与 document loader

class document 是Langchain内文档的统一载体,所有document loader最终返回此类的实例,document类核心记录page_content(文档内容)和metadata(文档元数据(字典,描述文档本身的数据))

document loader 提供了一套标准接口,用于将不同来源(CSV Json PDF)的数据转换为document类实例,document loader(内置或自行实现)须实现BaseLoader 接口

load() 一次性加载 lazy_load() 流式加载

vector store

接口:add_documents, delete , similarity_search

内置向量存储:InMemoryVectorStore

外部(Chroma)向量存储

向量检索入类

langchain中的向量存储对象,有一个方法:as_retriever(),返回一个Runnable接口的子类实例

retriever:

输入:提问 str

输出:检索结果 List[Document]

prompt

输入:提问+检索结果 dict

输出:提示词 PromptValue

RunnablePassThrough() 可以直接获取输入

chain=({"input":RunnablePassThrough(),"context":retriever|format_func}|prompt|model|StrOutputParser())

Agent

**目标驱动 工具调用 自主决策与迭代** Agent=LLM + Tools + Strategy

Agent in langchain

langchain.agents.create_agent 创建时tool 可自定义,在自定义函数前加@tool(description=”…”)(from langchain_core.tools import tool)

langchain.agents.create_agent 的流式输出(每个输出流都包含之前信息)

for chunk in agent.stream(
    {"messages":[{"role":"user","content":"..."}]}
    stream_mode = "values"
):
    latest_message = chunk["message"][-1]
    if latest_message.content:
        print(type(latest_message.__name__),latest_message.content)
    try:
        if latest_message.tool_calls:
            print(f"工具调用:{[tc['name'] for tc in latest_message.tool_calls]}")
    except AttributeError as e:
        pass

Agent react

Agent react = reasoning + action + observation

**langchain 的 agent 框架已经实现了react,并可以一次调用多个工具**

middleware

中间件的作用是对agent的每一步工作进行控制和自定义的执行

节点式hook(执行点顺序拦截):

@before_agent after_agent @before_model after_model

@before_model
def log_before_model(
    state:AgentState,  # Agent状态记录
    runtime:Runtime,    #执行过程中上下文信息
):
    logger.info(f"[log_before_model]即将调用模型,带有{len(state['messages'])}个消息")
    logger.debug(f"[log_before_model]{type(state['messages'][-1]).__name__}|{state['messages'][-1].content.strip()}")

    return None

针对工具和模型的包装式hook:

@wrap_model_call 每个模型调用时拦截

@wrap_tool_call 每个工具调用时拦截

@wrap_tool_call
def monitor_tool(
    # 请求的数据结构
    request: ToolCallRequest,
    #执行的函数本身(Callable),它接受ToolCallRequest作为输入,并返回ToolMessage或Command
    handler: Callable[[ToolCallRequest], ToolMessage | Command],
)-> ToolMessage | Command:
    
    logger.info(f"[tool monitor]执行工具:{request.tool_call['name']}")
    logger.info(f"[tool monitor]执行工具:{request.tool_call['args']}")
    try:
        result= handler(request)
        logger.info(f"[tool monitor]工具{request.tool_call['name']}执行完毕")


        if request.tool_call['name']=="fill_context_for_report":
            request.runtime.context["report"]=True
            logger.info(f"[tool monitor]工具{request.tool_call['name']}触发了报告场景的上下文填充")
        return result
    except Exception as e:
        logger.error(f"[tool monitor]工具{request.tool_call['name']}执行失败:{e}")
        raise e

@dynamic_prompt 动态切换提示词

@dynamic_prompt  #每一次生成提示词之前调用
def report_prompt_switch(request:ModelRequest):
    is_report = request.runtime.context.get("report",False)
    if is_report:
        return load_report_prompt()
    
    return load_system_prompt()

通过@上面名称 的装饰器方法自定义中间件



评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字
插入代码