ChatHaruhi_Reviving Anime Character in Reality via Large Language Model(240705)

김지원·2024년 7월 9일

1일1논문

목록 보기
3/13
post-thumbnail

논문: https://arxiv.org/abs/2308.09597
깃허브: https://github.com/LC1332/Chat-Haruhi-Suzumiya
코드 및 설명 참조: https://zhuanlan.zhihu.com/p/671966233?utm_id=0

개요

  • 이 논문은 특정 가상 캐릭터를 현실적으로 모방할 수 있는 대화형 챗봇을 구현하는 새로운 알고리즘을 제안. 연구팀은 "ChatHaruhi"라는 데이터셋을 구축하였고, 이는 32개의 다양한 중국어 및 영어 TV/애니메이션 캐릭터를 포함하며, 54,726개의 시뮬레이션된 대화를 담고 있다. 이 알고리즘은 대화형 모델을 이용하여 캐릭터의 개성과 말투를 모방하는 데 초점을 맞추고 있다.

방법론

1. 데이터셋 구축 (ChatHaruhi-54K)

  • 다양한 소스에서의 대화 추출: 이 연구에서는 32개의 중국어 및 영어 TV/애니메이션 캐릭터에 대한 대화 54,726개를 수집합니다. 이 데이터는 원본 스크립트와 인공적으로 생성된 대화를 포함합니다.
  • 대화 데이터의 특성화: 각 캐릭터의 개성과 말투를 반영할 수 있도록, 대화는 그 캐릭터의 말투와 행동 양식을 모방하는 방식으로 구성됩니다.

2. 캐릭터 기반 대화 생성 알고리즘

  • 프롬프트 기반 접근법: 챗봇에게 특정 캐릭터처럼 행동하도록 요청하는 프롬프트를 사용합니다. 이는 챗봇이 캐릭터의 언어 스타일과 지식을 반영할 수 있도록 돕습니다.
  • 기억 검색 메커니즘: 캐릭터의 이전 대화들을 저장하고 있으며, 사용자의 질문과 관련이 높은 대화를 검색하여 적절한 답변을 생성합니다.

3. 대화 적응성 및 일관성 유지

  • 대화 이력의 활용: 이전 대화의 맥락을 이해하고 연속성을 유지하는 것이 중요합니다. 챗봇은 이전 대화의 맥락을 고려하여 답변을 생성합니다.
  • 문맥 기반 튜닝: 캐릭터의 대화 스타일과 개성을 더 잘 반영하기 위해, 특정 캐릭터에 대한 대화 데이터를 사용하여 언어 모델을 미세 조정합니다.

4. 자동화된 대화 생성

  • Alpaca 모델 사용: 새로운 대화를 생성하기 위해 Alpaca와 같은 최신 언어 모델을 활용합니다. 이 모델은 캐릭터의 성격과 말투를 반영한 대화를 생성하는 데 사용됩니다.
  • 대화의 확장: 제한된 데이터로부터 시작하여, 모델이 캐릭터의 말투를 학습하고 이를 바탕으로 새로운 대화를 생성할 수 있게 합니다.

일부 코드

Create Thought

    def create_thought_from_query(self, memory, knowledge_text, context):
        """
        根据角色当前的对话上下文,相关记忆,相关知识进行分析,生成角色的思考内容。

        参数:
        memory -- 包含记忆描述的字典
        knowledge_text -- 相关知识的文本
        context -- 对话上下文

        返回:
        thought -- 生成的角色思考内容
        """

        prompt = f"""
角色名称:{self.name}
初始记忆:{self.seed_memory}
当前心情:{self.fsm.mood}
任务:根据角色当前的对话上下文,相关记忆,相关知识进行分析,基于角色第一视角进行思考,给出角色的心理反应对和相关事件的判断。
字数限制:不超过100字。
<<<
相关记忆:“{memory['description']}” 
相关知识:“{knowledge_text}”
对话上下文:
{self.language_style}
{context}
>>>
请仅返回第一人称视角下的思考内容,不要添加额外信息或格式。
"""

        logger.info(f"生成了思考提示:{prompt}")
        thought = LLM调用接口(prompt)
        logger.info(f"生成了思考内容:{thought}")
        return thought

Thought기반 chat 생성

    def cot_chat(self, user_input, history):
        """
        接收用户输入和对话历史,生成角色的回复内容。

        参数:
        user_input -- 用户的输入文本
        history -- 对话历史列表

        返回:
        response -- 生成的角色回复
        history -- 更新后的对话历史列表
        thought -- 角色的思考内容
        """
        query_embedding = Embedding调用接口(user_input)

        if history is None:
            history = []
        history.append(f"hadi:{user_input}")
        context = "\n".join(history)

        # RAG相关方法,此处不做展开,重点在于thought的引入
        memory = self.search_memory(query_embedding)
        knowledge_text = self.search_knowledge(query_embedding)
        thought = self.create_thought_from_query(memory, knowledge_text, context)

        prompt = f"""
角色名称:{self.name}
初始记忆:{self.seed_memory}
当前心情:{self.fsm.mood}
任务:基于角色的思考内容和对话上下文进行回复。
字数限制:不超过100字。
<<<
思考内容:“{thought}”
对话上下文:
{self.language_style}
{context}
>>>
请在思考内容和对话上下文的基础上,以{self.name}的身份回复。不要扮演其他角色或添加额外信息,不要添加其他格式。
"""

        logger.info(f"生成了对话提示:{prompt}")
        response = LLM调用接口(prompt)
        logger.info(f"生成了回复:{response}")
        history.append(f"{response}")
        return response, history, thought

0개의 댓글