Skip to main content
AI 프로젝트

이번 주말에 만들 수 있는 5가지 AI 프로젝트 (파이썬 사용)

By 2024-10-31No Comments

AI 기술을 개발하는 가장 좋은 방법은 프로젝트를 만드는 것입니다. 하지만 시작하는 단계에서 무엇을 만들어야 하는지 알아내는 것은 어려울 수 있습니다. 여기에서는 세 가지 수준의 복잡성을 가진 5개의 AI 프로젝트를 빠르게 만들 수 있는 방법을 공유합니다. 각 아이디어를 구현하는 데 필요한 단계와 Python 라이브러리를 설명하겠습니다.

초보자들이 프로젝트 아이디어를 생각할 때 저지르는 가장 큰 실수“이 새로운 기술을 어떻게 활용할 수 있을까?”라는 질문으로 시작하는 것입니다. 새로운 도구를 배우는 좋은 방법이 될 수 있지만, 더 나은 방법이 있습니다.

좋은 프로젝트 아이디어는 “어떤 문제를 해결할 수 있을까?”라는 질문으로 시작합니다. 이는 잠재적인 고용주와 공유할 때 좋은 이야기가 될 뿐만 아니라, 문제를 해결하는 것이 기술적 기술을 가치로 변환하는 방법입니다.

다음 프로젝트들은 모두 문제 중심 접근 방식을 따릅니다. 이 아이디어들을 직접 구현하거나 (더 나아가) 개인적으로 직면한 문제를 해결하는 영감으로 사용할 수 있습니다.

1) 이력서 최적화 (초급)

구직을 위한 이력서를 다양한 직무 설명에 맞게 수정하는 것은 효과적이지만 시간이 많이 소요되는 과정입니다. 몇 년 전에는 이 작업을 자동화하는 것이 고급 프로젝트였겠지만, 오늘날의 대규모 언어 모델 덕분에 API 호출만으로도 간단하게 수행할 수 있습니다.

이러한 자동화를 구현하는 방법에 대해 단계별로 설명드리겠습니다.

  1. 이력서의 마크다운 버전을 생성합니다. (참고: ChatGPT가 이를 도와줄 수 있습니다).
  2. 마크다운 이력서와 직무 설명을 입력으로 받아 새로운 마크다운 이력서를 출력하는 다양한 프롬프트 템플릿을 실험해봅니다.
  3. OpenAI의 Python API를 사용하여 GPT-4o-mini에게 이력서를 동적으로 재작성하도록 요청합니다.
  4. 마크다운 파일을 HTML로 변환한 후 markdownpdfkit 라이브러리를 사용하여 PDF로 변환합니다.

라이브러리: openai, markdown, pdfkit

ChatGPT를 활용하는 것도 가능하지만, Python을 사용하여 이를 구현하면 프로세스를 쉽게 확장할 수 있는 장점이 있습니다. 다음은 3단계에 대한 기초 코드입니다.

import openai
openai.api_key = "your_sk"

# 프롬프트 (md_resume와 job_desciption이 정의되어 있다고 가정)
prompt = f"""
저는 마크다운 형식으로 작성된 이력서와 직무 설명이 있습니다. \
이력서를 직무 요구 사항에 맞춰 수정해 주시기 바랍니다. \
전문적인 톤을 유지하면서 제 기술, 경험, 성과를 직무에 가장 적합한 점을 강조하도록 조정해 주세요. \
저의 고유한 자격과 강점을 반영하되, 직무 설명과 일치하는 기술 및 경험을 강조해 주세요.

### 제 마크다운 이력서는 다음과 같습니다:
{md_resume}

### 직무 설명은 다음과 같습니다:
{job_desciption}

이력서를 다음과 같이 수정해 주세요:
- 직무 설명에서 키워드와 구문을 사용합니다.
- 각 역할 아래의 글머리 기호를 조정하여 관련 기술과 성과를 강조합니다.
- 저의 경험이 요구되는 자격과 일치하는 방식으로 제시되도록 합니다.
- 전반적으로 명확함, 간결함 및 전문성을 유지합니다.

업데이트된 이력서를 마크다운 형식으로 반환해 주세요.

"""
    
# API 호출
response = openai.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "system", "content": "당신은 도움이 되는 보조자입니다."},
        {"role": "user", "content": prompt}
    ], 
    temperature = 0.25
)
    
# 응답 추출
resume = response.choices[0].message.content

참고: ChatGPT는 이러한 짧은 코드 스니펫(및 프롬프트)을 작성하는 데 매우 유용합니다. 4단계에서 문제가 발생하면 이를 활용해 보세요.

2) 유튜브 강의 요약기 (초급)

저는 기술 강의를 YouTube “나중에 보기” 재생 목록에 추가하는 것을 좋아하지만, 실제로 그것들을 시청하기까지는 시간이 걸릴 수 있습니다(언젠가 볼 수 있을지 모르겠네요 😅). 이를 도와줄 수 있는 프로젝트는 저 대신 영상을 시청하고 핵심 요점을 포함한 간결한 요약을 생성하는 도구입니다.

다음은 이를 수행하는 한 가지 방법입니다:

  1. 정규 표현식을 사용하여 비디오 링크에서 YouTube 비디오 ID 추출하기
  2. 비디오 ID를 사용하여 youtube-transcript-api를 통해 전사(transcript) 추출하기
  3. 전사를 효과적으로 요약할 수 있는 다양한 ChatGPT 프롬프트 실험하기
  4. OpenAI의 Python API를 사용하여 프로세스 자동화하기

라이브러리: openai, youtube-transcript-api

기술적인 관점에서 볼 때, 이는 첫 번째 프로젝트와 매우 유사합니다. 그러나 주요 차이점은 자동으로 비디오 전사를 추출해야 한다는 점이며, 이를 LLM에 입력할 수 있습니다.

다음은 이를 위한 시작 코드입니다.

import re
from youtube_transcript_api import YouTubeTranscriptApi

youtube_url = "비디오 링크 여기에"

# 정규 표현식을 사용하여 비디오 ID 추출
video_id_regex = r'(?:v=|\/)([0-9A-Za-z_-]{11}).*'
match = re.search(video_id_regex, youtube_url)

if match:
    return match.group(1)
else:
    return None

# 전사 추출
text_list = [transcript[i]['text'] for i in range(len(transcript))]
transcript_text = '\n'.join(text_list)

3) PDF 자동 정리 (중급)

제가 나중에 볼 재생 목록 외에도 기술 정보를 모아두는 또 다른 장소가 있습니다. 바로 제 바탕화면인데, 연구 논문(118개)으로 가득 차 있습니다. 이러한 논문을 수작업으로 검토하는 것은 매우 시간 소모적이므로, AI가 어떻게 도움이 될 수 있는지 살펴보겠습니다.

각 PDF의 내용을 분석하고 주제에 따라 폴더로 정리하는 도구를 구축할 수 있습니다. 텍스트 임베딩을 사용하면 각 논문을 밀집 벡터 표현으로 변환할 수 있으며, 이를 바탕으로 K-평균과 같은 전통적인 기계 학습 알고리즘을 이용해 유사한 기사들을 클러스터링할 수 있습니다.

더 자세한 내용을 아래에 정리해 보았습니다:

  1. 각 연구 기사의 초록을 PyMuPDF을 사용하여 읽습니다.
  2. sentence-transformers 라이브러리를 사용하여 초록을 텍스트 임베딩으로 변환하고 Pandas DataFrame에 저장합니다.
  3. sklearn에서 좋아하는 클러스터링 알고리즘을 사용하여 유사성에 따라 임베딩을 그룹화합니다.
  4. 각 클러스터에 대해 폴더를 만들고 파일을 적절한 폴더로 이동시킵니다.

라이브러리: PyMuPDF, sentence_transformers, pandas, sklearn

이 프로젝트의 핵심 단계는 텍스트 임베딩을 생성하는 것입니다. 아래는 sentence_transformers를 사용하여 이를 수행하는 코드 조각입니다.

from sentence_transformers import SentenceTransformer

# 임베딩 모델 로드
model = SentenceTransformer("all-MiniLM-L6-v2")

# 초록을 리스트에 저장
abstract_list = ["abstract 1", "abstract 2"]

# 임베딩 계산
embeddings = model.encode(abstract_list)

4) 멀티모달 검색 (중급)

몇 달 전, 저는 한 회사에서 기술 보고서 세트를 위한 기본 RAG 시스템을 만드는 데 도움을 드렸습니다. 이러한 보고서를 검색할 때의 한 가지 어려움은 주요 정보가 종종 텍스트가 아닌 플롯과 그림으로 제공된다는 점입니다.

이러한 시각적 정보를 검색 과정에 통합하는 한 가지 방법은 멀티모달 임베딩 모델을 사용하여 텍스트와 이미지를 공유 공간에 표현하는 것입니다.

다음은 기본적인 개요입니다:

  1. PDF를 제공받아 이를 섹션으로 나누고 PyMuPDF를 사용하여 이미지를 추출합니다.
  2. 멀티모달 임베딩 모델(예: nomic-ai/nomic-embed-text-v1.5)을 사용하여 청크와 이미지를 밀집 벡터로 표현하고 데이터프레임에 저장합니다.
  3. 지식 기반에 있는 모든 PDF에 대해 반복합니다.
  4. 사용자 쿼리를 제공받아 지식 기반에 사용된 것과 동일한 임베딩 모델을 통해 전달합니다.
  5. 쿼리 임베딩과 지식 기반의 모든 항목 간의 코사인 유사도 점수를 계산합니다.
  6. 상위 k개의 결과를 반환합니다.

라이브러리: PyMuPDF, transformers, pandas, sklearn

이 프로젝트에서 가장 중요한 부분은 PDF를 청크로 나누는 방법입니다. 가장 간단한 방법은 청크 간에 약간의 중복이 있는 고정 문자 수를 사용하는 것입니다. 각 청크에 대한 메타데이터(예: 파일 이름 및 페이지 번호)를 캡처하는 것도 유용합니다.

다음은 이를 수행하기 위한 기본적인 보일러플레이트 코드입니다(출처: ChatGPT). 문제가 생기면 이미지를 추출하도록 요청해 보세요.

import fitz  # PyMuPDF

def extract_text_chunks(pdf_path, chunk_size, overlap_size):
    # PDF 파일 열기
    pdf_document = fitz.open(pdf_path)
    chunks = []

    # PDF의 각 페이지를 반복
    for page_num in range(len(pdf_document)):
        page = pdf_document[page_num]
        page_text = page.get_text()

        # 현재 페이지의 텍스트를 중복이 있는 청크로 나누기
        start = 0
        while start < len(page_text):
            end = start + chunk_size
            chunk = page_text[start:end]

            # 청크와 함께 페이지 번호 저장
            chunks.append((page_num + 1, chunk))
            # 중복을 가진 다음 청크로 이동
            start += chunk_size - overlap_size
    
    return chunks

# 추출을 위한 매개변수
pdf_path = "your_file.pdf"
chunk_size = 1000  # 각 텍스트 청크의 문자 수
overlap_size = 200  # 문자에서의 중복 크기

text_chunks = extract_text_chunks_with_page_numbers(pdf_path, chunk_size, overlap_size)

# 페이지 번호와 함께 청크 표시
for i, (page_number, chunk) in enumerate(text_chunks):
    print(f"청크 {i + 1} (페이지 {page_number}):\n{chunk}\n{'-' * 50}")
5) 지식 기반 QA (고급)

지난 한 해 동안, 저는 거의 100개의 기업과 개인이 AI 프로젝트를 구축하는 데 도움을 주었습니다. 지금까지 사람들이 가장 많이 문의한 프로젝트는 문서 질문-응답 시스템입니다. 이전 프로젝트를 기반으로, 우리는 이를 간단하게 구현할 수 있습니다.

이미 우리의 문서를 데이터프레임에 쪼개어 저장했다면, 우리는 멀티모달 검색 도구를 멀티모달 RAG 시스템으로 변환할 수 있습니다.

다음은 단계입니다:

  1. 지식 베이스(프로젝트 4에서 생성된 것과 같은)에서 검색을 수행합니다.
  2. 사용자 쿼리와 상위 k 검색 결과를 결합하여 멀티모달 모델에 전달합니다.
  3. QA 시스템을 위한 간단한 Gradio 사용자 인터페이스를 만듭니다.

라이브러리: PyMuPDF, transformers, pandas, sklearn, together/openai, Gradio

참고: Llama 3.2 Vision은 2025년까지 Together AI의 API를 통해 무료로 제공됩니다.

이 프로젝트는 본질적으로 프로젝트 2와 4를 결합한 것입니다. 그러나 사용자가 인터페이스의 필수 요소를 포함하고 있습니다. 이를 위해 우리는 Gradio와 같은 대시보드 도구를 사용할 수 있습니다. 이 도구는 몇 줄의 코드로 채팅 UI를 생성할 수 있도록 해줍니다.

다음은 Gradio의 문서에서 적응한 예제 코드입니다.


import gradio as gr
import time

def generate_response(message, history):
    """
        응답을 생성하기 위한 코드
    """
    return response

demo = gr.ChatInterface(
    fn=generate_response, 
    examples=[{"text": "안녕하세요", "files": []}], 
    title="Echo Bot", 
    multimodal=True)

demo.launch()

다음은 무엇일까요?

ChatGPT와 Cursor와 같은 도구 덕분에 AI 프로젝트를 구축하는 것이 그 어느 때보다 쉬워졌습니다빠르게. 몇 년 전에는 몇 시간(아니면 며칠) 걸렸던 문제들이 이제는 고급 코딩 도우미를 통해 몇 분 안에 해결될 수 있습니다.

마지막으로 드리고 싶은 조언은 이러한 도구를 사용하여 더 빠르게 배우고 과감하게 프로젝트 선택을 하라는 것입니다. 프로젝트에 있어서는 문제를 찾아주고, 주말 동안 구현 시간을 정해보세요.

질문이 있으시면 남겨주세요 🙂

더 알고 싶으신가요? 저는 AI 빌더를 위한 6주 라이브 부트캠프를 시작합니다.

👉 자세히 알아보기: https://www.shawhintalebi.com/ai-builders-bootcamp