TreeNut-KR / ChatBot

ChatBot 웹사이트 프로젝트
GNU General Public License v3.0
1 stars 0 forks source link

자연어 처리 기반 AI 캐릭터 성격 구성 방법 #35

Open Flattt12 opened 1 month ago

Flattt12 commented 1 month ago

1. 사용자 입력 기반 성격 분석 및 프롬프트 생성

사용자가 characterSetting에 적은 텍스트를 분석하여 그 성격을 이해하고, 이를 바탕으로 대화 스타일을 생성하는 방식이다. 이를 위해 간단한 텍스트 분석 방법을 사용하거나 GPT와 같은 NLP 모델을 이용한다.

2. CharacterService 수정 (자동 분석 및 프롬프트 생성)

@Service
class CharacterService(val restTemplate: RestTemplate, val characterRepository: CharacterRepository) {

    fun talkToCharacter(characterId: Long, userMessage: String): String {
        // 캐릭터 정보 가져오기
        val character = characterRepository.findById(characterId).orElseThrow { 
            Exception("캐릭터를 찾을 수 없습니다.") 
        }
        // 성격을 분석해서 프롬프트 생성 (AI 기반 분석)
        val prompt = generatePromptBasedOnCharacterSetting(character.characterSetting, character.characterName, userMessage)

        // LLaMA API 요청 생성
        val request = LlamaRequest(prompt = prompt)

        // LLaMA API 호출
        val llamaApiUrl = "http://llama-api-url/talk" // LLaMA API URL 설정
        val response = restTemplate.postForObject<LlamaResponse>(llamaApiUrl, request)

        // LLaMA API의 응답 처리
        return response?.output ?: "응답을 받을 수 없습니다."
    }
    // 캐릭터 성격에 따른 프롬프트 생성
    fun generatePromptBasedOnCharacterSetting(characterSetting: String, characterName: String, userMessage: String): String {
        // 성격에 따라 적절한 말투 스타일을 자동 생성
        return """
            ${characterName}는 "$characterSetting" 성격을 가지고 있습니다. 이 성격에 맞는 말투로 대답하세요.
            질문: $userMessage
            답변:
        """.trimIndent()
    }
} 

talkToCharacter: 캐릭터의 ID와 사용자가 입력한 메시지를 받아서 캐릭터의 성격(characterSetting)에 맞게 프롬프트를 생성하고, 이를 LLaMA API에 전달하여 대답을 받는다.

generatePromptBasedOnCharacterSetting: 캐릭터의 성격과 이름을 사용하여 맞춤형 프롬프트를 생성한다.

3. CharacterController 수정

사용자가 캐릭터에게 말을 걸 수 있는 엔드포인트를 추가

@RestController
@RequestMapping("/character")
class CharacterController(
    private val characterService: CharacterService
) {

    // 캐릭터와 대화하는 엔드포인트
    @PostMapping("/{characterId}/talk")
    fun talkToCharacter(
        @PathVariable characterId: Long, 
        @RequestBody request: TalkRequest
    ): ResponseEntity<String> {
        val userMessage = request.message

        // 캐릭터 대답 받기
        val response = characterService.talkToCharacter(characterId, userMessage)
        return ResponseEntity.ok(response)
    }
}

// 요청 데이터를 위한 DTO
data class TalkRequest(
    val message: String
)

talkToCharacter: 클라이언트가 캐릭터와 대화할 수 있도록 POST 엔드포인트 /character/{characterId}/talk를 추가한다. 사용자의 메시지를 받아 CharacterService의 talkToCharacter 메서드를 호출하고, 캐릭터의 대답을 클라이언트에 반환한다.

3. LlamaRequest 및 LlamaResponse 모델

data class LlamaRequest(
    val prompt: String
)

data class LlamaResponse(
    val output: String
)

이 모델은 LLaMA API와의 데이터 송수신에 사용된다.

최종적인 구성

  1. CharacterController의 /talk 엔드포인트에서 캐릭터와의 대화를 시도한다.
  2. CharacterService에서 캐릭터의 성격(characterSetting)을 분석하여 프롬프트를 생성하고, 이를 LLaMA API에 보내어 대답을 받는다.
  3. 클라이언트는 캐릭터와 자연스러운 대화를 할 수 있다

4. 예시

코드가 정상 작동 할 시 예시이다.

POST 요청

POST /character/1/talk
Content-Type: application/json

{
    "message": "오늘 기분이 어때?"
}

응답

{
    "response": "저는 매우 친절하고 상냥한 성격을 가진 캐릭터예요! 오늘 기분이 좋습니다!"
}