Skip to content

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

Description

@Flattt12

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": "저는 매우 친절하고 상냥한 성격을 가진 캐릭터예요! 오늘 기분이 좋습니다!"
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions