首页 > 其他分享 >AI大模型应用开发实战-Agent应用对话情感优化

AI大模型应用开发实战-Agent应用对话情感优化

时间:2024-08-22 11:27:07浏览次数:12  
标签:AI self 用户 Agent 内容 应用 query 模型

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

添加系统 prompt:

代码语言:python

代码运行次数:0

复制

Cloud Studio 代码运行

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 调试运行:

用户情感

代码语言:python

代码运行次数:0

复制

Cloud Studio 代码运行

    # 定义运行方法
    def run(self, query):
        emotion = self.emotion_chain(query)
        print("当前用户情感: ", emotion)
        # 调用代理执行器并获取结果
        result = self.agent_executor.invoke({"input": query})
        # 返回执行器的响应
        return result

    def 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 调试结果:

终端输出:

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() 更适合单一指令或查询

模式化情感

代码语言:python

代码运行次数:0

复制

Cloud Studio 代码运行

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 result

    def 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 = result
        return 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 uvicorn

    uvicorn.run(app, host="localhost", port=8090)

postman请求:

终端详细响应:

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

标签:AI,self,用户,Agent,内容,应用,query,模型
From: https://blog.csdn.net/python12345678_/article/details/141423666

相关文章

  • 从海量信息中脱颖而出:Workflow智能分析解决方案,大语言模型为AI科技文章打造精准摘要评
    从海量信息中脱颖而出:Workflow智能分析解决方案,大语言模型为AI科技文章打造精准摘要评分体系(总篇章)1.简介该项目整合了编程、AI、产品设计、商业科技及个人成长等多领域的精华内容,源自顶尖技术企业和社群。借助先进语言模型技术,对精选文章进行高效摘要、专业评分及多语种翻译,......
  • 2024 江苏省第二届数据安全技术应用职业技能竞赛 初赛 部分wp
    文章目录一、前言二、参考文章三、题目(解析)数据安全解题赛1、ds_0602(30分)2、333.file(45分)3、pf文件分析(35分)4、丢失的资料(45分)5、greatphp(45分)数据安全分析赛一、简单分析1、问题一:攻击者成功登陆后台的账号密码是?(如账号为admin,密码为admin,则提交admin:admin)2、问题二......
  • 巧用PDF转Markdown插件,在扣子(Coze)手搓一个有趣好玩的AI Bot
    近期,TextIn团队开发的PDF转Markdown插件已经上架Coze平台。短短的时间内,已经有不少朋友愉快地和我们的工具开始玩耍。今天我们抛砖引玉,介(an)绍(li)几种PDF转Markdown插件的有趣玩法!1专属翻译官外语文献翻译难?小语种阅读不便?PDF文件只能手动复制、逐段翻译?在学术领域和工作中,我们......
  • Bootstrap 模态框(Modal)插件的基本应用
    转载: https://www.w3h5.com/post/74.html 模态框(Modal)通俗的说就是在父窗体上弹出的一个子窗体。通常用来显示一个单独的源内容或者是对一些模块进行进一步详细的介绍,可以在不离开父窗体的情况下进行一些互动和内容的交互。如果只是单独引用该插件的功能,只需要引用modal.js......
  • 启动应用程序出现pspluginwkr.dll找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个pspluginwkr.dll文件(挑选合适的版本文件)把......
  • 启动应用程序出现ptpprov.dll找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个ptpprov.dll文件(挑选合适的版本文件)把它放......
  • OpenAI:GPT-4o终于能微调定制模型了!限时免费开放,每天100万token
    8月20日,OpenAI推出了备受开发者期待的GPT-4o模型微调功能,开发者现在可以使用自己的数据集定制GPT-4o,以实现在特定应用场景中更高性能和更低成本的效果。此前,OpenAI仅允许用户微调其较小的模型,如GPT-4omini。而此次开放GPT-4o的微调功能,意味着企业可以更直接地优化OpenAI最强大......
  • 【面试宝典】AI大模型大厂实战案例集锦与面试真题详解
    前言最近AI大模型的项目落地,越来越多了,因此越来越多的企业开始招聘AI大模型岗位,本文梳理了AI大模型开发技术的真题面试之道,从AI大模型基础面、AI大模型进阶面、RAG面、Agent面、Fine-tuning微调面、LangChain开发框架面、向量数据库面等不同知识维度,试图找到......
  • 使用 Vue I18n 进行 Vue.js 应用的国际化
    随着互联网的全球化发展,开发多语言支持的应用变得越来越重要。Vue.js作为一个流行的前端框架,通过vue-i18n插件,能够非常方便地实现应用的国际化(i18n)。本文将介绍如何在Vue.js应用中使用vue-i18n进行国际化设置。什么是国际化(i18n)?国际化(Internationalization)通常简写......
  • df['料品分类'].apply(format_value) 是一个 Pandas 操作,用于对 DataFrame 中的 '料品
    df['料品分类'].apply(format_value)是一个Pandas操作,用于对DataFrame中的'料品分类'列的每个值应用一个名为format_value的函数,并将处理后的结果返回给这一列。分解解释df['料品分类']:这部分代码选择DataFramedf中名为'料品分类'的列。df是一个PandasDat......