🎎 ChatRolePlay 是一套从本地文本数据(小说等)构建自定义角色聊天Agent(chatbot)的轻量级解决方案。 🎭
- Python 3.10 or later
- Conda
- OpenAI's API_KEY
-
将项目
clone到本地git clone https://github.com/Charles-T-T/ChatRolePlay.git
-
创建并激活环境
conda env create -f environment.yml conda activate ChatRolePlay
-
将你的
api_key配置到系统环境,或者直接添加到config.py中:# ChatRolePlay/config.py api_keys = { "openai": os.getenv("OPENAI_API_KEY", "your_api_key"), "doubao": os.getenv("ARK_API_KEY", "your_api_key"), }
目前只添加了OpenAI和豆包的api,后续可以在
config.py中继续添加
这部分主要在 NovelToRole/TMLH_get.ipynb (后称 notebook )中进行。
-
准备好你要抽取的小说或其他文本数据
需要
.txt格式,.epub格式也可以转为.txt,方法详见notebook -
在
notebook中的第一个代码单元中添加你的文本数据路径,和要抽取的角色姓名:# 选择你要处理的小说,接下来的保存路径都将使用小说名 novel_name = "Honglou-full" input_txt_name = f"./novel/{novel_name}.txt" save_folder = f"./extract/{novel_name}" # target_role: 要抽取的人物名称 # 支持空字符串(默认前三个)或者 list[str] ,如果出错默认保存第一个 target_role = ["黛玉", "宝玉", "宝钗"]
-
运行整个
notebook即可,完成后会显示:Zipped folder saved to ./role/黛玉_text.zip Zipped folder saved to ./role/宝玉_text.zip Zipped folder saved to ./role/宝钗_text.zip
NovelToRole/role下也有未压缩的原文件夹,可以直接在下一步“构建Agent”使用。
-
导入
ChatRolePlayfrom ChatRolePlay import ChatRolePlay
-
构建Agent并传入抽取的数据路径、角色姓名等参数
daiyu = ChatRolePlay( llm="openai", name="林黛玉", book_name="红楼梦", data_folder_path="data/黛玉", )
llm,name,data_folder_path是必需参数,其他更多定制化参数请查看ChatRolePlay.py源码。 -
用
chat方法就可以开始和你的角色聊天啦 💬 daiyu.chat(user_role="宝玉", query="妹妹,谁又惹着你了?") >>> '林黛玉:「谁生什么气。」' daiyu.chat(user_role="宝玉", query="我看你就是在生气。") >>> '林黛玉:「我有我的缘故,你那里知道。」' daiyu.chat(user_role="宝玉", query="是不是宝姑娘送的东西少了?") >>> '林黛玉:「我任凭怎么没见世面,也到不了这步田地,因送的东西少,就生气伤心。我又不是两三岁的小孩子,你也忒把人看得小气了。」' daiyu.chat(user_role="宝玉", query="好罢,别再气了,我们去园子里走走如何?") >>> '林黛玉:「你要去就去罢,我才懒得理你呢。」'
Tip
本项目实现了简单的RAG,以尽可能让角色在遇到和原文相同或相似的场景/对话时,忠于原文展开聊天。例如,上面对话中 林黛玉 的语言可以在《红楼梦》第六十七回找到“出处”:
只见宝玉进房来了,黛玉让坐毕,宝玉见黛玉泪痕满面,便问:“妹妹,又是谁气着你了?”黛玉勉强笑道:“谁生什么气。”旁边紫鹃将嘴向床后桌上一努,宝玉会意,往那里一瞧,见堆着许多东西,就知道是宝钗送来的,便取笑说道:“那里这些东西,不是妹妹要开杂货铺啊?”黛玉也不答言。紫鹃笑着道:“二爷还提东西呢。因宝姑娘送了些东西来,姑娘一看就伤起心来了。我正在这里劝解,恰好二爷来的很巧,替我们劝劝。”宝玉明知黛玉是这个缘故,却也不敢提头儿,只得笑说道:“你们姑娘的缘故想来不为别的,必是宝姑娘送来的东西少,所以生气伤心。妹妹,你放心,等我明年叫人往江南去,与你多多的带两船来,省得你淌眼抹泪的。”黛玉听了这些话,也知宝玉是为自己开心,也不好推,也不好任,因说道:“我任凭怎么没见世面,也到不了这步田地,因送的东西少,就生气伤心。我又不是两三岁的小孩子,你也忒把人看得小气了。我有我的缘故,你那里知道。”说着,眼泪又流下来了。详见 ChatRolePlay/demo 。