일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- CausalInference
- Recsys
- DataAnalyst
- BigQuery
- 데이터분석
- 인과추론
- 코세라
- 베이지안통계
- 데이터분석가
- 인과추론 무작위 실험
- 수학적해석학
- 실무로통하는인과추론
- SQL
- 선형대수학
- 벡터
- 티스토리챌린지
- mathematicalthinking
- 오블완
- 잠재적결과
- 글또10기
- 빅쿼리
- 독후감
- recommendation system
- Bayesian
- 인과추론개요
- 네카라쿠배당토
- 나의서양미술순례
- 데이터분석가 코딩테스트
- 데이터 분석
- chatGPT
- Today
- Total
Derek 의 데이터 분석 성장기
[생성형 AI] 나만의 생성형 A.I 만들기 (Llama, Perplexity, Stable Diffusion) 본문
[생성형 AI] 나만의 생성형 A.I 만들기 (Llama, Perplexity, Stable Diffusion)
Derek Grey 2025. 1. 19. 19:13
0. 개요
대 생성형 A.I 시대입니다. 하루가 멀다하고 기능적 강점이 다른 LLM 모델들이 쏟아져 나오고 있습니다. 기본 베이스라인은 LLM or RAG 이지만 이미지 생성, 웹서칭, 자동 코딩 등에 목적에 따라 다양한 A.I 를 사용할 수 있는 시대입니다. 데이터 분석 혹은 모델링일을 하며 해당 A.I 가 제 업무를 얼마나 편하게 도와주는지 모릅니다. 하지만, 반대로 나의 기술력은 이미 이 모델들에게 대체될 수 있는 것 아닌가? 라는 생각을 합니다.
그정도로, 이 생성형 A.I 들은 인간의 업무 효율성을 극대화 시켜주지만, 반대로 인간이 할 수 있는 일을 넘는 기술력과 강점을 가지고 있습니다. 이런 상황속에 우리는 어떻게 우리만이 할 수 있는 고유성과 일을 유지할 수 있을까요? 제가 현재 내리는 정답은 인간만이 할 수 있는 알고리즘, 커뮤니케이션 능력을 제외하고 이런 생성형 A.I 를 다양하게 쓸수 있고 융합할 수 있는 사람이 되어야 한다고 생각합니다.
그래서, 저는 나만의 생성형 A.I 를 만들기로 해보았습니다.
1. 목적
회사 내에서 자유주제로 스터디 하는 시간이 있습니다. 본인이 기존에 해보고 싶었던 공부나, 분석, 모델을 공부하고 공유하는 자리죠. 해당 시간에 그래서 저는 제가 만들어보고 싶었던 생성형 A.I를 만들어보기로 했습니다. 이유는 위에서 언급한 것과 같이 활용이 중요한 시대이며 직접 제가 해본 것과 안해본것은 큰 차이를 만들기 때문이라 생각합니다. 그래서, 기획 > 개발 > 활용 > 피드백 루프를 직접 돌려보기 위해 해당 모델을 만들어보았습니다.
하지만, 나름 제 개인적인 프로젝트이자 목표달성을 위해 세부적 목표를 위와 같이 세웠습니다.
1. 컨셉(기획) : 애니메이션 스토리를 만들어주는 A.I 모델을 만든다.
2. 개발 : 베이스 라인이 되는 생성형 A.I 모델(ChatGPT or Llama) 를 사용하되, 외부와 송수신 되는 API를 활용하는 모델을 만들자. 그리고, 추가적으로 애니메이션 스토리를 만들어주는 모델이라면 이미지 생성 모델까지 활용하자. 라는 것이 저의 목표 였습니다.
3. 활용(결과): 모델을 활용하여 제가 목표한 결과물을 만든다. 애니메이션 스토리를 만들라고 프롬프팅 하면 그 결과를 뱉어주는 MVP 모델을 만들려고 했습니다.
4. 공유(피드백): 공유는 생각보다 엄청난 부가가치를 만듭니다. 남들에게 보여줬을 때, 제가 기대하지 않았던 아이디어나 부족한 점을 채울 수 있는 기회이기 때문이죠. 때문에 피드백을 통해 더 좋은 프로덕트를 만드는 것 까지가 저의 1차 목표였습니다.
하지만, 너무나 많은 시간을 들이고 싶지 않았습니다. 최소한의 시간으로 최대한의 가치를 만드는게 제 목표였고 생성형 A.I 라는 시대에 살고 있는 우리에게 생성형 A.I의 도움을 받아 빠르게 목표를 완수하고 여러가지 결과물을 만드는 것 또한 중요 능력이라 생각하기 때문입니다.
그래서 아래와 같은 제약조건(?) 을 걸었습니다. Cursor A.I (코드 생성 툴) 를 활용해서 빠르게 모델을 만드는 것이죠.
Tip : Cursor AI를 활용하면 빠르게 모델을 만들고 코드작업을 할 수 있음.
Warning : 발표자는 1장까지 하되, 나머지분들은 기획 혹은 API 까지만 써봐도 좋을 듯 합니다.
ExpectedTime : Cursor AI 활용시 3시간 정도면 Prompt 부터 내가 원하는 모델의 초안까진 만들 수 있음. 혹은 Local Llama 설치도 참고해보면 좋을듯함! 세인트도 잘 모르는데 걍 함!
2. 결과
결과적으로 저는 애니메이션 스토리를 만드는 모델을 만들고 싶었습니다.
1. 애니메이션 스토리를 만드는 모델(Local Base line Model : Llama3)
2. 웹 서칭 / 한국어 번역 / 고도화 담당 모델(API : Perplexity)
3. 애니메이션 그림 만들어주는 모델(Image Generator : Local Stable Diffusion)
세가지 기능을 하는 모델을 활용하였습니다.
* 처음 결과(프롬프팅 및 학습 초반 상태) *
* MVP 모델( 애니메이션 스토리 생성 -> 한국어 번역 -> 웹 서칭 및 고도화 -> 이미지 생성)
* 1분 정도부터 프롬프팅 라인 보시면 됩니다.*
이와 같이 모델별로 역할을 분업화 할 수 있는 모델들을 만들었습니다. 저는 코드나 생성형 A.I 등을 모듈단위로 작업하는 것이 중요하다고 생각합니다. 그래야만 각기 목적에 맞는 아키텍처 디자인, 세팅, 파라미터를 설정할 수 있고 모델 별로 최고의 퍼포먼스를 발휘할 수 있기 때문이죠.
인간 또한 직무와 역할이 달리 있는 것은 그 이유 때문입니다. 때문에, 사실상 ChatGPT 같은 궁극의 모델이 한 가지 일을 다 할 수 있지만 역할을 달리 부여하고 모듈단위로 끊는 연습 또한 생성형 A.I 를 매니지먼트 하는 인간의 중요한 역할이라 생각합니다.
그래서 모델을 위와 같이 분업화 한 이유도 있습니다.
3. 모델 내용
이제부턴 위의 작업을 하며 배운점 혹은 느낀점을 정리해보려 합니다. 우선 기초적인 내용은 아래와 같습니다.
- Model
- Baseline Model : Llama3
- 로컬에서 무료로 베이스라인 잡기에 나쁘지 않음.
- 장점 : 사용성이 편함.
- 단점 : 속도, 한글에 취약함
- API Model : Perplexity API(Llama)
- PerPlexity API (질문 → 웹 서칭 → 응답)
- 이미지 생성도 가능하나, API 로는 이미지 생성 불가함.
- Image 생성 Model : Stable Diffusion
- 설명 : 오픈 소스 모델로서 image 생성 가능. 로컬에서도 사용 가능함.
- Stable DIffusion 3도 존재하는데, NvDIA 그래픽 카드를 요구
- 사용툴
- Cursor AI(90%)
- 세부적 단축키
- /p : perplexity
- /r : 마음에 드는 내용을 바로 perplexity API 에 콜 던지기
- /i : 이미지생성
- /ir : 마음에 드는 내용을 Stable Diffusion 에 날리기
- Baseline Model : Llama3
3개의 모델을 한 프롬프트 안에서 쓰다 보니, 저는 /p, /r, /i 등 퍼플렉시티, 라마, 스테블 디퓨전 등 각기 다른 모델에 프롬프트를 유용하게 사용하고 싶었습니다. 그래서 위와 같이 나름의 꼼수?를 이용해서 모델과 채팅할 수 있는 방법을 고안했는데요. 위와 같은 아이디어를 바로 떠올렸는데 이는 여러 게임을 해보신 분들은 아시겠지만, 단축키에 따라 채팅창을 다르게 사용할 수 있기 때문에 그런 아이디어를 모델에 적용한 것 같습니다.
위 사진은 Wow(월드오브워크래프트) 게임인데, 한 채팅 창안에서 여러 채널의 대화를 다르게 사용할 수 있는데요. 이런 기능을 하나의 프롬프트(터미널) 안에서 빠르게 적용할 때 도움이 된 것 같네요. 이처럼 다양한 컨텐츠를 보고 적용하는것 또한 생성형 A.I를 활용하는데 큰 자산이 된다는 점을 알 수 있었습니다.
4. 배운점
- CursorAI를 통해 대부분의 문제를 해결. Composer 를 통해 원하는 기능 및 모델 생성과 디렉토리 구조까지 시간대비 극강의 효율성으로 생성함.
- 프롬프트시 개인적으론 “시니어 개발자” 처럼 이란 단어를 입력하여 작업을 체계화 하려함.
3. Local LLama 3는 한국어랑 굉장히 친숙하지 않음.
default_system_prompt 를 하단과 같이 설정하여도, 한글로 대답할 때가 많음.
Class OllamaAPI:
def __init__(self):
self.config = Config()
self.base_url = "<http://localhost:11434/api/generate>"
def generate_response(self, prompt, context="", system_prompt=""):
try:
print("\\n=== Llama 응답 생성 ===")
try:
requests.get('<http://localhost:11434/api/tags>')
print("Ollama 서버 연결 성공")
except requests.exceptions.ConnectionError:
return "Ollama 서버가 실행되지 않았습니다. 'ollama serve' 명령어로 서버를 먼저 실행해주세요."
default_system_prompt = """당신은 한국어 전문 AI 어시스턴트입니다.
다음 규칙을 절대적으로 따르세요:
1. 모든 답변은 반드시 한국어로만 작성하세요.
2. 영어 사용을 절대 금지합니다.
3. 이전 대화 내용을 참고하여 맥락을 유지하세요.
4. 인사말이나 소개말 없이 바로 본론으로 들어가세요.
5. 전문 용어도 모두 한국어로 설명하세요."""
# 이전 대화 내용이 있으면 프롬프트에 추가
if context:
prompt = f"""이전 대화 내용:
{context}
현재 질문:
{prompt}"""
response = requests.post(self.base_url, json={
"model": "llama3",
"prompt": prompt,
"stream": False,
"options": {
"temperature": 0.7,
"system": system_prompt or default_system_prompt
}
})
4. 또한, Llama3가 로컬모델인데 모델을 실행하고 나서 이전 대화 내용을 기억하지 못하는 문제들이 발생. 나는 chatGPT 처럼 히스토리를 기억하고 있는 모델을 만들고 싶었음.
- Data : CSV 를 만듦
- 저장방법 : history 를 csv에 기록하고, 실행시마다 해당 csv를 read 하도록 만듦.
이를 해결하기 위해 DB 역할을 할 수 있는 서비스가 필요하다 생각함.
- 위와 같이 모델 실행시 대화 히스토리 리드를 부탁했으나, 제대로 못함(=답답했음)
- 리드 하는걸로 해결이 안되길래(모델 실행시 기존에 저장된 csv를 간단하게 실행 후 → 프롬프트로 입력하겠금 하여 자체적으로 학습하게 만듦)
5. 한국어 문제를 해결하는 건 다양하다 (ex: llama3 - ko) 특화 모델등이 존재함. 하지만, 결과를 영어로 하나 가지고 있고 그걸 번역하는 번역 모델이 있어도 좋겠다고 생각함. 그 이유는 애니메이션 스토리 모델상 영어버전이 더 좋을수도..?
이를 해결하고자 로컬 버전보다 더 나은 모델 혹은 API를 연동하는 모델을 사용해야 겠다고 생각함. Perplexity Pro는 월 $5 달러까지 API 콜이 무료(적절한 해법)
그리고, API 연동에 있어서도 Cursor AI 가 제안해주는 모든 내용을 따라가는 것이 아니라, 내가 서칭한 것을 기반으로 제안해주는 것도 좋은 해결책이 됨.
또한, 저는 Llama3 랑 이전 대화내용을 Perplexity API Call에 날려달라고 요구 했지만, 해당 내용을 제대로 수행하지 못했음. 그래서 아래와 같은 방식을 차용함. (위에서 언급한 /r 등의 단축키를 사용한 방법입니다.)
def chat(self, question):
try:
# 명령어 체크
if question.lower().startswith('/i '):
prompt = question[3:].strip()
image_path = self.diffusion.generate_image(
prompt=prompt,
save_dir=self.images_dir
)
result = {
'답변': f"이미지가 생성되었습니다: {image_path}\n프롬프트: {prompt}",
'주제': '이미지 생성',
'AI_모델': 'Stable Diffusion 3.5',
'이미지경로': image_path
}
# 대화 기록에 추가
self.chat_history.loc[len(self.chat_history)] = {
'Index': self.current_index,
'질문내용': question,
'답변': result['답변'],
'주제': result['주제'],
'시간': datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
'AI_모델': result['AI_모델']
}
self.current_index += 1
return result
# 다른 명령어들 처리
elif question.lower().startswith('/r'):
if not self.chat_history.empty:
last_response = self.chat_history.iloc[-1]['답변']
# /r 뒤에 추가 요구사항이 있는지 확인
additional_request = question[2:].strip() if len(question) > 2 else ""
try:
if additional_request:
# 이전 응답과 추가 요구사항을 함께 전달
prompt = f"""다음은 AI의 이전 답변입니다:
{last_response}
추가 요청사항:
{additional_request}"""
else:
# 추가 요구사항이 없으면 이전 응답만 분석
prompt = f"""다음 내용을 분석하고 개선된 답변을 제공해주세요:
{last_response}"""
answer = self.perplexity.get_response(prompt)
ai_model = "Perplexity"
question = f"이전 응답 분석: {last_response[:50]}... {additional_request}"
except Exception as e:
print(f"\nPerplexity API 오류: {e}")
return None
else:
print("이전 대화 내용이 없습니다.")
return None
elif question.lower().startswith('/ir'): # 이전 응답으로 이미지 생성
if not self.chat_history.empty:
last_response = self.chat_history.iloc[-1]['답변']
try:
image_path = self.diffusion.generate_image(
prompt=last_response,
save_dir=self.images_dir
)
return {
'답변': f"이전 대화 내용으로 이미지를 생성했습니다: {image_path}",
'주제': '이미지 생성',
'AI_모델': 'Stable Diffusion 3.5',
'이미지경로': image_path
}
except Exception as e:
return {'답변': f"이미지 생성 실패: {str(e)}", '주제': '이미지 생성', 'AI_모델': 'Stable Diffusion 3.5'}
else:
print("이전 대화 내용이 없습니다.")
return None
elif question.lower().startswith("/p "):
question = question[3:]
try:
answer = self.perplexity.get_response(question)
ai_model = "Perplexity"
except Exception as e:
print(f"\nPerplexity API 오류: {e}")
print("Ollama로 전환합니다...\n")
return self._chat_with_ollama(question)
else:
answer = self._chat_with_ollama(question)
ai_model = "Ollama"
* 기타 다른 문제점은 LLama3 모델이 계속 영어로만 대답한 문제가 컸습니다. 파라미터로 확실히 한국어를 사용하라 했는데도,, 영어로 결과를 주로 뱉더라고요. 아마 이는 제가 그만큼 로컬 라마를 활용하는데 능숙함이 낮다는 반증이긴 하겠죠? 해보면서 배웁니당.
* 또한, Cursor AI 는 정말 훌륭한 개발 도구입니다. 그러나, 무료 토큰이 다했을 때 사용은 가능하지만 생산속도가 너무 낮아졌습니다. 제가 직접 짠 코드가 아니라 Cursor 짜준 것을 대부분 쓰다보니 고치는데 무방비가 된 제 모습을 보며 한계성을 느낀 시간이 있었습니다. 그리고 바로 Pro 결제를 해버렸습니다 ^^..
5. 정리
회사 업무내에서 ChatGPT 나 Perplexity 를 많이 사용합니다. 실생활에서도 뭔가 모를 때 생성형 A.I를 사용해서 시간을 절약하죠. 하지만, 저만의 생성형 A.I 를 갖고 이를 기획부터 개발까지 해보는 개념은 또 다른 세계라 생각합니다. 생각과 실행을 해본다는 것은 또 다른 활용능력이라 생각하거든요. 그래서 저는 위와 같이 애니메이션 스토리를 만들어주는 A.I 를 만들어보았습니다!
'Data > 머신러닝' 카테고리의 다른 글
[머신러닝] Uplift(업리프트) : 처치효과를 관측 할 수 있는 모델링 (0) | 2025.02.16 |
---|---|
[머신러닝] RMSE 설명 및 코드 (0) | 2024.03.18 |
[머신러닝] tslearn TimeSeriesKmeans : 시계열 데이터에 K-Means 클러스터링 적용 (0) | 2024.02.17 |