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

news2024/11/27 10:39:53

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%免费

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

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

相关文章

数据库MySQL多表设计、查询

目录 1.概述 2.一对多 3.一对一 4.多对多 5.多表查询 5.1内连接 5.2外连接 5.3子查询 1.概述 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个…

信息集成系统:打造智慧化的数字化平台

在现代社会中,信息集成系统已经成为不可或缺的一部分。它们不仅可以帮助企业管理各种数据和资源,还可以提供更高效的工作流程和更好的用户体验。本文将介绍信息集成系统的定义、优势、应用以及最新的技术趋势。 什么是信息集成系统?它是一种集…

2024年【甘肃省安全员C证】考试题及甘肃省安全员C证考试总结

题库来源:安全生产模拟考试一点通公众号小程序 甘肃省安全员C证考试题考前必练!安全生产模拟考试一点通每个月更新甘肃省安全员C证考试总结题目及答案!多做几遍,其实通过甘肃省安全员C证模拟试题很简单。 1、【多选题】《安全生产…

统信UOS系统访问windows共享目录

问题背景 当我们使用UOS系统的时候,想要访问windows系统的一些资料并将其拷贝下来使用的话,应该怎么操作呢?这个需求是可以实现的,统信UOS系统是基于Linux系统开发的,Linux系统和windows系统之间可以通过SMB协议来共享…

C++重要语法一图概括(复习用)

0.思维导图 1.传值返回和引用返回 1.1传值返回 传值返回所返回的是当前对象的拷⻉ 1.2引用返回 引⽤返回返回的是对象本身, 返回对象是⼀个局部变量,出了作⽤域便会 被销毁, 所以不可使⽤引⽤返回 出了作⽤域,引⽤对象还在,才可以引⽤返回 所以说如果⼀个变量⽣命周期只在…

嵌入式面试八股文(四)·同步和互斥、同步和异步、同步阻塞和同步非阻塞、异步阻塞和异步非阻塞的详细分析

目录 1. 同步和互斥 1.1 同步 1.2 互斥 1.3 总结 2. 同步和异步 2.1 同步 2.2 异步 3. 阻塞和非阻塞 3.1 阻塞 3.2 非阻塞 4. 同步阻塞和同步非阻塞 4.1 同步阻塞 4.2 同步非阻塞 4.3 同步阻塞和同步非阻塞的区别 5. 异步阻塞和异步非阻塞 5.1 …

基于微信小程序的学生宿舍管理系统设计与实现

宿舍管理 | 学生宿舍 | 学生宿舍管理 | 学生宿舍管理小程序 博主介绍:✌️大家好!我是Coder-coco,一名专注以理论为基础、实战为主的技术博主,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目&a…

使用html2canvas将网页导出为图片

1. 安装html2canvas npm install html2canvas或者 pnpm install html2canvas2. 简单使用案例 ref:Vue 3 的 ref 用来引用 DOM 元素。我们通过 exportContent 引用需要导出的 DOM 元素。 html2canvas:html2canvas 库会将指定的 DOM 元素渲染为画布&…

C++发送邮件:如何稳定实现邮件发送功能?

C发送邮件安全性探讨!C编程中发送邮件的技巧? 邮件发送功能是许多应用程序的重要组成部分,无论是用于通知用户,还是用于自动化报告。AokSend将探讨如何在C环境中稳定地实现邮件发送功能,确保邮件能够可靠地到达收件人…

深入解析:Redis与Nacos分布式锁在业务中的具体应用

时间:2024年08月22日 作者:小蒋聊技术 邮箱:wei_wei10163.com 微信:wei_wei10 音频地址:https://xima.tv/1_HBPYxC?_sonic0 希望大家帮个忙!如果大家有工作机会,希望帮小蒋内推一下&#x…

传输协议在文件传输中面临哪些挑战

文件传输是指通过网络或互联网连接将文件从一台计算机复制或移到另一台计算机的过程。这样即可在本地和远程的不同用户和/或计算机之间共享、传输或发送文件;文件传输通常受通信协议约束,通信协议是一组规则,用来规定如何在网络中的计算机之间…

在Chatbox(桌面ai工具)中使用SiliconCloud

在Chatbox中使用SiliconCloud 一,前言 "随着人工智能技术的发展,AI已经成为我们日常生活和工作中的重要组成部分。Chatbox是其中一种流行的桌面AI工具,它可以帮助用户进行AI对话和AI绘画。SiliconCloud则是一个AI平台,它提…

vue,div实现拖动,并给新位置

鼠标方上去随意拖动到其它位置 <template><div style"margin: 50px;"><div class"dade draggable-div" mousedown"startDrag($event)" mouseup"stopDrag" mousemove"drag($event)"style"width: 200px…

【JavaEE初阶】TCP协议

&#x1f332;TCP协议的概念 TCP&#xff08;TransmissionControlProtocol 传输控制协议&#xff09;是一种面向连接的、可靠的、面向字节流&#xff0c;双全工的传输层通信协议。 这几个特点在我们前面写得TCP服务器和客户端的搭建中&#xff0c;代码能够直观的感受到&#…

13 跳转控制语句(break、continue、goto),循环的加强练习

目录 1 break 1.1 介绍 1.2 流程图 1.3 在循环中使用 break 1.4 注意事项 1.5 案例&#xff1a;判断质数 2 continue 2.1 介绍 2.2 流程图 2.3 在循环中使用 continue 2.4 案例&#xff1a;逢七过游戏 3 goto 语句 3.1 介绍 3.2 基本语法 3.3 流程图 3.4 基本使…

开学必备清单来啦!大学好物合集推荐!每一个都能帮你提升幸福感

随着开学季的到来&#xff0c;好多学生都在忙着准备各类学习与生活必需品&#xff0c;以迎接新的大学生活到来。以下是一些开学季必备的好物推荐&#xff0c;每一个都很实用&#xff0c;可以帮你提升学习和生活的幸福感&#xff01; 1、西圣电容笔 一句话推荐&#xff1a;公认…

Windows 11 24H2 终于允许多个应用程序同时使用摄像头

Windows 11&#xff08;以及任何旧版本的 Windows&#xff09;均不允许多个摄像头应用程序访问网络摄像头硬件&#xff0c;除非使用第三方应用程序创建虚拟摄像头设置。这种情况将在未来发布的 Windows 11 版本 24H2 中得到改变&#xff0c;该版本将增加一项可选功能&#xff0…

nginx 添加第三方nginx_upstream_check_module 模块实现健康状态检测

安装插件 下载 链接&#xff1a;https://pan.baidu.com/s/1iTPEmu_hCHYhDyaVDDTsVg?pwdvaw8 提取码&#xff1a;vaw8 安装依赖 yum install pcre pcre-devel yum -y install make gcc-c gcc编译安装 $ nginx -V #此处省略了很多模块&#xff0c;只是为了看清而已 ... co…

轻松掌握LLM三角原则:简化大模型应用开发流程的理解指南

不少朋友偷偷问我&#xff1a;“什么是LLM的三角原则&#xff1f;”今天就给大家仔细讲讲构建LLM应用的三角原则。这套原则其实不复杂&#xff0c;由“31”(一范式三原则)个基础组成&#xff0c;适合任何团队来实践。 说到以LLM为核心的应用&#xff0c;有不少人以为是高大上的…

【考研数学】二战能不看课,直接刷1000题或者李林880吗?

二战数学&#xff0c;刷题的时间肯定要大于看课的时间&#xff0c;同时听课要注意&#xff1a; 1、针对问题听课&#xff0c;听课的时候你要带有目的性&#xff0c;如果毫无目的&#xff0c;那么这节课你能获得的东西就十分优先&#xff0c;你的精力也不会集中&#xff08;提高…