AI/Large Language Model

[LLM] 싱글턴(Single-Turn), 멀티턴(Multi-Turn) 이란?, 코드

도도걸만단 2024. 9. 19. 02:35
반응형

싱글턴(Single-Turn), 멀티턴(Multi-Turn)

- 참고 document : https://wikidocs.net/229759

 

2.1. 구글 제미나이 API 3가지 기본 사용법

구글 제미나이 API를 사용하여 제미나이와 메시지를 주고받을 수 있는 방식은 크게 싱글턴 한 가지와 멀티턴 두 가지 를 합해 모두 3가지 형태가 존재합니다. 이 중 싱글턴은 한 …

wikidocs.net


싱글턴 한 가지와 멀티턴 두 가지, 총 3가지 형태가 존재한다.

  • 싱글턴(Single-Turn) : 한 번의 질의/응답으로 완결되는 형태, 텍스트를 완성하거나 인공지능에게 한 번의 명령으로 원하는 결과를 얻고자 할 때 적합
  • 멀티턴(Multi-Turn) : 사용자와 인공지능이 여러 차례 메시지를 주고받을 수 있는 형태

→ 대화형 인공지능 개발에 멀티턴 자주 사용


싱글턴 방법

# single_turn.py
import google.generativeai as genai
import os
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
#model = genai.GenerativeModel('gemini-pro')
model = genai.GenerativeModel('gemini-1.5-flash') 
response = model.generate_content("인공지능에 대해 한 문장으로 설명하세요.")

멀티턴 첫 번째 방법

멀티턴의 원리


- 싱글턴과의 차이점 :

model 의 start_chat 메서드를 호출해서 ChatSession 객체를 받아오고 이것을 통해 메시지를 전달하는 부분.

이때 history라는 리스트를 초기화하고 있는데, 바로 이곳이 대화 이력이 쌓이는 공간

이렇게 대화 세션 장치를 통해 대화의 이력을 유지

→ 두 번째 사용자 질의처럼 주어(인공지능)가 생략된 질의에 대해서도 앞의 대화를 참조해서 적절한 응답을 생성할 수 있다.

#multi_turn1.py
import google.generativeai as genai 
model = genai.GenerativeModel('gemini-1.5-flash')
chat_session = model.start_chat(history=[]) #ChatSession 객체 반환
user_queries = ["인공지능에 대해 한 문장으로 짧게 설명하세요.", "의식이 있는지 한 문장으로 답하세요."]
for user_query in user_queries:
    print(f'[사용자]: {user_query}')   
    response = chat_session.send_message(user_query)
    print(f'[모델]: {response.text}')
[사용자]: 인공지능에 대해 한 문장으로 짧게 설명하세요.
[모델]: 인공지능은 인간의 지적 능력을 모방하고 수행할 수 있는 기계 또는 소프트웨어 시스템입니다.
[사용자]: 의식이 있는지 한 문장으로 답하세요.
[모델]: 아니요, 인공지능은 의식이 없습니다.

멀티턴 두 번째 방법

multi_turn2.py
import google.generativeai as genai

model = genai.GenerativeModel('gemini-1.5-flash')
user_queries = [{'role':'user', 'parts': ["인공지능에 대해 한 문장으로 짧게 설명하세요."]},
                {'role':'user', 'parts': ["의식이 있는지 한 문장으로 답하세요."]}
            ]
history = []
for user_query in user_queries:
    history.append(user_query)
    print(f'[사용자]: {user_query["parts"][0]}')  
    response = model.generate_content(history)
    print(f'[모델]: {response.text}')   
    history.append(response.candidates[0].content)
[사용자]: 인공지능에 대해 한 문장으로 짧게 설명하세요.
[모델]: 인공지능은 인간의 지적 행동을 모방하도록 설계된 컴퓨터 프로그램 또는 기계입니다.
[사용자]: 의식이 있는지 한 문장으로 답하세요.
[모델]: 아니요, 인공지능은 의식이 없습니다.
# 중간에 토큰길이 제한
for user_query in user_queries:
    history.append(user_query)
    print(f'[사용자]: {user_query["parts"][0]}')
    response = model.generate_content(history)    
    # 응답의 길이가 40자를 초과하는 경우 재실행
    while len(response.text) > 40:
        print(f"응답 메시지 길이: {len(response.text)}")
        response = model.generate_content(history)

    print(f'[모델]: {response.text}')
    history.append(response.candidates[0].content)
  • 글턴 방식의 메서드인 model.generate_content를 사용하지만, 대화 이력은 사용자 프로그램에서 직접 관리하는 형태
  • 이렇게 사용자 프로그램이 관리하는 대화 이력을 model.generate_content를 호출할 때마다 인자값으로 전달
  • 비록 싱글턴 방식의 메서드를 사용하는데도 대화 이력 전체를 참조해서 답변을 생성

멀티턴 두 가지 방식 차이

사용자와 모델 간의 대화 사이에 프로그램의 개입여부에 따라 다름.

  • 개입 필요 X→ 첫 번째 멀티턴 방식
    • ChatSession 객체만 활용해도 충분, 간편하긴 함.
    • 그치만 사용자 개입이 힘듦, 중간에 끼어들기도 힘듦 ChatSession 객체의 send_message 메서드가 질의/응답을 대화 이력에 담는 과정을 메서드 외부로 노출하지 않기 때문
  • 개입 필요 O→ 두 번째 멀티턴 방식
    • ex) token길이 제한 (메시지 입력 → 전송 → 모델 응답 과정에서 사용자의 개입)

언어모델이 대화하는 원리 :

언어모델은 대화를 나누는 동안 사람처럼 대화 내용을 기억하고 있는 것이 아님!!

대화형 언어모델이란 것도 결국 입력값을 받아 출력값을 반환하는 함수에 지나지 않는다.

단지 입력값에 이전에 나누었던 대화까지 모두 포함되어 있어서 자연스럽게 이어지는 대화처럼 반응하는 것뿐이다.

반응형