본문 바로가기
  • think normal
새로워지기/마흔의 생활코딩

LLM | GPT 4o API 실습 Beginning - 3. Video + Audio based QA

by 청춘만화 2024. 5. 15.

Openai의  Vision 및 Text용 API를 통해 GPT-4O(Omni Model)를 사용해보기 위한 튜토리얼 

MY GPT 4o API Beginning Course
1. Image( multi modal)
2. Summary( Video + Audio)
👉  3. QA( Video + Audio based chat)

 

이번엔 비디오와 오디오에서 학습한 내용을 기반으로 LLM( GPT 4o)에게 질의 응답할 수 있도록 API를 구성한 Video + Audio 기반QA(챗) 실습 코드들이다. 

 

 

실습1.  Video based Q&A
:비디오 기반 Q&A 

- resource 

       *앞 포스팅에서 진행했던 실습 예제와 동일한 Audio, Video 파일      

- code

# .env file에서 환경변수(API key)가져와서 로드하기 
from dotenv import load_dotenv
load_dotenv() 

# 필요한 라이브러리 로드, OpenAI API와 상호 작용을 위한 클라이언트 라이브러리
from openai import OpenAI 
# 이전에 사용했던 코드 재사용, *base64Frames 리스트는 비디오 프레임을 Base64 문자열로 변환한 값 
from C04_Summary_Video import base64Frames

client = OpenAI()  # OpenAI API에 연결하기 위해 클라이언트를 초기화합니다.
MODEL="gpt-4o"  # 응답을 생성할 모델을 지정합니다 (실제 모델 이름이나 ID로 교체하세요).

# 답변받고자 하는 질문을 정의
QUESTION = "Question: Why do you emphasise the importance of demonstrating to really understand the capabilities of the Macintosh?"

# OpenAI 클라이언트 라이브러리(chat.completions.create() 메서드)를 사용하여 채팅 응답 생성
qa_visual_response = client.chat.completions.create(
    # 이 요청에 대한 모델과 시스템, 사용자 메시지 지정
    model=MODEL,
    messages=[
    {"role": "system", "content": "Use the video to answer the provided question. Respond in Markdown."},
    {"role": "user", "content": [
        "These are the frames from the video.",
        *map(lambda x: {"type": "image_url", "image_url": {"url": f'data:image/jpg;base64,{x}', "detail": "low"}}, base64Frames),
        QUESTION
        ],
    }
    ],
    # 사실적인 응답으로 설정
    temperature=0,
)

# 생성된 채팅 응답의 내용(message.content 속성)을 마크다운 텍스트(system content)로 출력
print("\\n\\nVideo QA:\\n" + qa_visual_response.choices[0].message.content)

- result

 

 

 

GPT 4o API 실습2. Audio based Q&A
:오디오 기반 Q&A 

- resource

       *앞 포스팅에서 진행했던 실습 예제와 동일한 Audio, Video 파일      

- code

# .env file에서 환경변수(API key)가져와서 로드하기 
from dotenv import load_dotenv
load_dotenv() 

# 필요한 라이브러리 로드, OpenAI API와 상호 작용을 위한 클라이언트 라이브러리
from openai import OpenAI  
# 이전에 사용했던 코드 재사용, transcription - 오디오를 텍스트로 변환하는 함수
from C05_Summary_Audio import transcription 

client = OpenAI()  # OpenAI API에 연결하기 위해 클라이언트를 초기화
MODEL="gpt-4o"  # 응답을 생성할 모델을 지정

# 답변받고자 하는 질문을 정의
QUESTION = "Question: Why do you emphasise the importance of demonstrating to really understand the capabilities of the Macintosh?"

# OpenAI 클라이언트 라이브러리(chat.completions.create() 메서드)를 사용하여 채팅 응답 생성
qa_audio_response = client.chat.completions.create(
    # 이 요청에 대한 모델과 시스템, 사용자 메시지 지정
    model=MODEL,
    messages=[
    {"role": "system", "content":"""Use the transcription to answer the provided question. Respond in Markdown."""},
    {"role": "user", "content": f"The audio transcription is: {transcription.text}. \\n\\n {QUESTION}"},
    ],
    temperature=0,
)

# 생성된 채팅 응답의 내용 출력
print("\\n\\nAudio QA:\\n" + qa_audio_response.choices[0].message.content)

- result

 

 

 

GPT 4o API 실습3. Audio &Video based Q&A
: 비디오 오디오 통합 Q&A 

- resource

       *앞 포스팅에서 진행했던 실습 예제와 동일한 Audio, Video 파일      

- code

# .env 파일에서 환경변수(API key) 가져와서 로드하기
from dotenv import load_dotenv
load_dotenv()  

# 필요한 라이브러리 로드
from openai import OpenAI  # OpenAI API와 상호 작용을 위한 클라이언트 라이브러리
from C04_Summary_Video import base64Frames  # 이전 코드 재사용, 비디오를 텍스트로 변환하는 함수
from C05_Summary_Audio import transcription  # 이전 코드 재사용, 오디오를 텍스트로 변환하는 함수

client = OpenAI()   # OpenAI API에 연결하기 위해 클라이언트를 초기화
MODEL="gpt-4o"  # 응답을 생성할 모델을 지정
QUESTION = "Question: Why do you emphasise the importance of demonstrating to really understand the capabilities of the Macintosh?"

qa_both_response = client.chat.completions.create(
    model=MODEL,
    # C06_Summary_VideoAudio 예제와 같이 map()을 통해 Audio, Video 관련 내용을 함께 구성
    messages=[
        {
            "role": "system", 
            "content":"""Use the video and transcription to answer the provided question."""
        },
        {
            "role": "user", 
            "content": [
                "These are the frames from the video.",
                *map(
                        lambda x: {
                            "type": "image_url", 
                            "image_url": {"url": f'data:image/jpg;base64,{x}', "detail": "low"}
                        }, 
                        base64Frames
                    ),
                    {
                        "type": "text", 
                        "text": f"The audio transcription is: {transcription.text}"
                    },
                QUESTION
            ],
        }
    ],
    temperature=0,
)
print("\\n\\nBoth QA:\\n" + qa_both_response.choices[0].message.content)

- result

 

 

 

개인적으로 문과이고 개발자도 아닌 입장에서 코드를 이해하는 과정은 쉽지않다. 그래서 되도록 일단 실행해서 결과를 보고 그 내용을 최대한 반복할 수 있는 코드로 재구성해서, 개인적인 경험상 '익숙한' 내용을 받아 들일 수 있도록 하는 편이다. 

모르는 내용도 읽을 수 있으면 생각하게되고 그 생각을 반복하게되면 이해하게되고 이해하게되면 재미있어지는 방식을 실험적으로 적용해보기 위해 3번의 포스팅으로 구성한 GPT 4o API 실습 내용 또한 기본 골격을 기반으로 매우 유사한 코드들을 조금씩만 수정하고 결과를 볼 수 있도록 하는 코드를 하나씩 쪼개서 구성한 후 다시 상세 주석을 추가하는 형태로 진행해봤다. 

 

원래 랭그래프 LangGraph관련 실습 코드를 포스팅할 일정이었는데;;; 이번 OpenAI 발표 내용이 너무 인상적이어서 순서를 바꿔서,, 관련 실습 내용을 올려본다.

댓글