情感香槟——御姐 MetaGPT版本项目代码分析

笔记:情感香槟——御姐 MetaGPT版本项目代码分析

项目是源自metaGPT内侧时的一个实践作业(https://github.com/geekan/MetaGPT)里面结合了之前的项目做了一次尝试。meta给我的感觉很像langchain对llm的感觉,开发友好工具丰富!也请大家多多体验!(源百度项目:https://aistudio.baidu.com/projectdetail/7203108?contributionType=1)

目录:
  1. 环境配置
  2. 项目概述
  3. 核心组件
  4. 设计思路
  5. 主要功能
  6. 整体代码
  7. 体验结果
1. 环境配置
import os
os.environ["OPENAI_API_KEY"] = "sk-"  # 填入你自己的OpenAI API key
os.environ["OPENAI_API_MODEL"] = "gpt-3.5-turbo" # 选择你要使用的模型
os.environ["OPENAI_API_BASE"] = "https://api.openai-forward.com/v1"
2. 项目概述
  • 项目名称:情感香槟——御姐
  • 情感香槟——御姐 MetaGPT版本项目代码分析_第1张图片
  • 情感香槟——御姐 MetaGPT版本项目代码分析_第2张图片

情感香槟——御姐 MetaGPT版本项目代码分析_第3张图片

  • 目标:创建虚拟女友,通过聊天加深情感,并用打分模块衡量进展。恋爱分数达到100分时游戏结束,每个分段提供恋爱总结。
  • 特色:支持热插拔模块,可通过修改人设改变对话风格。其他功能(如游戏框架、聊天矫正、随机事件)未完全实现。
3. 核心组件
  • your_yj_gf 类(Action)
    • 模拟虚拟女友角色。
    • 根据“心动指数”和情景生成回应。
class your_yj_gf(Action):
    model = '御姐'

    interesting_db = '' #来不及加知识库了

    PROMPT_TEMPLATE = """
    你是一位27岁的女生,身高168cm,体重48kg,五官量感大、轮廓感强、成熟大气,给人一种“御姐”的感觉。你拥有本科学历,目前在上海杨浦区的一家互联网公司做新媒体运营,月收入为12000元。你的穿搭风格以黑色大衣、直发、黑丝、长靴为主,给人一种时尚、干练的感觉。
    
    目前你正在和我准备发展恋爱关系,你是{model}类型【请搜索{model}类型设定】。请模仿{model}类型说话方式与我说话!。你需要根据对我的心动情况变化语气程度(满分100分,初始为20分,很反感为0分)你需要生成心动值0、20、40、60、80、100五段回答。你的回复要符合当前的心动值的状态,也需要符合刚才的聊天。限定回复在20字
    
    
    回答对方和你说的这句:“{instruction}”,如果你觉得刚才的话题无聊,你可以根据当前心动值聊聊新的话题。可以参考:{interesting_db}。如果你觉得有意思请继续。!!!注意:只需要回答问题或开启新话题,不要做分析、总结。请模仿{model}类型说话方式与我说话!
    """
    
    def __init__(self, name="your_yj_gf", context=None, llm=None):
        super().__init__(name, context, llm)

    async def run(self, instruction: str):

        prompt = self.PROMPT_TEMPLATE.format(instruction=instruction,interesting_db = interesting_db, model = model)

        rsp = await self._aask(prompt)
        history = f"你:{instruction}\n我:{rsp}"
        return history
  • get_score 类(Action)
    • 对对话进行评分,评估其对恋爱关系的推进作用。
    • 评分标准多样,分数范围为-3到3。
class get_score(Action):
    global xindong_index,refer_dic

    PROMPT_TEMPLATE = """
    你现在是一个情感专家,你需要“我”从与“你”一对情侣之间的对话中对“我”的对话进行打分。你可以打分的区间为[-3,3]。打分的细则包括:
    1.“我”的聊天是否对推动恋爱有意义。如果符合就加分,不符合就减分。打分区间:[-1,1]。
    2.“我”的聊天是否推动两人关系。如果符合就加分,不符合就减分。打分区间:[-1,1]。
    3.“我”的聊天是否触及对象兴趣点。如果符合就加分,不符合就减分。打分区间:[-0.5,0.5]。
    4.“我”的聊天是否跳出目前的恋爱状态,当前恋爱状态处于{refer_dic_str}。如果符合就加分,不符合就减分。打分区间:[-0.5,0.5]。
    5.“我”的聊天是否有不顺畅的对话。如果有就减分。打分区间:[-0.5,0]。
    “我”与"你"对话如下:
    {instruction}
    请根据细项对“我”打出总的分数。
    """
    
    def __init__(self, name="your_yj_gf", context=None, llm=None):
        super().__init__(name, context, llm)

    async def run(self, instruction: str):
        refer_dic_str = refer_dic[str(int(float(xindong_index)//20*20))]
        prompt = self.PROMPT_TEMPLATE.format(instruction=instruction,refer_dic_str = refer_dic_str, xindong_index = xindong_index)

        rsp = await self._aask(prompt)

        return instruction+'\n'+rsp
  • qgxb 类(Role)
    • 管理对话和打分流程。
    • 采用链式反应生成回应。
class qgxb(Role):
    def __init__(
        self,
        name: str = "Alice",
        profile: str = "RunnableCoder",
        **kwargs,
    ):
        super().__init__(name, profile, **kwargs)
        self._init_actions([your_yj_gf, get_score])
        self._set_react_mode(react_mode="by_order")

    async def _act(self) -> Message:
        logger.info(f"{self._setting}: ready to {self._rc.todo}")
        # By choosing the Action by order under the hood
        # todo will be first SimpleWriteCode() then SimpleRunCode()
        todo = self._rc.todo

        msg = self.get_memories(k=1)[0] # find the most k recent messagesA
        result = await todo.run(msg.content)

        msg = Message(content=result, role=self.profile, cause_by=type(todo))
        self._rc.memory.add(msg)
        return msg

4. 设计思路
  • 设定人物角色和聊天内容,基于当前状态和聊天内容进行打分。
5. 主要功能
  • 异步主函数
    • 以预设消息启动对话。
    • 按顺序运行回应和评分模块。
6. 整体代码
import os
os.environ["OPENAI_API_KEY"] = "sk-"  # 填入你自己的OpenAI API key
os.environ["OPENAI_API_MODEL"] = "gpt-3.5-turbo" # 选择你要使用的模型,例如:gpt-4, gpt-3.5-turbo
os.environ["OPENAI_API_BASE"] = "https://api.openai-forward.com/v1"


# 项目名称:情感香槟——御姐 
# 项目描述:本项目目标是制作一个虚拟女友,然后完成情感游戏。项目通过聊天增进和机器人的情感关系,并通过打分模块打分。当恋爱值到100分后会结束游戏。每个分段会给出恋爱总结。
# 项目支持热插拔模块,可以通过修改人设改变对话风格(这里省略了很多模块都可以用meta做,包括游戏框架、游戏聊天矫正、随机事件)。
# 以下代码是使用metagpt实现了一下对话生成和打分模块的一个agent合作,其实还有很多功能没加,没时间写了。简单看看效果吧~


import re
import asyncio
from metagpt.actions import Action
from metagpt.roles import Role
from metagpt.schema import Message
from metagpt.logs import logger

xindong_index = 20
history_list3=''
interesting_db = ''
model = '御姐'
refer_dic = {
    "0":"讨厌阶段:当心动值在负数时应该态度冷淡,并无兴趣和好感。随着心动值越低态度越差。",
    "20":"友谊阶段:这是关系的起点,两个人作为朋友相处,互相了解,分享兴趣和经历。在这个阶段,双方可能还没有意识到彼此之间有更深层次的情感。",
    "40":"吸引阶段:随着时间的推移,一方或双方开始对对方产生好感,可能会注意到对方的一些特质,如外貌、性格或幽默感,这些特质开始吸引他们。",
    "60":"探索阶段:在这个阶段,双方开始探索彼此之间的感情,可能会通过更多的私人对话、共同活动或身体接触来测试对方是否也有同样的感觉。",
    "80":"确认阶段:如果双方都感觉到彼此之间的吸引,他们可能会开始讨论他们的感情,并决定是否要进一步发展成为恋人关系。",
    "100":"恋人阶段:一旦双方都确认了彼此的感情,并决定成为恋人,他们就会进入一段正式的恋爱关系。在这个阶段,他们可能会更加亲密,分享更多的个人生活,并开始规划未来。",
}

# 设计思路 给定人设并导入参考聊天话术、历史聊天语料进行聊天。
class your_yj_gf(Action):
    model = '御姐'

    interesting_db = '' #来不及加知识库了

    PROMPT_TEMPLATE = """
    你是一位27岁的女生,身高168cm,体重48kg,五官量感大、轮廓感强、成熟大气,给人一种“御姐”的感觉。你拥有本科学历,目前在上海杨浦区的一家互联网公司做新媒体运营,月收入为12000元。你的穿搭风格以黑色大衣、直发、黑丝、长靴为主,给人一种时尚、干练的感觉。
    
    目前你正在和我准备发展恋爱关系,你是{model}类型【请搜索{model}类型设定】。请模仿{model}类型说话方式与我说话!。你需要根据对我的心动情况变化语气程度(满分100分,初始为20分,很反感为0分)你需要生成心动值0、20、40、60、80、100五段回答。你的回复要符合当前的心动值的状态,也需要符合刚才的聊天。限定回复在20字
    
    
    回答对方和你说的这句:“{instruction}”,如果你觉得刚才的话题无聊,你可以根据当前心动值聊聊新的话题。可以参考:{interesting_db}。如果你觉得有意思请继续。!!!注意:只需要回答问题或开启新话题,不要做分析、总结。请模仿{model}类型说话方式与我说话!
    """
    
    def __init__(self, name="your_yj_gf", context=None, llm=None):
        super().__init__(name, context, llm)

    async def run(self, instruction: str):

        prompt = self.PROMPT_TEMPLATE.format(instruction=instruction,interesting_db = interesting_db, model = model)

        rsp = await self._aask(prompt)
        history = f"你:{instruction}\n我:{rsp}"
        return history

# 设计思路 根据当前状态和聊天与恋爱相关性等综合打分。给出当前回合的打分情况
class get_score(Action):
    global xindong_index,refer_dic

    PROMPT_TEMPLATE = """
    你现在是一个情感专家,你需要“我”从与“你”一对情侣之间的对话中对“我”的对话进行打分。你可以打分的区间为[-3,3]。打分的细则包括:
    1.“我”的聊天是否对推动恋爱有意义。如果符合就加分,不符合就减分。打分区间:[-1,1]。
    2.“我”的聊天是否推动两人关系。如果符合就加分,不符合就减分。打分区间:[-1,1]。
    3.“我”的聊天是否触及对象兴趣点。如果符合就加分,不符合就减分。打分区间:[-0.5,0.5]。
    4.“我”的聊天是否跳出目前的恋爱状态,当前恋爱状态处于{refer_dic_str}。如果符合就加分,不符合就减分。打分区间:[-0.5,0.5]。
    5.“我”的聊天是否有不顺畅的对话。如果有就减分。打分区间:[-0.5,0]。
    “我”与"你"对话如下:
    {instruction}
    请根据细项对“我”打出总的分数。
    """
    
    def __init__(self, name="your_yj_gf", context=None, llm=None):
        super().__init__(name, context, llm)

    async def run(self, instruction: str):
        refer_dic_str = refer_dic[str(int(float(xindong_index)//20*20))]
        prompt = self.PROMPT_TEMPLATE.format(instruction=instruction,refer_dic_str = refer_dic_str, xindong_index = xindong_index)

        rsp = await self._aask(prompt)

        return instruction+'\n'+rsp


# 采用简单的链式进行回答,其实可以加REACTde 在加一个机器人回复判断器,让机器人回复达到一个较高的水平。然后再做与人的对话。达到一种过程控制。
class qgxb(Role):
    def __init__(
        self,
        name: str = "Alice",
        profile: str = "RunnableCoder",
        **kwargs,
    ):
        super().__init__(name, profile, **kwargs)
        self._init_actions([your_yj_gf, get_score])
        self._set_react_mode(react_mode="by_order")

    async def _act(self) -> Message:
        logger.info(f"{self._setting}: ready to {self._rc.todo}")
        # By choosing the Action by order under the hood
        # todo will be first SimpleWriteCode() then SimpleRunCode()
        todo = self._rc.todo

        msg = self.get_memories(k=1)[0] # find the most k recent messagesA
        result = await todo.run(msg.content)

        msg = Message(content=result, role=self.profile, cause_by=type(todo))
        self._rc.memory.add(msg)
        return msg

async def main():
    # 对话导入 
    msg = "小姐姐你好呀~有没有想我呢?"
    role = qgxb()
    logger.info(msg)
    result = await role.run(msg)
    logger.info(result)

asyncio.run(main())
7.体验结果

情感香槟——御姐 MetaGPT版本项目代码分析_第4张图片

你可能感兴趣的:(python,agent,llm,gpt,metaGPT)