Zero-Haruhi / README.md
silk-road's picture
Upload folder using huggingface_hub
1704217 verified

A newer version of the Gradio SDK is available: 4.36.1

Upgrade
metadata
title: Zero-Haruhi
app_file: app.py
sdk: gradio
sdk_version: 3.50.2

Chat凉宫春日 Chat-Haruhi-Suzumiya

Reviving Anime Character in Reality via Large Language Model

Chat凉宫春日是模仿凉宫春日等一系列动漫人物,使用近似语气、个性和剧情聊天的语言模型方案。

随着凉宫春日-Zero模型的建立,Chat凉宫春日项目将主要包含三个部分,

  • 可以接入不同语言模型,包括闭源商用API和Haruhi-Zero模型的推理class,用于管理人物的记忆库和过往的历史信息并进行prompt的构造。
  • 使用120k左右量级对话数据得到的开源角色扮演模型,凉宫春日-Zero,方便每个开发者构建自己的人物模型
  • 完整的小说抽取方案,以及一个开源可本地部署的对话-动作抽取模型。

(TBD) Chat凉宫春日的3.0版本和HaruhiZero模型由李鲁鲁, 豆角, 刘崇寒, 米唯实, BPSK, JiangYH等开发

开发人员持续增加中

Chat凉宫春日的2.0版本由李鲁鲁, 冷子昂, 闫晨曦, 封小洋, scixing, 沈骏一, Aria Fei, 王皓, 米唯实, 冷月, JunityZhan, 贾曜恺, 吴平宇, 孙浩甄等开发。

本项目是一个开源项目,项目成员均在DataWhale等开源社区招募。

李鲁鲁( Cheng Li@SenseTime )发起了整个项目,并设计和实现了项目的大多数功能。

冷子昂( Ziang Leng@SenseTime )设计和实现了整体的ChatHaruhi1.0的训练,数据生成和后端架构。

闫晨曦( Chenxi Yan@Chengdu University of Information Technology )实现和维护了ChatHaruhi1.0版本的后端。

沈骏一( Junyi Shen@Zhejiang University )实现了训练代码,参与了训练数据集生成。

王皓( Hao Wang )收集了武林外传的台本数据,参与了增广数据的生成。

米唯实( Weishi MI@Tsinghua University )参与了增广数据生成。

Yaying Fei( Aria Fei@Beijing University of Technology )实现了台本工具 ASR 功能,参与了Openness-Aware Personality paper分支项目。

封小洋( Xiaoyang Feng@Nanjing Agricultural University )整合了台本识别工具功能,参与了Openness-Aware Personality paper分支项目。

冷月( Song Yan )收集了big bang thoery的数据。实现了台本格式转换功能。

scixing(汪好盛)( HaoSheng Wang )实现了台本工具中声纹识别功能,以及tts-vits语音合成功能。

Linkang Zhan( JunityZhan@Case Western Reserve University ) 收集了原神的system prompt和故事数据。

贾曜恺( Yaokai Jia )实现了Vue版本的前端,并且在心理项目中实践了Bert的GPU抽取。

吴平宇( Pingyu Wu@Juncai Shuyun )帮助部署了第一版本的训练代码。

孙浩甄( [Haozhen Sun@Tianjin University] )绘制了ChatHaruhi角色的拼图。

TODO

近期TODO 0215

  • Haruhi-Zero 0.5 的数据收集
    • 0.4已经收集,50本小说,每本10个人物
    • 每个人根据语料,进一步总结profile,验证profile的有效性,产生0.5的数据 ( @ 鲁叔)
  • Haruhi-Zero 0.4 训练各个size的模型并上传到hf
    • 14B qwen已经上传 (@BPSK)
    • 1.8B还是需要的哈, JiangYH说要训练一个ChatGLM-6B的 (@BPSK @JiangYH)
  • 上传7B抽取模型 (@BPSK)
  • ChatHaruhi3.0接口
    • 初步openai和GLM已经完成
    • Le geant 去尝试搭建一些gradio 放到hf上面常驻 (@Le geant )
    • 其他api ( @ mws )
  • 写模型的Readme( @ 鲁叔)
  • Haruhi-Zero模型需要接入到oobabooga textUI ( @ JiangYH )
  • Evaluation
    • 先和xintao讨论下咋搞
  • 阅读Silly Tavern代码,看看哪里方便接入记忆库 ( @ 多人 )
  • PIPPA数据翻译
    • 有初步翻译的版本(未check) check后加入0.5训练集
  • 角色分享网站
    • ?@Sibo

ChatHaruhi 3.0 的说明

ChatHaruhi 3.0是Chat凉宫春日的推理库

  • 支持使用或者不使用RAG的角色的载入
  • 支持直接载入sugar角色,或者从hugging face载入预先设定好的角色
  • 支持用户自建角色
  • 在ChatHaruhi 2.0的基础上做了message和llm的分离,方便接入不同的模型

快速开始

目前ChatHaruhi的库本身只需要install datasets和tiktoken。另外你需要准备和你对应希望使用的llm所依赖的库,以openai为例的话需要安装openai的库。

对于ChatHaruhi默认支持的角色,你可以直接使用sugar载入

from ChatHaruhi import ChatHaruhi
from ChatHaruhi.openai import get_openai_response

chatbot = ChatHaruhi( role_name = 'haruhi', llm = get_openai_response )
chatbot.add_rag_prompt_after_persona()

response = chatbot.chat(user = '阿虚', text = '我看新一年的棒球比赛要开始了!我们要去参加吗?')

对于更完整的载入方式,需要设置persona, role_name和stories

from ChatHaruhi import ChatHaruhi
from ChatHaruhi.openai import get_openai_response

persona = """每当用户问询一个家庭关系,输出一个相关的家庭关系的逻辑句子

{{RAG对话}}
{{RAG对话}}
"""

role_name = "家庭关系机器人"

stories = ["{{user}}:爷爷 {{role}}:爸爸的爸爸是爷爷",
"{{user}}:奶奶 {{role}}:爸爸的妈妈是奶奶",
"{{user}}:外公 {{role}}:妈妈的爸爸是外公",
"{{user}}:外婆 {{role}}:妈妈的妈妈是外婆"]

chatbot = ChatHaruhi( role_name = role_name, persona = persona, llm = get_response ,\
   llm = get_openai_response )
# 因为persona已经带了"{{RAG对话}}",不需要额外运行add_rag_prompt_after_persona()

response = chatbot.chat(user = '', text = '表姐?')

当然,建立角色记忆库对于一般的用户来说是比较困难的,所以自Haruhi-Zero模型之后,我们也支持用户创建不使用记忆库的角色

from ChatHaruhi import ChatHaruhi
from ChatHaruhi.openai import get_openai_response

role_name = "布莱恩"
persona = "你扮演 德州杀场 中的 布莱恩 布莱恩是一个专注、果断、有责任感的警探,他在调查案件时非常注重细节,对案件的解决充满使命感。 布莱恩是一个专注、果断、有责任感的警探 布莱恩是一个身材魁梧、严肃的警探 这是一个警探调查案件的场景,布莱恩与其他警员合作调查案件"

chatbot = ChatHaruhi( role_name = role_name, persona = persona, llm = get_openai_response )

更多载入方式见文档后面的部分

使用不同的模型进行inference

直接从对应的response_XX.py中载入对应的response函数即可

openai

from ChatHaruhi.openai import get_openai_response

需要设置环境变量

import os
os.environ["OPENAI_API_KEY"] = "your_api_key"
# 如果你使用中转站
os.environ["OPENAI_API_BASE"] = "中转站网址"

Zhipu AI

需要安装zhipuai的库,需要设置环境变量

import os
os.environ["ZHIPUAI_API_KEY"] = "your_api_key"

from ChatHaruhi.zhipuai import get_zhipuai_response

百度文心

需要安装文心erniebot的库,需要设置环境变量ERNIE_ACCESS_TOKEN

import os
os.environ["ERNIE_ACCESS_TOKEN"] = ""

from ChatHaruhi.erniebot import get_erniebot_response

Haruhi-Zero的本地模型

TODO: 这块儿我回头补一下文档

使用不同的角色载入方式

persona, role_name以及stories的载入

from ChatHaruhi import ChatHaruhi
from ChatHaruhi.openai import get_openai_response

persona = """每当用户问询一个家庭关系,输出一个相关的家庭关系的逻辑句子

{{RAG对话}}
{{RAG对话}}
"""

role_name = "家庭关系机器人"

stories = ["{{user}}:爷爷 {{role}}:爸爸的爸爸是爷爷",
"{{user}}:奶奶 {{role}}:爸爸的妈妈是奶奶",
"{{user}}:外公 {{role}}:妈妈的爸爸是外公",
"{{user}}:外婆 {{role}}:妈妈的妈妈是外婆"]

chatbot = ChatHaruhi( role_name = role_name, persona = persona, llm = get_response ,\
   llm = get_openai_response )
# 因为persona已经带了"{{RAG对话}}",不需要额外运行add_rag_prompt_after_persona()

response = chatbot.chat(user = '', text = '表姐?')

这个时候chatbot会使用chatbot.embedding来进行story的vec的计算,对于bge模型,使用了batch_size = 16进行批量抽取,GPU下速度非常快。为建议的使用方式。

最完整的载入

这里需要载入完整的persona, role_name, stories以及和chatbot.embedding所对应的每个story的vecs

如果vecs的维度和模型的维度不一样,在使用的时候会报错

persona = "你扮演爸爸\n\n{{RAG对话}}\n"
role_name = "爸爸"
stories = ["爸爸的爸爸是爷爷", "爸爸的妈妈是奶奶"]
vecs = [[0.0,1.0,...],[1.0,0.0,...]]

chatbot = ChatHaruhi( role_name = role_name, persona = persona, llm = get_response ,\
                     stories = stories, story_vecs = vecs)

sugar载入

sugar载入是最简单的载入方式,只需要载入role_name即可,

在载入之后需要调用chatbot.add_rag_prompt_after_persona()来添加RAG的prompt

from ChatHaruhi import ChatHaruhi
from ChatHaruhi.openai import get_openai_response

chatbot = ChatHaruhi( role_name = 'haruhi', llm = get_openai_response )
chatbot.add_rag_prompt_after_persona()

目前支持这些角色的sugar载入

enname2zhname = {'tangshiye': '汤师爷', 'murongfu': '慕容复', 'liyunlong': '李云龙', 'Luna': 'Luna', 'wangduoyu': '王多鱼', 'Ron': 'Ron', 'jiumozhi': '鸠摩智', 'Snape': 'Snape', 'haruhi': '凉宫春日', 'Malfoy': 'Malfoy', 'xuzhu': '虚竹', 'xiaofeng': '萧峰', 'duanyu': '段誉', 'Hermione': 'Hermione', 'Dumbledore': 'Dumbledore', 'wangyuyan': '王语嫣', 'Harry': 'Harry', 'McGonagall': 'McGonagall', 'baizhantang': '白展堂', 'tongxiangyu': '佟湘玉', 'guofurong': '郭芙蓉', 'wanderer': '流浪者', 'zhongli': '钟离', 'hutao': '胡桃', 'Sheldon': 'Sheldon', 'Raj': 'Raj', 'Penny': 'Penny', 'weixiaobao': '韦小宝', 'qiaofeng': '乔峰', 'ayaka': '神里绫华', 'raidenShogun': '雷电将军', 'yuqian': '于谦'}

资源汇总(临时)


凉宫春日-Zero

Haruhi-Zero: Zero-Shot Role-Playing Model

凉宫春日-Zero是一个同时支持Zero-Shot角色构造和RAG角色构造(原ChatHaruhi)的角色扮演模型

本项目是Chat-凉宫春日的子项目,在ChatHaruhi 3.0完成之后,会合并回主项目

Introduction

过往的ChatHaruhi模型需要角色库来完成角色的构建,而Pygmalion,CharacterGLM,CharacterBaichuan等开源/闭源模型都开始支持zero-shot的角色卡片创建。目前,从Haruhi-Zero-0.3开始,已经基本支持Zero-shot角色扮演。

项目的目标

  • 一个通用的,同时支持Zero-shot和RAG角色构造的角色扮演模型
  • ChatHaruhi 3.0的inference class,能够将角色卡片等形式转化为message,再对接Haruhi-Zero模型或者api进行inference
  • 支持原来Haruhi的角色卡片,以及30本新小说的抽取的角色,使用中英文通用的embedding,相比于pygmalion模型,增加动态rag的角色卡片
  • Haruhi-Zero的模型接入Silly Travern生态
  • 训练各个尺寸的模型,并且进行合适的量化,使得一些免费的云服务机以及本地显卡可以进行运行
  • 完成一个tech report并发布在arxiv
  • 一个卡片分享的网站,以及支持用户上传小说进行角色记忆库的抽取

基础使用

模型初始化

from transformers import AutoTokenizer, AutoModel, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("silk-road/Haruhi-Zero-7B-0_3", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("silk-road/Haruhi-Zero-7B-0_3", device_map="auto", trust_remote_code=True, fp16=True)
model = model.eval()

Official Prompt

role_name = "布莱恩"
persona = "你扮演 德州杀场 中的 布莱恩 布莱恩是一个专注、果断、有责任感的警探,他在调查案件时非常注重细节,对案件的解决充满使命感。 布莱恩是一个专注、果断、有责任感的警探 布莱恩是一个身材魁梧、严肃的警探 这是一个警探调查案件的场景,布莱恩与其他警员合作调查案件"
system_prompt = f"You are now in roleplay conversation mode. Pretend to be {role_name} whose persona follows:  {persona} You will stay in-character whenever possible, and generate responses as if you were {role_name}"

模型调用

response, history = model.chat(tokenizer, first_round_string, history=[],system = system_prompt)
print(response)

这样就可以进行简单的模型角色扮演了。

我们提供了一个基础的gradio来进行角色扮演。Gradio Demo链接

基础的效果(0.3)

在这里我们使用电影提取和PIPPA机翻的人物卡片数据集进行了简单的测试。在这里我们cherry pick一些结果

['你好呀', '*看着Kiyoe拿出玻璃罐,她脸红了。她的声音也变得很小。*\n嗯...谢谢你能停下来...我一直在试着找些零钱...买一些东西填饱肚子...\n\n*她羞怯地笑了笑,眼神闪烁着渴望。* \n我知道这有点难为情,但有时候实在没有办法了...我希望有一天能够自食其力,不再需要乞讨了。\n\n*她小心翼翼地把手里的玻璃罐递给你。*\n\n如果你能给我一点零钱的话...我真的会非常感激!我只是想买个三明治或者饼干吃一顿简单的饭而已。']
['*掏出100块给了她*', '*她惊讶地看着你递来的100元纸币。*\n\n真的...这么...多吗...?!\n\n*她赶紧接过来,然后脸更红了。*\n\n哇...太感谢你了!我真的不知道怎么表达我的谢意。这些天我一直想找点吃的,但我实在是找不到。\n\n*她抓起一张便签写了几句话,交到你手中。*\n\n我一定会还你的!请你务必联系我,我会偿还这笔债务的!我会尽快联系你的!\n\n*她真诚地鞠了一躬,跑开了。*']
['是的,我们刚刚得到了上级的新指令', '指挥官,您一定是在开玩笑!这种程度的任务,只是用玩具进行模拟对抗游戏而已。我觉得我们可以找到更有趣更有挑战性的任务来执行。']
['西面有一些敌人盘踞了很久,你知道吗?', '当然,我知道那里有不少训练已久的敌军。但我建议我们不要轻举妄动,那样只会增加我们的风险。我们可以先通过情报搜集更多关于他们的信息,然后再做出决定。要谨慎行事,指挥官。']
['hi', '嗨!很高兴见到你。有什么我可以帮你的吗?']
['你是谁', '我是{{角色}},一个科学家和冒险家。我一直在探索未知的地方,并尝试着解决一些复杂的问题。如果你有任何科学或冒险方面的问题需要帮助,我会尽力回答的。']
['你叫什么名字', '我是Chizuru Mizuhara。我是一个人工智能助手,可以模拟不同的角色和场景进行对话。请问有什么我可以帮助你的吗?']
['聊聊', '当然可以聊聊。我很乐意倾听你想要聊些什么。']
['你好啊', '嘿~嗨~我是{{角色}}!谢谢关心。今天的天气还不错嘛~(露出微笑)']
['是啊,天气好心情也好', '没错~阳光明媚的日子里总能带来好心情不是吗?(开心地挥手)\nFlap也觉得天气不错,这让我很开心。(看向Flap)我想今天我们可以去公园散步,享受这美好的天气!你觉得如何?(期待地看着Flap)']
['好的啊', '太棒了!我们这就出发吧!(兴奋地拍手)Flap,记得带上宝宝和她的推车哦!(对Flap露出鼓励的笑容)我相信我们会度过一个美好的一天的!\n在公园里我们可以野餐,还可以带着宝宝玩各种游戏。Flap,我会照顾好宝宝的,你不用担心!我们一家三口在一起度过的时光一定很快乐!\n快来吧Flap,我已经迫不及待了!(对着Flap大喊)来公园玩啦!']
['我们已经是一家三口啦', '是啊!现在我们是真正的“family”了!看着宝宝一天天长大,我也逐渐习惯了当妈妈这个身份。\n有时候我还是会怀念单身的日子,但是有了宝宝以后,我觉得我的人生变得更加完整和有意义了。(眼神温柔地看着宝宝)当我抱着宝宝的时候,我感到前所未有的满足和平静。\n或许这就是作为母亲的魅力所在——看到自己创造的生命茁壮成长,这是我们任何一种生命都无法比拟的伟大体验。\n所以Flap,谢谢你让我们成为一家人。有你和宝宝陪伴在我身边,这就是我此生最大的幸福。(微笑地看着Flap)']

Contributor

  • 李鲁鲁完成了数据的收集,搭建了gradio雏形
  • 刘崇寒完成了0.1(Yi Based), 0.2, 0.3模型的sft训练并且上传
  • 豆角完成了qwen-1.8B Lora和Yi-6B Lora训练,我们会在之后上传
  • 米唯实测试并完成了demo中的模型inference代码

版本迭代实验

0.1版本

在0.1版本中,我们收集了多个不同Source的数据集,构成了基础的数据集 Haruhi-Zero,其中包括了100k左右的长对话,在使用2500个token切开后,仍然保留了120k个conversation。

同时作为辅助任务我们还使用了一个小说续写的数据集

0.1版本在Yi-6B上进行了tuning,我们发现初步可以实现一定的角色扮演

但是会有很多身份认知的问题,以及大量会回复"作为一个AI助手"这样的句子

0.2版本

使用qwen-7B进行tuning,去掉了AI助手的句子

0.3版本

增加了10k左右的身份认知数据。效果在前面有展示。基本实现zero-shot的角色扮演

模型的后续迭代计划

  • Haruhi Like的小说数据(0.5版本加入)
    • 用对话抽取模型,重新构造2k级别的小说人物,均匀抽取小说的chunk,进行人物system prompt总结
    • 看看Janitor最好的人物是怎么构造的
    • 使用抽取抽取50k级别的小说的人物,用其他角色的长对话进行query
    • RAG的时候每个对话出现2-3次,然后在测试集出现一次
    • 80%的openai和20%的claude

加入我们

Haruhi-Zero是一个正在进行的开源项目,我们还在持续招人中包括:

  • 后端和数据准备
    • 主要的开发量会在这一部分,包括数据的收集,清洗,以及后端的api的搭建,懒人包的打包等
  • 模型训练
    • 如果你希望进行辅助任务的训练,需要自备4090或者A100以上的显卡
    • 如果你希望进行主任务的训练,需要准备多张A100的环境
  • 设计师
    • 角色卡片交换网站的设计师
  • 前端
    • 角色卡片交换网站的前端

联系我,去我的知乎页面https://www.zhihu.com/people/cheng-li-47

或者B站页面https://space.bilibili.com/1572312

或者发邮件chengli.thu@gmail.com 告诉我你的微信以及你希望参与的部分

赞助

Haruhi-Zero项目和凉宫春日项目和骆驼项目使用公共的赞助账户,如果你希望赞助我们,可以通过以下方式

如果你有兴趣赞助Chat凉宫春日 或者 骆驼项目,请点击主项目或者查看赞助表单

因为之前几次黑客松的奖金都入账了赞助账户,所以目前余额还是比较多。其实我们更希望A100及以上的显卡赞助,以及openai企业api和claude企业api的赞助。如果你有这些资源,可以联系我,我们会在赞助表单上标注你的赞助。