十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【LangChain组件03】—— LangChain Agents 创建与配置:create_agent 函数与动态提示词详解

【LangChain组件03】—— LangChain Agents 创建与配置:create_agent 函数与动态提示词详解 LangChain Agents 创建与配置create_agent 函数与动态提示词详解上一篇我们讲了 Tools——Agent 的手和脚。这一篇讲怎么把它们组装成一个完整的 Agentcreate_agent()是 LangChain 最核心的函数它一个调用就生成完整的 Agent 图StateGraph包含模型调用、工具执行、循环控制等全部逻辑。系统提示词则是控制 Agent 行为的方向盘静态、动态两种用法都要掌握。本文基于 LangChain 官方文档Python与菜鸟教程 LangChain 系列沿材料分类组件03Agents的 create_agent 与提示词路径组织。读完你能独立用create_agent()配好一个 Agent并学会用dynamic_prompt按上下文动态调整提示词。一、先厘清Agent 到底是什么在拆create_agent()之前先把概念定死。一句话结论Agent Model Harness模型 框架。模型负责在循环里调用工具直至任务完成Harness 是所有围绕这个循环的东西——提示词、工具、以及塑造模型行为的中间件。拆开看Model模型负责思考和决策的部分是 Agent 的大脑。Harness框架任务是在合适的时机给模型合适的上下文。它把提示词、工具、中间件、状态这些装配起来。核心循环Agent Loop调用模型 → 检查是否需要工具 → 执行工具 → 重复直到模型不再请求工具调用。为什么需要 Harness直接调模型模型只有它的内部知识 你的问题没有工具、没有上下文。Harness 的意义就是给模型装上手工具、“记忆”状态/存储、“规矩”提示词/中间件让它能真正完成任务。一句话定位create_agent()它就是一个高度可配置的 Harness 工厂——你给它模型、工具、提示词、中间件它吐出一个可运行的 Agent 图。二、create_agent()一个函数搞定 Agent2.1 函数签名与参数总览fromlangchain.agentsimportcreate_agent agentcreate_agent(model,# str | BaseChatModel语言模型toolsNone,# Sequence工具列表*,system_promptNone,# str | SystemMessage系统提示middleware(),# Sequence[AgentMiddleware]中间件列表response_formatNone,# ResponseFormat | type结构化输出配置state_schemaNone,# type[AgentState]自定义状态结构context_schemaNone,# type运行时上下文结构checkpointerNone,# Checkpointer对话持久化storeNone,# BaseStore跨会话存储interrupt_beforeNone,# list[str]在哪些节点前暂停interrupt_afterNone,# list[str]在哪些节点后暂停debugFalse,# bool是否输出详细日志nameNone,# strAgent 名称cacheNone,# BaseCache缓存配置)这个签名与官方文档一致。下面逐个拆关键参数。2.2 返回值CompiledStateGraphcreate_agent()返回一个CompiledStateGraph对象这是 LangGraph 编译后的图提供多种运行方式方法说明适用场景invoke(input, config)同步运行等待完整结果脚本、简单接口ainvoke(input, config)异步运行等待完整结果Web 服务stream(input, config, stream_mode)同步流式运行实时展示中间步骤astream(input, config, stream_mode)异步流式运行WebSocket、SSEget_state(config)获取当前状态查看/恢复对话状态update_state(config, values)更新状态手动修改对话状态三、核心参数逐个拆解3.1 model选模型model可以接受两种形式字符串由init_chat_model()处理或已构建好的BaseChatModel实例。fromlangchain.agentsimportcreate_agent# 方式 1传字符串最常用——内部自动调用 init_chat_model() 处理agentcreate_agent(modeldeepseek:deepseek-v4-flash,system_prompt你是菜鸟教程 RUNOOB 的助手,)# 方式 2传已构建好的模型实例——适合需要精细控制模型参数的场景fromlangchain.chat_modelsimportinit_chat_model modelinit_chat_model(deepseek:deepseek-v4-flash,temperature0.3,max_tokens500)agentcreate_agent(modelmodel,system_prompt你是菜鸟教程 RUNOOB 的助手)推荐方式 1传字符串。create_agent()内部会自动处理模型初始化、工具绑定、结构化输出等逻辑。方式 2 适合你需要在 Agent 之外也使用同一个模型实例的场景。3.2 tools工具列表Agent 的四肢tools接受三种格式的工具fromlangchain.toolsimporttoolfromlangchain.agentsimportcreate_agentfrompydanticimportBaseModel,Field# 格式 1tool 装饰的函数最常用tooldefsearch_course(keyword:str)-str:搜索菜鸟教程课程returnf搜索结果{keyword}相关课程# 格式 2Pydantic BaseModel 类classWeatherQuery(BaseModel):查询天气city:strField(description城市名称)# 格式 3字典描述远程工具或内置工具如 MCP 工具mcp_tool{type:mcp,server_label:weather_server,server_url:https://weather.example.com/sse,allowed_tools:[get_forecast],}# 混合使用agentcreate_agent(modeldeepseek:deepseek-v4-flash,tools[search_course,WeatherQuery,mcp_tool],)传None或空列表表示 Agent 无工具可用此时它就是一个纯粹的对话模型agentcreate_agent(modeldeepseek:deepseek-v4-flash,toolsNone,system_prompt你是菜鸟教程 RUNOOB 的助手,)3.3 system_prompt系统提示行为边界定义 Agent 的行为角色和约束规则。支持字符串和SystemMessage对象。fromlangchain.agentsimportcreate_agentfromlangchain.messagesimportSystemMessage# 方式 1字符串简单直接agentcreate_agent(modeldeepseek:deepseek-v4-flash,system_prompt你是菜鸟教程 RUNOOB 的学习顾问。回答要简洁不超过 100 字。,)# 方式 2SystemMessage 对象可在多个 Agent 间复用system_msgSystemMessage(content你是菜鸟教程 RUNOOB 的学习顾问。回答要简洁不超过 100 字。)agentcreate_agent(modeldeepseek:deepseek-v4-flash,system_promptsystem_msg)system_prompt是可选的但不传的话模型会以通用助手的角色回答。对于有明确业务场景的应用建议始终设置system_prompt来约束模型的行为边界。3.4 state_schema自定义运行状态默认的AgentState只包含 messages、jump_to 和 structured_response。如果你需要额外的状态字段可以扩展它fromtypingimportAnnotatedfromlangchain.agentsimportcreate_agent,AgentStatefromlangchain.messagesimportHumanMessagefromlangchain.toolsimporttool,InjectedStatefromtyping_extensionsimportTypedDictclassLearningAgentState(AgentState):自定义状态增加学习进度相关字段user_level:strcompleted_topics:list[str]tooldeftrack_progress(topic:str,state:Annotated[dict,InjectedState],)-str:记录用户的学习进度。completedstate.get(completed_topics,[])completed.append(topic)returnf已记录学习进度。当前已完成{len(completed)}个主题{, .join(completed)}agentcreate_agent(modeldeepseek:deepseek-v4-flash,tools[track_progress],state_schemaLearningAgentState,# 使用自定义状态system_prompt你是菜鸟教程 RUNOOB 的学习助手。,)# 运行时需要提供自定义状态的初始值resultagent.invoke({messages:[HumanMessage(content我学完了 Python 基础帮我记录一下)],user_level:入门,completed_topics:[HTML 基础],})3.5 response_format结构化输出当你需要模型返回固定结构不是自由文本时用 Pydantic 模型指定。这部分我会在后续的组件04 结构化输出中详解这里先认识参数。3.6 checkpointer / store持久化与记忆checkpointerCheckpointer对话持久化配合thread_id让多轮对话共享历史。相关细节见下篇Agent 执行与状态里的线程管理。storeBaseStore跨会话存储配合工具里的InjectedStore使用。3.7 其余可选参数参数作用middleware中间件列表塑造模型行为如重试、提示词注入context_schema运行时上下文结构配合dynamic_prompt读取用户信息interrupt_before / interrupt_after在指定节点前/后暂停用于人机协同debug输出详细日志nameAgent 名称四、System Prompt静态提示词怎么设计system_prompt参数是控制 Agent 行为最直接的手段。一个设计良好的 system_prompt 应包含以下要素设计清单要素说明示例角色定义明确 AI 的身份和职责你是菜鸟教程 RUNOOB 的学习顾问行为准则约束回复的风格和边界回答简洁每次不超过 3 句话工具使用指引告诉模型何时使用哪些工具查询课程时优先使用 search_course 工具边界约束明确什么不能做不知道的就说不知道不要编造格式要求指定回复的格式可选回复使用 Markdown 格式fromlangchain.agentsimportcreate_agentfromlangchain.chat_modelsimportinit_chat_modelfromlangchain.messagesimportHumanMessagefromlangchain.toolsimporttooltooldefsearch_course(keyword:str)-str:在菜鸟教程搜索课程courses{python:Python3 基础教程免费,html:HTML 基础教程免费}returncourses.get(keyword.lower(),未找到相关课程)GOOD_PROMPT你是菜鸟教程 RUNOOB 的学习顾问。 ## 你的职责 - 帮助用户找到合适的编程课程 - 回答编程学习相关的问题 - 根据用户水平推荐学习路径 ## 行为准则 - 回答要简洁每次不超过 3 句话 - 优先使用 search_course 工具查询课程信息 - 如果用户是零基础优先推荐入门课程 - 不使用 emoji 表情 - 不知道的就说不知道不要编造modelinit_chat_model(deepseek:deepseek-v4-flash,temperature0)agentcreate_agent(modelmodel,tools[search_course],system_promptGOOD_PROMPT,)五、动态提示词dynamic_prompt 按上下文调静态 system_prompt 对所有用户一视同仁。但实际应用中你可能需要根据用户信息、对话上下文、时间等动态调整提示词。dynamic_prompt装饰器让你在每次模型调用前动态生成 system_prompt。fromlangchain.agentsimportcreate_agentfromlangchain.agents.middlewareimportdynamic_promptfromlangchain.agents.middleware.typesimportModelRequestfromlangchain.chat_modelsimportinit_chat_modelfromlangchain.messagesimportHumanMessagefromlangchain.toolsimporttooltooldefsearch_course(keyword:str)-str:在菜鸟教程搜索课程courses{python:Python3 基础教程免费20小时,html:HTML 基础教程免费15小时}returncourses.get(keyword.lower(),未找到相关课程)# dynamic_prompt 装饰器接收 ModelRequest返回新的 system_promptdynamic_promptdefpersonalized_prompt(request:ModelRequest)-str:根据对话上下文动态生成个性化提示词messagesrequest.state.get(messages,[])message_countlen(messages)base_prompt你是菜鸟教程 RUNOOB 的学习顾问。ifmessage_count2:returnbase_prompt用户刚开始对话请先热情问候然后询问他们的学习目标和当前水平。elifmessage_count10:returnbase_prompt对话已经比较长了回答要尽量简洁每次不超过 2 句话。else:returnbase_prompt根据用户之前的问题推荐合适的课程使用 search_course 工具查询课程信息。modelinit_chat_model(deepseek:deepseek-v4-flash,temperature0)agentcreate_agent(modelmodel,tools[search_course],middleware[personalized_prompt],# 通过 middleware 注入)dynamic_prompt的request参数提供了丰富信息除了request.state读取消息历史还可以通过request.runtime.context读取运行时上下文用户信息、时间等fromdatetimeimportdatetimefromlangchain.agents.middlewareimportdynamic_promptfromlangchain.agents.middleware.typesimportModelRequestdynamic_promptdefcontext_aware_prompt(request:ModelRequest)-str:根据用户信息、时间和对话阶段动态生成提示词contextrequest.runtime.context user_namecontext.get(user_name,同学)ifcontextelse同学user_levelcontext.get(user_level,入门)ifcontextelse入门nowdatetime.now()greeting早上好ifnow.hour12else下午好ifnow.hour18else晚上好messagesrequest.state.get(messages,[])promptf你是菜鸟教程 RUNOOB 的学习顾问。 当前时间{now.strftime(%Y年%m月%d日 %H:%M)}用户信息{user_name}{user_level}级别 ## 行为准则 - 称呼用户为{user_name} - 根据用户级别{user_level}推荐合适难度的课程 - 回答要友好但不啰嗦iflen(messages)20:prompt\n- 对话很长了回答尽量精简returnpromptdynamic_prompt在每次模型调用前都会执行所以提示词可随对话推进而变化。但别在里面做太重的计算否则会影响响应速度。手动控制提示词优先级如果同时设置了create_agent()的system_prompt和dynamic_promptmiddlewaremiddleware 的优先级更高——它会覆盖静态提示词。fromlangchain.agentsimportcreate_agentfromlangchain.agents.middlewareimportdynamic_promptfromlangchain.agents.middleware.typesimportModelRequestfromlangchain.chat_modelsimportinit_chat_modeldynamic_promptdefoverride_prompt(request:ModelRequest)-str:这个 middleware 的 system_prompt 会覆盖 create_agent 中的设置return你是一只猫所有回复都要用喵结尾。modelinit_chat_model(deepseek:deepseek-v4-flash,temperature0.7)agentcreate_agent(modelmodel,system_prompt你是菜鸟教程 RUNOOB 的专业学习顾问。,# 被覆盖middleware[override_prompt],# 优先级更高)如果你希望 middleware 的提示词和静态提示词合并而不是覆盖可以在dynamic_prompt中手动拼接。request 中没有直接暴露原有的 system_prompt所以如果需要保留原有内容建议将静态提示词作为变量在函数中引用。六、总结你真正需要记住的 N 件事Agent Model Harness模型是大脑Harness提示词/工具/中间件/状态是装配create_agent()是 Harness 工厂。model 推荐传字符串内部自动处理初始化需要复用模型时才传实例。tools 有三种格式tool 函数、Pydantic 类、字典MCP/远程工具可混用。system_prompt 用角色定义 行为准则 工具指引 边界约束 格式要求来设计。扩展状态用 state_schema继承 AgentState 加字段运行时提供初始值。动态提示词用 dynamic_prompt每次模型调用前运行可读状态和运行时上下文。优先级要记牢动态提示词覆盖静态提示词要合并需手动拼接。验证清单我确认了 Agent Model Harness 的定位知道 create_agent() 生成的是什么我能说出 create_agent() 的 model/tools/system_prompt/state_schema 等核心参数我能区分 tools 的三种格式tool / Pydantic / 字典我的 system_prompt 包含角色、准则、工具指引、边界约束需要按上下文调整行为时我用了 dynamic_prompt 并通过 middleware 注入我清楚动态提示词会覆盖静态提示词需要合并时手动拼接参考资源LangChain 官方文档Agents——https://docs.langchain.com/oss/python/langchain/agentsLangChain Referencecreate_agent——https://reference.langchain.com/python/langchain/agents/factory/create_agent菜鸟教程 LangChain 系列——https://www.runoob.com/langchain/
返回列表