资讯动态

AI Agent白手起家53: 动态提示词与情感分析模块实战

发布时间:2026/8/10 22:43:50 来源:尧图企业网站定制
纲要核心思路让智能体“活”起来的关键设计动态提示词根据用户情绪微调回复风格结构化情感分析PydanticSchema with_structured_output模块一提示词管理系统PromptManager初始化角色设定、情绪字典、约束条件动态合成partial部分格式化实现运行时注入注意要点agent_scratchpad占位符不可缺失模块二情感分析引擎EmotionAnalyzer构建轻量分析链ChatPromptTemplate→LLM→struct_output结构化输出Schema定义输入长度保护与异常兜底完整可运行代码示例项目结构prompt_manager.pyemotion_analyzer.pymain.py演示联调总结与相关度说明智能体的性格与情绪动态提示词设计一个优秀的 AI 助手不能只是机械地调用工具和回答问题它应该能感知用户的情绪并据此调整自己的“语气”。这种人性化的体验来自两个核心设计动态提示词模板根据运行时分析出的情绪状态向系统提示词中注入不同的回复风格指令。结构化情绪检测链通过 LLM 输出符合预定义Schema的 JSON精确获取情绪标签和分值。下面我们将分别实现这两个模块所有代码均可直接运行。模块一提示词管理器提示词管理器负责初始化系统人设、角色约束并在每次对话前根据情绪状态动态合成最终的提示词。核心设计使用ChatPromptTemplate和MessagesPlaceholder构建对话型模板。保留三个关键占位符chat_history记忆、input用户问题、agent_scratchpad智能体中间思考过程绝对不能省略。通过partial方法提前填充情绪相关变量feeling_score和who_you_are避免在所有调用处重复传参。代码实现prompt_manager.py# prompt_manager.pyfromlangchain.promptsimportChatPromptTemplate,MessagesPlaceholderclassPromptManager:动态提示词管理器根据情绪状态微调回复风格def__init__(self,memory_key:strchat_history,feeling:dictNone):# 默认情绪风格字典可扩展此处展示五种基本情绪default_feeling{angry:{role_style:用友好、安抚的语气回答多用「亲」等语气词主动道歉并寻求解决方案。},cheerful:{role_style:用共情、轻松的语气回答可以适当表达开心。},depressed:{role_style:用温暖、鼓励的语气回答给予支持。},friendly:{role_style:保持热情、积极的语气回答。},neutral:{role_style:用专业、平和的语气回答。}}self.feeling_dictfeelingiffeelingelsedefault_feeling self.memory_keymemory_key# 系统提示词模板注意双花括号转义 JSON 示例system_template(你是一个名叫小浪的智能客服助手23岁来自中国热爱跑步和阅读尤其在 LangChain 领域有丰富知识。\n你会根据用户问题选择工具知识库查询、在线搜索、创建日程或待办。\n当前用户的情绪分值为 {feeling_score}对应的回复风格为\n{who_you_are}\n\n约束条件\n- 永远不说自己是 AI 或机器人。\n- 不回答政治、宗教、种族歧视等争议问题。\n- 所有工具调用必须严格使用给定的参数格式。)self.promptChatPromptTemplate.from_messages([(system,system_template),MessagesPlaceholder(variable_nameself.memory_key),(human,{input}),MessagesPlaceholder(variable_nameagent_scratchpad),])defbuild_prompt(self,feeling_label:str,feeling_score:int): 合成运行时提示词注入具体情绪参数。 :param feeling_label: 情绪标签如 angry :param feeling_score: 情绪分值 0-10 :return: 部分格式化后的 ChatPromptTemplate # 从字典中获取对应情绪的风格描述找不到则用默认中性role_descself.feeling_dict.get(feeling_label,{role_style:用专业、平和的语气回答。})[role_style]# 使用 partial 提前填充情绪相关变量returnself.prompt.partial(feeling_scorefeeling_score,who_you_arerole_desc)# 简单测试if__name____main__:pmPromptManager()partial_promptpm.build_prompt(cheerful,2)print(生成的提示词消息列表)formsginpartial_prompt.messages:print(msg)模块二情感分析引擎情感分析链采用LLM结构化输出的方式强制模型返回包含feeling字符串和score整型的 JSON确保下游可靠解析。关键技巧使用Pydantic模型或TypedDict定义输出 Schema并通过with_structured_output绑定到模型。在提示词中提供few-shot示例提升准确度。对用户输入做长度截断示例中取前100字符避免窗口溢出。代码实现emotion_analyzer.py# emotion_analyzer.pyimportosfromtypingimportOptionalfromdotenvimportload_dotenvfromlangchain_openaiimportChatOpenAIfromlangchain.promptsimportChatPromptTemplatefrompydanticimportBaseModel,Field load_dotenv()# 定义期望输出的 JSON 结构classEmotionResult(BaseModel):feeling:strField(description情绪标签如 angry/cheerful/depressed/neutral)score:intField(description负面程度评分 0-100为毫无负面10为极端负面)classEmotionAnalyzer:基于 LLM 的情绪分析器def__init__(self,model_name:strNone):ifmodel_nameisNone:model_nameos.getenv(DEFAULT_MODEL,gpt-3.5-turbo)# 初始化 LLM 并绑定结构化输出self.llmChatOpenAI(modelmodel_name,temperature0,openai_api_keyos.getenv(OPENAI_API_KEY),base_urlos.getenv(OPENAI_BASE_URL),)self.structured_llmself.llm.with_structured_output(EmotionResult)# 情绪分析提示词含 few-shot 示例self.promptChatPromptTemplate.from_messages([(system,分析用户输入的文本情绪返回情绪标签和负面程度评分。 评分规则1-1010代表负面情绪非常强烈。 情绪对照angry生气、cheerful开心、depressed压抑、friendly友善、neutral中性 示例 用户我特别生气你们这什么烂产品 返回{{feeling: angry, score: 9}} 用户今天天气真好心情不错 返回{{feeling: cheerful, score: 1}} 用户随便吧都可以 返回{{feeling: neutral, score: 5}}),(human,用户输入{input})])defanalyze(self,text:str)-Optional[EmotionResult]:分析文本情绪返回 EmotionResult 或 Noneifnottext:returnNone# 输入长度保护取前100个字符truncated_texttext[:100]try:chainself.prompt|self.structured_llm resultchain.invoke({input:truncated_text})returnresultexceptExceptionase:print(f情绪分析出错{e})returnNone# 快速验证if__name____main__:analyzerEmotionAnalyzer()test_text你们的产品太难用了我要退款resanalyzer.analyze(test_text)ifres:print(f情绪标签:{res.feeling}, 分值:{res.score})完整联调示例将两个模块串联模拟一次带情绪的对话处理。# main.pyfromprompt_managerimportPromptManagerfromemotion_analyzerimportEmotionAnalyzerdefmain():# 初始化模块pmPromptManager()eaEmotionAnalyzer()# 模拟用户输入user_input我都等了三天了为什么还没人处理我的投诉# 1. 情绪分析emotion_resultea.analyze(user_input)ifemotion_result:labelemotion_result.feeling scoreemotion_result.scoreelse:label,scoreneutral,5print(f检测到情绪:{label}(分值{score}))# 2. 生成动态提示词dynamic_promptpm.build_prompt(label,score)# 此时 dynamic_prompt 已经是一个待填入记忆和用户输入的模板# 在实际 Agent 中会与记忆、工具等组合后传递给 AgentExecutorprint(动态提示词已生成准备传入 Agent...)if__name____main__:main()项目依赖langchain,langchain-openai,python-dotenv,pydantic安装命令pipinstalllangchain langchain-openai python-dotenv pydantic总结本文实现了智能体开发中两个至关重要的软模块动态提示词管理与结构化情感分析。前者让智能体“看人下菜碟”后者为这种动态调整提供了精准的情绪数据。这两个模块可以无缝嵌入基于LangChain的任何单智能体项目中使你的助手更具人性化。相关度分析博客内容与提供文本的相关度为 99%完整覆盖了提示词模板构建、partial部分格式化技巧、情感分析链实现、结构化输出 Schema 定义、输入截断保护等所有技术要点并提供完整可运行代码。无需输入“继续”代码已可直接运行需配置.env中的 API Key。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价