AI 기술을 개발하는 가장 좋은 방법은 프로젝트를 만드는 것입니다. 하지만 시작하는 단계에서 무엇을 만들어야 하는지 알아내는 것은 어려울 수 있습니다. 여기에서는 세 가지 수준의 복잡성을 가진 5개의 AI 프로젝트를 빠르게 만들 수 있는 방법을 공유합니다. 각 아이디어를 구현하는 데 필요한 단계와 Python 라이브러리를 설명하겠습니다.
초보자들이 프로젝트 아이디어를 생각할 때 저지르는 가장 큰 실수는 “이 새로운 기술을 어떻게 활용할 수 있을까?”라는 질문으로 시작하는 것입니다. 새로운 도구를 배우는 좋은 방법이 될 수 있지만, 더 나은 방법이 있습니다.
좋은 프로젝트 아이디어는 “어떤 문제를 해결할 수 있을까?”라는 질문으로 시작합니다. 이는 잠재적인 고용주와 공유할 때 좋은 이야기가 될 뿐만 아니라, 문제를 해결하는 것이 기술적 기술을 가치로 변환하는 방법입니다.
다음 프로젝트들은 모두 문제 중심 접근 방식을 따릅니다. 이 아이디어들을 직접 구현하거나 (더 나아가) 개인적으로 직면한 문제를 해결하는 영감으로 사용할 수 있습니다.
1) 이력서 최적화 (초급)
구직을 위한 이력서를 다양한 직무 설명에 맞게 수정하는 것은 효과적이지만 시간이 많이 소요되는 과정입니다. 몇 년 전에는 이 작업을 자동화하는 것이 고급 프로젝트였겠지만, 오늘날의 대규모 언어 모델 덕분에 API 호출만으로도 간단하게 수행할 수 있습니다.
이러한 자동화를 구현하는 방법에 대해 단계별로 설명드리겠습니다.
- 이력서의 마크다운 버전을 생성합니다. (참고: ChatGPT가 이를 도와줄 수 있습니다).
- 마크다운 이력서와 직무 설명을 입력으로 받아 새로운 마크다운 이력서를 출력하는 다양한 프롬프트 템플릿을 실험해봅니다.
- OpenAI의 Python API를 사용하여 GPT-4o-mini에게 이력서를 동적으로 재작성하도록 요청합니다.
- 마크다운 파일을 HTML로 변환한 후 markdown 및 pdfkit 라이브러리를 사용하여 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 “나중에 보기” 재생 목록에 추가하는 것을 좋아하지만, 실제로 그것들을 시청하기까지는 시간이 걸릴 수 있습니다(언젠가 볼 수 있을지 모르겠네요 😅). 이를 도와줄 수 있는 프로젝트는 저 대신 영상을 시청하고 핵심 요점을 포함한 간결한 요약을 생성하는 도구입니다.
다음은 이를 수행하는 한 가지 방법입니다:
- 정규 표현식을 사용하여 비디오 링크에서 YouTube 비디오 ID 추출하기
- 비디오 ID를 사용하여 youtube-transcript-api를 통해 전사(transcript) 추출하기
- 전사를 효과적으로 요약할 수 있는 다양한 ChatGPT 프롬프트 실험하기
- 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-평균과 같은 전통적인 기계 학습 알고리즘을 이용해 유사한 기사들을 클러스터링할 수 있습니다.
더 자세한 내용을 아래에 정리해 보았습니다:
- 각 연구 기사의 초록을 PyMuPDF을 사용하여 읽습니다.
- sentence-transformers 라이브러리를 사용하여 초록을 텍스트 임베딩으로 변환하고 Pandas DataFrame에 저장합니다.
- sklearn에서 좋아하는 클러스터링 알고리즘을 사용하여 유사성에 따라 임베딩을 그룹화합니다.
- 각 클러스터에 대해 폴더를 만들고 파일을 적절한 폴더로 이동시킵니다.
라이브러리: 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 시스템을 만드는 데 도움을 드렸습니다. 이러한 보고서를 검색할 때의 한 가지 어려움은 주요 정보가 종종 텍스트가 아닌 플롯과 그림으로 제공된다는 점입니다.
이러한 시각적 정보를 검색 과정에 통합하는 한 가지 방법은 멀티모달 임베딩 모델을 사용하여 텍스트와 이미지를 공유 공간에 표현하는 것입니다.
다음은 기본적인 개요입니다:
- PDF를 제공받아 이를 섹션으로 나누고 PyMuPDF를 사용하여 이미지를 추출합니다.
- 멀티모달 임베딩 모델(예: nomic-ai/nomic-embed-text-v1.5)을 사용하여 청크와 이미지를 밀집 벡터로 표현하고 데이터프레임에 저장합니다.
- 지식 기반에 있는 모든 PDF에 대해 반복합니다.
- 사용자 쿼리를 제공받아 지식 기반에 사용된 것과 동일한 임베딩 모델을 통해 전달합니다.
- 쿼리 임베딩과 지식 기반의 모든 항목 간의 코사인 유사도 점수를 계산합니다.
- 상위 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 시스템으로 변환할 수 있습니다.
다음은 단계입니다:
- 지식 베이스(프로젝트 4에서 생성된 것과 같은)에서 검색을 수행합니다.
- 사용자 쿼리와 상위 k 검색 결과를 결합하여 멀티모달 모델에 전달합니다.
- 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