1. 히스토리만 적용 (히스토리를 자동으로 관리 해주는 방식)
일단 히스토리 적용 안하는이상 GEMINI는 사용자가 이전 질문한것들은 기억 못하고 오직 새질문만 받고 답한다.
예를들어 처음 질문 "이 코드를 만들어 줘봐" 하고 응답 받고 그 다음 질문 "아까 만들어준 코드에서 이 기능도 추가해줘봐" 할시 GEMINI는 이전에 대한 질문,응답을 기억 못하니 "죄송합니다,전에 답변한 코드에 대한 정보가 없습니다" 이런식으로 답변한다.
그러므로 이전 질문,응답에 대한 정보를 포함해서 새질문을 요청해야한다.
#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}')
[사용자]: 인공지능에 대해 한 문장으로 짧게 설명하세요.
[모델]: 인공지능은 인간의 지적 능력을 모방하고 수행할 수 있는 기계 또는 소프트웨어 시스템입니다.
[사용자]: 의식이 있는지 한 문장으로 답하세요.
[모델]: 아니요, 인공지능은 의식이 없습니다.
(위키 정보)
model 의 start_chat 메서드를 호출해서 ChatSession 객체를 받아오고 이것을 통해 메시지를 전달하는 부분입니다. 이때 history라는 리스트를 초기화하고 있는데, 바로 이곳이 대화 이력이 쌓이는 공간입니다. 이렇게 대화 세션이라는 장치를 통해 대화의 이력을 유지하기 때문에 두 번째 사용자 질의처럼 주어(인공지능)가 생략된 질의에 대해서도 앞의 대화를 참조해서 적절한 응답을 생성할 수 있습니다.
2. 히스토리만 적용 (히스토리를 수동으로 관리 해주는 방식)
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)
[사용자]: 인공지능에 대해 한 문장으로 짧게 설명하세요.
[모델]: 인공지능은 인간의 지적 행동을 모방하도록 설계된 컴퓨터 프로그램 또는 기계입니다.
[사용자]: 의식이 있는지 한 문장으로 답하세요.
[모델]: 아니요, 인공지능은 의식이 없습니다.
이렇게 히스토리 리스트 따로 만들고, generate_content(히스토리) 를 이용해서 한다.
수동으로 관리하는 예시 위키 참고
3. 컨택스트 캐싱 이용하면서 히스토리도 이용하는 경우
먼저 컨택스트 캐싱을 이용할경우
(gpt의 답변)
genai.GenerativeModel.from_cached_content(cached_content=cache)을 호출하면, 모델은 주어진 캐시된 컨텍스트를 이용해 새롭게 생성된 세션에서 작업을 수행합니다. 이 방식은 기존 세션의 상태를 재사용하지 않고, 캐시된 컨텍스트를 기반으로 새 세션을 만듭니다. 따라서 각 호출은 별개의 세션을 생성합니다.
쉽게 생각하면 동영상 캐시가 다른거를 할때마다 모델을 계속 새로 생성한다.
이때 위에 1번의 방법을 할시 모델을 이용해 세션 객체를 받아오는데 컨택스트 캐싱 모델은 계속 새로 생성되니
세션 객체도 그러면 계속 새로 생성해서 비효율 일 수도 있다.
모델.start_chat(history=[])
아직 정보가 완전한건 아니라 정확히는 모르나 공식 문서를 봐도 없고해서
지금은 컨택스트 캐싱 이용하면서 히스토리도 이용하면 위에 2번의 방법인 직접 히스토리 관리를 해야한다.
그러면 서로 다른 캐싱모델을 사용해도 세션객체는 새로 생성하는게 아닌 공유 해서 사용하니 문제가 없다!
'Gemini 작업' 카테고리의 다른 글
문서 처리 시스템 (0) | 2024.08.23 |
---|---|
이미지,동영상을 서버에 저장 안하고 바로 Gemini요청하기 (0) | 2024.07.24 |
파이썬 파일 SHA256해시 (0) | 2024.07.23 |
Flask,Gemini 에러 or 호환 관련 (0) | 2024.07.19 |
Flask,Gemini (0) | 2024.07.18 |