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