영리의 테크블로그

Vector DB (Chroma DB)을 활용한 LLM 페르소나 부여하기 본문

dev/AI

Vector DB (Chroma DB)을 활용한 LLM 페르소나 부여하기

영리0 2024. 10. 9. 23:57

페르소나 부여

OPENAI 의 언어 모델과 임베딩 모델 을 활용할거임

임베딩은 Chroma DB 넣어 각 페르소나의 기억에 더할 예정


개요

  • OpenAI의 LLM을 활용하여 다양한 페르소나를 가진 AI 캐릭터를 만들기
  • 각 페르소나의 성격과 말투에 맞는 대화 스타일 구현
  • Chroma Vector DB를 활용해 대화 내역을 임베딩하여 저장하고, 이를 바탕으로 이전 대화와의 연속성을 유지
  • 각자의 페르소나가 다른 생각을 가지고 있게 하기

작동 예시

페르소나 Vector db


OpenAI API로 응답 생성

페르소나에 맞는 대화 생성

def generate_response(persona_name, user_input):
    persona = personas[persona_name]
    prompt = f"{persona_name}의 관점에서, {persona['description']} 사용자에게 {persona['tone']}로 응답하세요.\\\\n\\\\n사용자: {user_input}\\\\n{persona_name}:"

    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=150,
        temperature=0.7,
    )
    return response.choices[0].text.strip()
  • generate_response : persona_name과 user_input을 인자로 받아, 사용자가 선택한 페르소나에 따라 응답 생성.
  • prompt : 페르소나의 설명과 말투를 기반으로 사용자 질문에 맞는 대답을 생성하도록 유도.
  • temperature: 창의성 조정한다는데 잘 모르겠음.
  • max_tokens: 출력 토큰 조절.

Chroma Vector DB 활용

임베딩 저장

Chroma Vector DB를 사용하여 대화 내역을 벡터화하고 저장할 수 있음.

이를 통해 내가 한말들과 포스팅을 기억할 수 있게 됨

def store_embedding(text):
    embedding = openai.Embedding.create(
        input=text,
        engine="text-embedding-ada-002"
    )['data'][0]['embedding']
    collection.add(documents=[text], embeddings=[embedding])
  • 임베딩 생성: OpenAI의 text-embedding-ada-002 모델을 사용하여 입력된 텍스트의 임베딩을 생성함. 임베딩은 텍스트를 벡터화한 값으로, 이를 통해 텍스트 간의 유사도를 계산 가능.
  • 데이터 저장: 생성된 임베딩은 Chroma Vector DB에 저장됨. 저장된 임베딩 데이터는 나중에 유사한 문맥을 검색하는 데 사용됨.

대화 함수

def chat_with_persona(persona_name):
    print(f"{persona_name}와 대화를 시작합니다. 'exit'을 입력하면 종료됩니다.")
    while True:
        user_input = input("당신: ")
        if user_input.lower() == 'exit':
            break
        response = generate_response(persona_name, user_input)
        print(f"{persona_name}: {response}")
        store_embedding(user_input)
        store_embedding(response)

메인

def main():
    print("사용 가능한 페르소나:")
    for persona in personas.keys():
        print(f"- {persona}")
    selected_persona = input("대화할 페르소나를 선택하세요: ")
    if selected_persona in personas:
        chat_with_persona(selected_persona)
    else:
        print("선택한 페르소나가 존재하지 않습니다.")

if __name__ == "__main__":
    main()

구현하며 느낀점

결국 핵심은 프롬포트 엔지니어링 임. 더욱 정밀하게 작성할 필요 매우 강력하게 느낌

Vector화 된 DB Test 도 많이 해봐야겠음


추후개발사항

이미지와 prompt 의 유기적 연결

flow :

이미지 분석 모델 사용

이미지 분석 collection 을 생성하여 이미지 분석 모델 사용 예정

입력 : 사용자 사진 등록 ⇒ 이미지 분석모델 ⇒ 임베딩 ⇒ Vector DB 에 값넣기

출력 : prompt ⇒ 임베딩 ⇒ 출력