
纲要项目背景与目标系统架构与流程多智能体协作模式Mermaid 流程图核心实现需求收集节点info提示词生成节点prompt工具调用结果处理add_tool_message状态路由get_state完整可运行代码项目结构依赖安装主程序prompt_assistant.py运行测试与效果总结与相关度说明项目背景编写高质量的提示词是充分发挥大模型能力的关键。然而很多用户并不清楚如何清晰地描述自己的需求。我们可以用 LangGraph 构建一个提示词生成助手它通过多轮对话收集用户的目标、变量、约束和要求然后自动生成结构化的提示词模板。整个流程模拟了“需求分析师→提示词工程师”的协作模式。系统架构工作流由三个主要节点构成通过条件路由实现智能跳转info与用户对话收集提示词的目标、变量、约束和要求。如果信息不完整继续追问如果收集完毕自动调用工具进入生成环节。add_tool_message处理工具调用的结果为生成节点准备上下文。prompt根据收集到的全部需求生成最终的提示词模板。信息不完整 继续追问调用工具直接结束开始info 节点 收集需求add_tool_message 处理工具结果prompt 节点 生成提示词结束核心实现State 设计工作流的状态仅包含消息列表利用MessagesState简化定义。节点实现info 节点向用户提问收集提示词的目标、变量、约束和要求。使用结构化输出模型来解析用户回复中的关键信息。add_tool_message 节点当 info 节点决定信息已收集完毕时会触发工具调用。此节点模拟工具的成功执行并将结果注入消息流。prompt 节点从消息历史中提取所有需求信息调用 LLM 生成最终的提示词模板。条件路由get_state函数检查最新消息的类型和内容如果 AI 消息包含工具调用则路由到add_tool_message如果是用户的消息且为最新则可能继续或结束否则继续在info节点循环。完整可运行代码项目结构prompt_assistant_demo/ ├── prompt_assistant.py ├── .env └── requirements.txt依赖安装pipinstalllanggraph langchain-openai python-dotenv pydantic环境配置.envOPENAI_API_KEYsk-xxxx主程序prompt_assistant.pyimportosimportuuidfromtypingimportLiteralfromdotenvimportload_dotenvfromlanggraph.graphimportStateGraph,END,MessagesStatefromlanggraph.checkpoint.memoryimportMemorySaverfromlangchain_openaiimportChatOpenAIfromlangchain_core.messagesimportHumanMessage,AIMessage,ToolMessagefromlangchain_core.promptsimportChatPromptTemplatefrompydanticimportBaseModel,Field load_dotenv()# ----- 1. 定义结构化输出模型 -----classPromptRequirements(BaseModel):goal:strField(description提示词的目标)variables:strField(description传入模板的变量用逗号分隔)constraints:strField(description输出的约束条件)requirements:strField(description输出必须遵循的要求)# ----- 2. 初始化 LLM -----llmChatOpenAI(modelgpt-3.5-turbo,temperature0)structured_llmllm.with_structured_output(PromptRequirements)# ----- 3. 提示词模板 -----info_system_prompt你是一个提示词需求收集助手。你的任务是与用户对话收集他们想要创建的提示词的以下信息 1. 目标提示词要完成什么任务 2. 变量哪些变量会被传入模板 3. 约束输出不应该包含什么 4. 要求输出必须遵循什么规则 如果你无法从用户的回答中辨别所有信息请继续提问直到信息完整。 当你认为信息已经完整时调用 generate_prompt 工具来触发提示词生成。prompt_generation_template根据以下需求编写一个高质量的提示词模板 目标{goal} 变量{variables} 约束{constraints} 要求{requirements} 请生成一个完整的提示词模板用花括号包裹变量名。# ----- 4. 节点函数 -----definfo_node(state:MessagesState)-MessagesState:收集用户需求如果信息完整则调用工具messagesstate[messages]# 将系统提示作为第一条消息full_messages[HumanMessage(contentinfo_system_prompt)]messages responsestructured_llm.invoke(full_messages)# 判断是否所有字段都已填写实际中可由 LLM 自主决定这里简化为检查 Pydantic 模型ifresponse.goalandresponse.variablesandresponse.constraintsandresponse.requirements:# 信息完整构造一个工具调用消息tool_call_msgAIMessage(content信息已收集完整正在生成提示词...,tool_calls[{name:generate_prompt,args:{goal:response.goal,variables:response.variables,constraints:response.constraints,requirements:response.requirements},id:call_prompt_gen}])return{messages:[tool_call_msg]}else:# 信息不完整生成追问follow_upf请提供更多信息。目标{response.goalor未知}变量{response.variablesor未知}约束{response.constraintsor未知}要求{response.requirementsor未知}return{messages:[AIMessage(contentfollow_up)]}defadd_tool_message(state:MessagesState)-MessagesState:模拟工具执行返回成功消息return{messages:[ToolMessage(content工具调用成功正在生成提示词模板...,tool_call_idcall_prompt_gen)]}defprompt_node(state:MessagesState)-MessagesState:根据需求生成最终提示词模板# 从消息历史中提取需求requirementsNoneformsginstate[messages]:ifisinstance(msg,AIMessage)andhasattr(msg,tool_calls)andmsg.tool_calls:requirementsmsg.tool_calls[0][args]breakifnotrequirements:return{messages:[AIMessage(content未能提取到需求信息。)]}promptChatPromptTemplate.from_template(prompt_generation_template)chainprompt|llm resultchain.invoke(requirements)return{messages:[result]}defget_state(state:MessagesState)-Literal[add_tool,prompt,end,info]:根据最新消息决定路由ifnotstate[messages]:returnendlast_msgstate[messages][-1]# 如果 AI 消息包含工具调用ifisinstance(last_msg,AIMessage)andhasattr(last_msg,tool_calls)andlast_msg.tool_calls:returnadd_tool# 如果工具执行完毕ifisinstance(last_msg,ToolMessage):returnprompt# 如果用户的最新消息是 q 或 退出ifisinstance(last_msg,HumanMessage)andlast_msg.content.lower()in[q,quit,退出]:returnend# 否则继续收集信息returninfo# ----- 5. 构建图 -----builderStateGraph(MessagesState)builder.add_node(info,info_node)builder.add_node(add_tool,add_tool_message)builder.add_node(prompt,prompt_node)builder.set_entry_point(info)builder.add_conditional_edges(info,get_state,{add_tool:add_tool,prompt:prompt,end:END,info:info})builder.add_edge(add_tool,prompt)builder.add_edge(prompt,END)memoryMemorySaver()appbuilder.compile(checkpointermemory)# ----- 6. 交互式测试 -----if__name____main__:config{configurable:{thread_id:str(uuid.uuid4())}}print( 提示词生成助手 )print(请描述你的需求输入 q 退出。)print(示例目标写诗变量标题和风格约束不超过20字要求用绝句格式)# 模拟多轮对话test_inputs[我想生成一个写诗的提示词,目标是写一首绝句变量是标题和写作风格,约束条件是不超过20个字,要求是必须用绝句的格式四句]foruser_inputintest_inputs:print(f\n用户:{user_input})resultapp.invoke({messages:[HumanMessage(contentuser_input)]},config)# 打印最新回复latest_msgresult[messages][-1]ifhasattr(latest_msg,content):print(f助手:{latest_msg.content})# 如果已生成最终提示词退出循环if模板instr(latest_msg.content)or提示词instr(latest_msg.content)andlen(result[messages])3:break运行说明在.env中填入有效的OPENAI_API_KEY。运行python prompt_assistant.py观察控制台输出。程序会模拟多轮对话用户逐步提供目标、变量、约束和要求直到信息完整后自动生成提示词模板。总结本实战利用 LangGraph 构建了一个提示词生成助手通过多轮对话收集用户需求并自动调用工具触发生成。这种“信息收集→工具调用→内容生成”的模式可以广泛应用于表单填写、问卷调研、需求分析等场景。通过调整节点和路由逻辑你可以轻松定制自己的智能助手。本文覆盖了基于 LangGraph 构建提示词助手的全过程包括需求收集、条件路由、工具调用处理、提示词生成等核心要点并提供了代码示例。