Flask 설치: 터미널에서 다음 명령어를 입력하여 Flask를 설치합니다
pip install Flask
app.py파일 생성후(이름은 자유이나 flask이름으로 하는것만 피하면 될듯)
from flask import Flask
app = Flask(__name__)
@app.route('/about')
def about():
return 'The about page'
if __name__ == '__main__':
app.run(debug=True)
# 괄호안 host="현재 연결중인 네트워크ip주소" 적으면 현재 네트워크 사용중인 기기 모두 사용가능
이제 Gemini를 이용하려면 패키지 설치
pip install google-generativeai
Gemini 테스트로 json말고 text 형식으로 화면에 나오게 해보기
from flask import Flask, request, jsonify,render_template
import google.generativeai as genai
# Google API 키 설정
genai.configure(api_key='발급받은 api키')
model = genai.GenerativeModel('gemini-1.5-flash') # 사용중인 버전(현재는 무료 1.5사용중)
# Flask 애플리케이션 생성
app = Flask(__name__)
@app.route('/ask', methods=['GET'])
def ask():
response = model.generate_content("Gemini에 대해 설명해줘봐")
return response.text
Gemini한테 파일 업로드 질문전 Flask에서 이미지나 비디오등 파일을 사용해보기
from flask import Flask, request, jsonify,render_template
import google.generativeai as genai
import os
# 업로드된 파일을 저장할 디렉토리 설정
UPLOAD_FOLDER = 'uploads'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
@app.route('/submit', methods=['POST'])
def gemini_question():
question = request.form['question']
# 파일 저장 경로 설정
video = request.files['video']
image = request.files['image']
video_filename = os.path.join(app.config['UPLOAD_FOLDER'], video.filename)
image_filename = os.path.join(app.config['UPLOAD_FOLDER'], image.filename)
# 업로드 폴더가 존재하지 않으면 생성
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
# 파일 저장
if video:
video.save(video_filename)
if image:
image.save(image_filename)
return question
코드를 보면 이렇게 Flask에서 이미지나 비디오 받을시
request.files['video']의 경우, 사용자가 업로드한 파일(비디오 파일 포함)은 Flask의 FileStorage 객체로 서버에 전달됩니다. 이 객체는 파일에 대한 메타데이터와 함께 파일 내용을 포함합니다. 즉, 파일의 크기와 상관없이 FileStorage 객체로 파일 데이터가 서버에 전달됩니다.
메타데이터란
메타데이터는 데이터를 설명하는 데이터입니다. 쉽게 말해, 특정 데이터에 대한 추가 정보를 제공하는 데이터라고 할 수 있습니다. 메타데이터는 주로 데이터의 속성, 특성, 구조 등에 관한 정보를 포함합니다.
(사진과 파일을 예로 들었을때)
사진 파일의 메타데이터:
- 사진 자체: 특정 장소에서 찍은 사진 파일
- 메타데이터: 촬영 날짜, 시간, 위치(GPS 좌표), 카메라 모델, 해상도, 파일 크기 등.
Gemini한테 이미지 질문 해보기
from flask import Flask, request, jsonify, render_template, url_for
import google.generativeai as genai
import os
import PIL.Image
# Flask 애플리케이션 생성
app = Flask(__name__)
# ascii 인코딩 거절
app.config['JSON_AS_ASCII'] = False
# Google API 키 설정
genai.configure(api_key='발급받은키')
model = genai.GenerativeModel('gemini-1.5-flash') # 현재는 무료버전 사용
# 업로드된 파일을 저장할 디렉토리 설정
UPLOAD_FOLDER = 'static/uploads'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
@app.route('/submit', methods=['POST'])
def gemini_question():
question = request.form['question']
# 파일 저장 경로 설정
video = request.files['video']
image = request.files['image']
video_filename = os.path.join(app.config['UPLOAD_FOLDER'], video.filename)
image_filename = os.path.join(app.config['UPLOAD_FOLDER'], image.filename)
# 파일 저장
if video:
video.save(video_filename)
if image:
image.save(image_filename)
# 저장된 이미지의 절대경로
absolute_image_path = os.path.abspath(image_filename)
img = PIL.Image.open(absolute_image_path)
# generate_content 호출 전에 입력 데이터를 확인
try:
response = model.generate_content([question, img])
# 응답에서 필요한 데이터 추출
generated_text = response.candidates[0].content.parts[0].text
response_data = {
'question': question,
'answer': generated_text
}
except Exception as e:
response_data = {'error': str(e)}
# 응답 확인
print("응답:", response_data)
# 이미지 URL 생성 (절대 경로로 적어야한다)
image_url = url_for('static', filename = os.path.join("uploads", image.filename))
return render_template('result.html', img_url=image_url, result=response_data)
1) Gemini한테 요청보내기
이제 gemini한테 요청을 하려면 generate_content()메소드를 이용한다 매개변수에 저렇게 질문할 문자형,이미지를 넣는데
img를 보면 PIL.Image의 open(이미지의 절대경로) 한다.
2) 응답받은 데이터에서 필요한부분만 추출
이거는 위키 여기서 참고
3) 반환 페이지에 이미지 넣어주기
그러고 이제 gemini한테 질문답변 받고 다시 사용자 페이지에 답변이랑,이미지 반환해줘야하니
이걸 보면 두번째 매개변수에는 상대경로로 적어야해서 os.path.join()은 괄호안 두 매개변수를 합쳐주는거다
밑에 코드의 경우 "uploads/screen.png" 이렇게 '/'를 추가해준다.
# 이미지 URL 생성 (상대 경로로 적어야한다)
image_url = url_for('static', filename = os.path.join("uploads", image.filename))
그리고 스프링의 경우에는 모델에 데이터를 담는데 파이썬 flask에서는 저렇게
html에서 서버한테 받은 객체 사용할 변수 이름 설정 ->result , 서버에서 반환할 객체 -> response_data 한다.
멀티턴 방식의 chat_session.send_message , model.generate_content 차이
chat_session.send_message:
- 자동 상태 관리: ChatSession 객체는 대화 상태를 자동으로 관리합니다. 사용자가 send_message를 호출할 때마다 이전 대화 내역을 포함하여 모델에 요청을 보내고 응답을 받습니다.
- 사용자 개입: 대화 내역을 자동으로 관리하기 때문에, 사용자는 대화 내역을 수동으로 관리할 필요가 없습니다. 그러나 이로 인해 대화 내역에 대한 세밀한 제어가 필요할 때는 제약이 있을 수 있습니다.
- 편리함: 단순히 메시지를 보내고 응답을 받는 과정이 자동화되어 있어, 빠르게 대화형 애플리케이션을 개발할 수 있습니다.
model.generate_content:
- 직접 상태 관리: 사용자가 대화 내역을 직접 관리합니다. 요청을 보낼 때마다 전체 대화 내역을 모델에 제공해야 하며, 모델의 응답을 직접 대화 내역에 추가합니다.
- 세밀한 제어: 대화 내역을 직접 관리하기 때문에, 각 메시지와 응답에 대해 더 세밀한 제어가 가능합니다. 예를 들어, 특정 메시지를 수정하거나 조건에 따라 대화 흐름을 조작할 수 있습니다.
- 유연성: 대화 내역을 보다 유연하게 관리하고 조작할 수 있습니다.
Gemini한테 동영상 업로드시 받고 답변할 수 있는 질문 유형
1. 내용 관련 질문:
- 동영상에 무엇이 나오는지 설명해줘.
- 동영상의 주요 내용은 무엇인가요?
- 동영상에 등장하는 인물은 누구인가요?
- 동영상의 배경은 어디인가요?
- 동영상의 시대적 배경은 언제인가요?
2. 기술적 질문:
- 동영상의 촬영 기법은 무엇인가요?
- 동영상의 편집 방식은 어떤가요?
- 동영상의 음악은 어떤 장르인가요?
- 동영상의 특수 효과는 어떻게 만들어졌나요?
3. 감성적 질문:
- 동영상을 보고 어떤 느낌을 받았나요?
- 동영상의 분위기는 어떤가요?
- 동영상을 보고 무엇을 생각하게 되었나요?
- 동영상에 대한 당신의 의견은 무엇인가요?
4. 분석적 질문:
- 동영상의 메시지는 무엇인가요?
- 동영상은 어떤 주제를 다루고 있나요?
- 동영상은 어떤 관점에서 제작되었나요?
- 동영상은 어떤 의미를 담고 있나요?
5. 추가 정보 요청:
- 동영상에 대한 추가 정보를 제공해 줄 수 있나요?
- 동영상의 제작 배경에 대한 정보를 알려주세요.
- 동영상의 제작자에 대한 정보를 알려주세세요
==========================================================================================
추후 구현할때 참고
1)
사용자A가 질문할때 일단 서버에서는 플랫폼엘에 대한 문서를 같이 포함시켜 Gemini한테 요청하고, 사용자A가 다음 질문할때도 계속 플랫폼엘 문서랑 이전에 질문한 질문포함해서 Gemini한테 요청을한다
2)
사용자A가 영상을 업로드후 질문할때 처음에는 Gemini가 영상을 받고 영상 고유 아이디를 서버한테 반환해준다.
그러고 이제 사용자A가 또 같은 영상 올리면서 질문할때 처음에 반환받은 영상 아이디랑 영상이랑 같은지 체크하는거를 하고 Gemini한테 두번째 질문 요청을 한다.
3)
예를들어 플랫폼엘에 전시,아카이브,매거진,스토어등등 여러 페이지 있는데 사용자A가 처음엔 전시 페이지에서
AI질문 요청하고 다음 질문은 아카이브 또 다음은 매거진.. 이렇게 다른페이지에서 질문할때 이전에 했던 페이지에서 질문했던 내용을 서버에서는 기억해야한다. 왜냐하면 1)번 처럼 이전 질문했던거 포함 Gemini한테 요청해야하기때문.
'Gemini 작업' 카테고리의 다른 글
히스토리,컨택스트 캐싱 이용하면서 히스토리 적용 (0) | 2024.08.08 |
---|---|
이미지,동영상을 서버에 저장 안하고 바로 Gemini요청하기 (0) | 2024.07.24 |
파이썬 파일 SHA256해시 (0) | 2024.07.23 |
Flask,Gemini 에러 or 호환 관련 (0) | 2024.07.19 |
파이썬 가상환경 (0) | 2024.07.18 |