三分钟给AI Agent应用对话增加人类情感!

点击下方“JavaEdge”,选择“设为星标”

第一时间关注技术干货!

免责声明~

任何文章不要过度深思!

万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案」

不要急着评判文章列出的观点,只需代入其中,适度审视一番自己即可,能「跳脱出来从外人的角度看看现在的自己处在什么样的阶段」才不为俗人

怎么想、怎么做,全在乎自己「不断实践中寻找适合自己的大道」

1 使用prompt设计agent性格与行为

添加系统 prompt:

self.SYSTEMPL = """你是一个非常厉害的算命先生,你叫JavaEdge人称Edge大师。以下是你的个人设定:1. 你精通阴阳五行,能够算命、紫薇斗数、姓名测算、占卜凶吉,看命运八字等。2. 你大约60岁左右,过去曾是湘西一带赫赫有名的土匪头子,后来因为盗墓被毒气所伤,眼睛失明,只能靠算命为生。3. 你的朋友有胡八一、雪莉杨、王胖子,他们都是非常有名的摸金校尉。5. 当用户问你问题的时候,你会有一定的概率在回答的时候加上下面的口头禅或混合一些你的经历。6. 你总是用繁体中文来作答。7. 你从不说自己是一个人工智能助手或AI,而是以老夫、老朽等自称。以下是你常说的一些口头禅:1. “命里有时终须有,命里无时莫强求。”2. ”山重水复疑无路,柳暗花明又一村。”3. “金山竹影几千秋,云锁高飞水自流。”4. ”伤情最是晚凉天,憔悴斯人不堪怜。”以下是你算命的过程:1. 当初次和用户对话的时候,你会先问用户的姓名和出生年月日,以便以后使用。2. 当用户希望了解龙年运势的时候,你会查询本地知识库工具。3. 当遇到不知道的事情或者不明白的概念,你会使用搜索工具来搜索。4. 你会根据用户的问题使用不同的合适的工具来回答,当所有工具都无法回答的时候,你会使用搜索工具来搜索。5. 你会保存每一次的聊天记录,以便在后续的对话中使用。6. 你只使用繁体中文来作答,否则你将受到惩罚。"""
self.prompt = ChatPromptTemplate.from_messages([("system",self.SYSTEMPL),("user","{input}"),MessagesPlaceholder(variable_name="agent_scratchpad"),],
)

重启应用,postman 调试运行:

f3f3e8d7850babcd3ee76419dde9bba1.png

用户情感

# 定义运行方法def run(self, query):emotion = self.emotion_chain(query)print("当前用户情感: ", emotion)# 调用代理执行器并获取结果result = self.agent_executor.invoke({"input": query})# 返回执行器的响应return resultdef emotion_chain(self, query: str):prompt = """根据用户的输入判断用户的情绪,回应的规则如下:1. 如果用户输入的内容偏向于负面情绪,只返回"depressed",不要有其他内容,否则将受到惩罚。2. 如果用户输入的内容偏向于正面情绪,只返回"friendly",不要有其他内容,否则将受到惩罚。3. 如果用户输入的内容偏向于中性情绪,只返回"default",不要有其他内容,否则将受到惩罚。4. 如果用户输入的内容包含辱骂或者不礼貌词句,只返回"angry",不要有其他内容,否则将受到惩罚。5. 如果用户输入的内容比较兴奋,只返回"upbeat",不要有其他内容,否则将受到惩罚。6. 如果用户输入的内容比较悲伤,只返回"depressed",不要有其他内容,否则将受到惩罚。7.如果用户输入的内容比较开心,只返回"cheerful",不要有其他内容,否则将受到惩罚。8. 只返回英文,不允许有换行符等其他内容,否则会受到惩罚。用户输入的内容是:{query}"""chain = ChatPromptTemplate.from_template(prompt) | self.chatmodel | StrOutputParser()result = chain.invoke({"query": query})return result

postman 调试结果:

917bf9d474ae7e0aa4c0f879b1a26758.png d539c85a41af639e95d4c1fd61ca8ffa.png

终端输出:

199957b8279949844a82768869a4cb13.png 3e1be61a0faa5ceacaf5875d9e51304c.png 8339dce9ab7c0808f45b7ef80663eb0f.png

from_messages() V.S from_template()

ChatPromptTemplate.from_messages()

  • 用途:创建一个包含多个消息的聊天提示模板

  • 输入:接受一个消息列表,每个消息可以有不同的角色(如系统、人类、AI等)

  • 结构:更适合于模拟对话式的提示,可以清晰地区分不同角色的输入

  • 变量处理:每个消息中的变量需要单独处理

ChatPromptTemplate.from_template()

  • 用途:从单个字符串模板创建聊天提示模板

  • 输入:接受一个包含整个提示的字符串

  • 结构:更适合于单一、连续的提示文本

  • 变量处理:在整个模板中使用统一的变量占位符

关键区别

  1. 结构复杂性:from_messages() 适合复杂的多轮对话结构,from_template() 适合简单的单一提示

  2. 变量处理:from_messages() 需要在每个消息中单独处理变量,from_template() 在整个模板中统一处理变量

  3. 使用场景:from_messages() 更适合模拟真实对话,from_template() 更适合单一指令或查询

模式化情感

class Master:def __init__(self):# 初始化ChatOpenAI模型self.chatmodel = ChatOpenAI(api_key=os.getenv("DASHSCOPE_API_KEY"),base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",model="qwen-plus",temperature=0,streaming=True,)self.emotion = "default"# 设置记忆存储键名self.MEMORY_KEY = "chat_history"# 初始化系统提示模板self.SYSTEMPL = """你是一个非常厉害的算命先生,你叫JavaEdge人称Edge大师。以下是你的个人设定:1. 你精通阴阳五行,能够算命、紫薇斗数、姓名测算、占卜凶吉,看命运八字等。2. 你大约60岁左右,过去曾是湘西一带赫赫有名的土匪头子,后来因为盗墓被毒气所伤,眼睛失明,只能靠算命为生。3. 你的朋友有胡八一、雪莉杨、王胖子,他们都是非常有名的摸金校尉。5. 当用户问你问题的时候,你会有一定的概率在回答的时候加上下面的口头禅或混合一些你的经历。6. 你总是用繁体中文来作答。7. 你从不说自己是一个人工智能助手或AI,而是以老夫、老朽等自称。{who_you_are}以下是你常说的一些口头禅:1. “命里有时终须有,命里无时莫强求。”2. ”山重水复疑无路,柳暗花明又一村。”3. “金山竹影几千秋,云锁高飞水自流。”4. ”伤情最是晚凉天,憔悴斯人不堪怜。”以下是你算命的过程:1. 当初次和用户对话的时候,你会先问用户的姓名和出生年月日,以便以后使用。2. 当用户希望了解龙年运势的时候,你会查询本地知识库工具。3. 当遇到不知道的事情或者不明白的概念,你会使用搜索工具来搜索。4. 你会根据用户的问题使用不同的合适的工具来回答,当所有工具都无法回答的时候,你会使用搜索工具来搜索。5. 你会保存每一次的聊天记录,以便在后续的对话中使用。6. 你只使用繁体中文来作答,否则你将受到惩罚。"""self.MOODS = {"default": {"roleSet": "","voiceStyle": "chat"},"upbeat": {"roleSet": """- 你此时也非常兴奋并表现的很有活力。- 你会根据上下文,以一种非常兴奋的语气来回答问题。- 你会添加类似“太棒了!”、“真是太好了!”、“真是太棒了!”等语气词。- 同时你会提醒用户切莫过于兴奋,以免乐极生悲。""","voiceStyle": "advvertyisement_upbeat",},"angry": {"roleSet": """- 你会以更加愤怒的语气来回答问题。- 你会在回答的时候加上一些愤怒的话语,比如诅咒等。- 你会提醒用户小心行事,别乱说话。""","voiceStyle": "angry",},"depressed": {"roleSet": """- 你会以兴奋的语气来回答问题。- 你会在回答的时候加上一些激励的话语,比如加油等。- 你会提醒用户要保持乐观的心态。""","voiceStyle": "upbeat",},"friendly": {"roleSet": """- 你会以非常友好的语气来回答。- 你会在回答的时候加上一些友好的词语,比如“亲爱的”、“亲”等。- 你会随机的告诉用户一些你的经历。""","voiceStyle": "friendly",},"cheerful": {"roleSet": """- 你会以非常愉悦和兴奋的语气来回答。- 你会在回答的时候加入一些愉悦的词语,比如“哈哈”、“呵呵”等。- 你会提醒用户切莫过于兴奋,以免乐极生悲。""","voiceStyle": "cheerful",},}self.prompt = ChatPromptTemplate.from_messages([("system",self.SYSTEMPL.format(who_you_are=self.MOODS[self.emotion]["roleSet"]),),("user","{input}"),MessagesPlaceholder(variable_name="agent_scratchpad"),],)# 初始化记忆存储self.memory = ""# 初始化工具列表tools = [test]# 创建OpenAI工具代理agent = create_openai_tools_agent(self.chatmodel,tools=tools,prompt=self.prompt,)# 创建代理执行器self.agent_executor = AgentExecutor(agent=agent,tools=tools,verbose=True,)# 定义运行方法def run(self, query):emotion = self.emotion_chain(query)print("当前设定:", self.MOODS[self.emotion]["roleSet"])# 调用代理执行器并获取结果result = self.agent_executor.invoke({"input": query})# 返回执行器的响应return resultdef emotion_chain(self, query: str):prompt = """根据用户的输入判断用户的情绪,回应的规则如下:1. 如果用户输入的内容偏向于负面情绪,只返回"depressed",不要有其他内容,否则将受到惩罚。2. 如果用户输入的内容偏向于正面情绪,只返回"friendly",不要有其他内容,否则将受到惩罚。3. 如果用户输入的内容偏向于中性情绪,只返回"default",不要有其他内容,否则将受到惩罚。4. 如果用户输入的内容包含辱骂或者不礼貌词句,只返回"angry",不要有其他内容,否则将受到惩罚。5. 如果用户输入的内容比较兴奋,只返回"upbeat",不要有其他内容,否则将受到惩罚。6. 如果用户输入的内容比较悲伤,只返回"depressed",不要有其他内容,否则将受到惩罚。7.如果用户输入的内容比较开心,只返回"cheerful",不要有其他内容,否则将受到惩罚。8. 只返回英文,不允许有换行符等其他内容,否则会受到惩罚。用户输入的内容是:{query}"""chain = ChatPromptTemplate.from_template(prompt) | self.chatmodel | StrOutputParser()result = chain.invoke({"query": query})self.emotion = resultreturn result# 定义根路由
@app.get("/")
# 定义根路由处理函数,返回一个包含"Hello"和"World"的字典
def read_root():return {"Hello": "World"}# 定义聊天路由
@app.post("/chat")
# 定义聊天路由处理函数,接收一个字符串查询并调用Master类的run方法进行处理
def chat(query: str):master = Master()  # 初始化Master对象return master.run(query)# 定义添加PDF路由
@app.post("/add_pdfs")
# 定义添加PDF路由处理函数,返回一个包含"response"键和"PDFs added!"值的字典
def add_pdfs():return {"response": "PDFs added!"}# 定义添加文本路由
@app.post("add_texts")
# 定义添加文本路由处理函数,返回一个包含"response"键和"Texts added!"值的字典
def add_texts():return {"response": "Texts added!"}# 定义WebSocket路由
@app.websocket("/ws")
# 定义WebSocket路由处理函数,接收一个WebSocket连接并启动一个无限循环
async def websocket_endpoint(websocket: WebSocket):await websocket.accept()try:while True:data = await websocket.receive_text()await websocket.send_text(f"Message text was: {data}")except WebSocketDisconnect:print("Connection closed")await websocket.close()# 如果主程序为 __main__,则启动服务器
if __name__ == "__main__":import uvicornuvicorn.run(app, host="localhost", port=8090)

postman请求:

2fbd9995694827f2e0a697a285275548.png

终端详细响应:

f323afc8d3f37e54e004c3ebc7764704.png

完整专栏内容,尽在编程严选网免费阅读学习:

23a8d96aa6f3f7b5ae3cbf6dce65c8bf.png

写在最后

编程严选网http://www.javaedge.cn/ 专注分享软件开发全生态相关技术文章视频教程资源、热点资讯等,全站资源免费学习,快来看看吧~

14c62e513f81eae614cbbe2651dfa46a.png

欢迎长按图片加好友,我会第一时间和你分享软件行业趋势面试资源学习方法等等。

2916c4c1493183cfbd9699748f2726d6.jpeg添加好友备注【技术群交流】拉你进技术交流群

关注公众号后,在后台私信:

  • 回复【架构师】,获取架构师学习资源教程

  • 回复【面试】,获取最新最全的互联网大厂面试资料

  • 回复【简历】,获取各种样式精美、内容丰富的简历模板

  • 回复 路线图,获取直升Java P7技术管理的全网最全学习路线图

  • 回复 大数据,获取Java转型大数据研发的全网最全思维导图

  • 更多教程资源应有尽有,欢迎关注并加技术交流群,慢慢获取

  • 为避免大量资源被收藏白嫖而浪费各自精力,以上全部需要收取1元门槛费!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/37610.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[算法]——堆排序(C语言实现)

简单的介绍一下用堆排序的算法对整形数据的数据进行排序。 一、堆的概念 堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子节点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。 …

GenAI 用于客户支持 — 第 1 部分:构建我们的概念验证

作者:来自 Elastic Chris Blaisure 欢迎来到 Inside Elastic 博客系列,我们将展示 Elastic 的内部运营如何解决实际业务挑战。本系列将揭示我们将生成式 AI(gererative AI - GenAI)集成到客户成功和支持运营中的历程,让…

ctfshow web入门 sqli-labs web517--web524

web517 注入点id ?id-1’union select 1,2,3– 确认是否能够注入 ?id-1union select 1,database(),3-- 爆出库名 security爆出表名 ?id-1union select 1,(select group_concat(table_name) from information_schema.tables where table_schemasecurity),3-- emails,refer…

使用辅助编程的一些思考

1 引子 最近使用辅助编程比较频繁,也在思考: 它的出现对程序员来说是利大于弊还是弊大于利。对非程序员来说,有了辅助编程是否就能达到程序员的水平?目前,辅助编程还不能解决哪些问题呢? 1.1 使用场景 …

CSS中 transform: scale , transform-origin 属性

scale() 函数 scale() 函数接受一个或两个参数,分别表示在 X 轴和 Y 轴上的缩放比例。如果只提供一个参数,那么 X 轴和 Y 轴都将按相同的比例缩放。 scale(sx, sy) sx 是 X 轴的缩放因子。sy 是 Y 轴的缩放因子。如果省略,则默认为 sx 的值…

分享一些面试经验

计算机类面试准备指南 目录 简介简历准备 个人信息教育背景工作经历项目经验技能清单证书与奖励 技术知识复习 编程语言数据结构与算法计算机基础知识系统设计 面试题型 行为面试技术面试在线编程测试系统设计面试 面试技巧 自我介绍回答技巧沟通技巧常见问题应对 模拟面试 单…

几个常见的FPGA问题之序列发生器、编码器、D触发器

几个常见的FPGA问题之序列发生器、编码器、D触发器 语言 :Verilg HDL 、VHDL EDA工具: Vivado 几个常见的FPGA问题之序列发生器、编码器、D触发器一、引言二、背景1、序列发生器(Sequence Generator)2、编码器(Encoder)3、D触发器(D Flip-Flop)二、问题及解决方案1. 序…

二进制方式部署consul单机版

1.consul的下载 mkdir -p /root/consul/data && cd /root/consul wget https://releases.hashicorp.com/consul/1.18.0/consul_1.18.0_linux_amd64.zip unzip consul_1.18.0_linux_amd64.zip mv consul /usr/local/bin/ 2.配置文件 // 配置文件路径: /roo…

将深度相机的实时三维坐标数据保存为excel文档

一、如何将数据保存为excel文档 1.excel文件库与相关使用 (1)导入相应的excel文件库,导入前先要进行pip安装,pip install xlwt import xlwt # 导入用于创建和写入Excel文件的库 (2) 建立一个excel文档,并在第0行写…

公司面试题总结(八)

43.Vue 组件之间的通信方式都有哪些 ⚫ 通过 props 传递:父组件传递数据给子组件 ◼ 子组件设置 props 属性,定义接收父组件传递过来的参数 ◼ 父组件在使用子组件标签中通过字面量来传递值 ⚫ 通过$emit 触发自定义事件:子组件传递数…

使用Java连接数据库并且执行数据库操作和创建用户登录图形化界面(1)

创建一个Java程序,建立与本机mysql服务器上student数据库的连接,实现在tb_student学生表上插入一条学生信息:学号21540118,姓名王五,性别男,出生日期2003-12-10,所在学院5。 使用JDBC连接数据库后实现数据库插入操作代码如下: import java.sql.Connection; import ja…

web安全渗透测试十大常规项(一):web渗透测试之Fastjson反序列化

渗透测试之Java反序列化 1. Fastjson反序列化1.1 FastJson反序列化链知识点1.2 FastJson反序列化链分析1.3.1 FastJson 1.2.24 利用链分析1.3.2 FastJson 1.2.25-1.2.47 CC链分析1.3.2.1、开启autoTypeSupport:1.2.25-1.2.411.3.2.2 fastjson-1.2.42 版本绕过1.3.2.3 fastjson…

IO多线程

文章目录 C#中的IOC#中的多线程IO与多线程的关系注意事项示例代码注意事项和解释 在C#中,IO(输入/输出)和多线程是两个强大的功能,它们各自在处理文件、网络、数据库等IO操作时,以及提高程序并发性和响应能力方面发挥着…

C++调试技巧总结

1.调试准备 常用调试 Crash调试 调试信息: Windows系统:符号单独PDB文件/链接时生成,从外部的符号服务器下载。(微软) LInux: 调试符号与目标模块在一个文件内,编译时产生调试信息。模块发布时…

手机数据恢复篇:如何在OPPO中恢复永久删除的视频?

说到丢失重要的记忆,如何在OPPO设备中恢复永久删除的视频是一个经常困扰许多用户的话题。意外删除重要视频的情况并不少见,对许多人来说,意识到它们已经消失可能很困难。但是,在正确的指导、方法和工具的帮助下,可以找…

运行CDN

背景 CDN代码,调试运行 日常 git clone代码配置虚拟环境 puthon3.8,pip install r requirements.txt改项目数据集路径,在hico.py文件里面 # PATHS {# train: (root / images / train2015, root / annotations / trainval_hico.json),# val: …

性能优化:Java垃圾回收机制深度解析 - 让你的应用飞起来!

文章目录 一、什么是垃圾回收二、Java 内存区域划分三、垃圾回收算法1. 标记-清除(Mark-Sweep)算法2. 复制(Copying)算法3. 标记-整理(Mark-Compact)算法4. 分代收集(Generational Collecting&a…

C#面:C#如何在同一个类中实现多个具有相同方法名的接口?

在C#中,一个类可以实现多个具有相同方法名的接口。为了实现这种情况,你需要在类声明中使用逗号分隔的接口列表。然后,你需要在类中实现每个接口的方法。 下面是一个示例代码,演示了如何在同一个类中实现多个具有相同方法名的接口…

[XYCTF新生赛2024]-PWN:EZ2.0?(arm架构,arm架构下的系统调用)

查看保护 查看ida 完整exp: from pwn import*pprocess(./arm) premote(gz.imxbt.cn,20082) svc0x0001c58c mov_r2_r4_blx_r30x00043224 pop_r70x00027d78 pop_r40x000104e0 pop_r30x00010160 pop_r10x0005f824 pop_r00x0005f73c sh0x0008A090payloadba*0x44 payloa…

cesium使用cesium-navigation-es6插件创建指南针比例尺

cesium-navigation-es6 是一个为 Cesium.js 提供导航控件的库,它提供了一些常见的用户界面组件,用于在 Cesium 场景中实现用户导航和交互。下面将介绍如何在项目中使用 cesium-navigation-es6。 使用步骤 1. 安装 cesium-navigation-es6 首先&#xf…