회고기간 : 2025.04.14월~2025.04.18금
이번 주차는 트랜스포머, bert, 허깅페이스 파이프라인, prompt engineering, local llm에 대해 배웠다.
Transformer
기존의 seq2seq 구조의 인코더-디코더 + attention 알고리즘을 구현한 모델
[기존의 seq2seq 구조]
인코더가 입력 시퀀스를 하나의 벡터로 압축하는 과정에서 입력 시퀀스의 정보가 일부 손실됨
[transformer]
병렬 처리와 전역 문맥 이해를 통해 RNN의 한계를 극복한 딥러닝 모델로, 인코더-디코더 구조
와 어텐션 메커니즘을 기반으로 한다.
* 어텐션
입력 시퀀스의 중요한 부분에 가중치를 부여해 번역 품질을 향상시키는 메커니즘이다.

- 인코더: 입력 시퀀스를 벡터로 변환
- 디코더: 인코더의 벡터를 사용해 출력 시퀀스 생성
- Multi-Head Attention: 단어 간 관계를 다각도로 학습
- 포지셔널 인코딩: 단어 순서 정보 추가
BERT
BERT(Bidirectional Encoder Representations from Transformers)는 2018년에 구글이 공개한 사전 훈련된 모델이다.
이는 트랜스포머를 이용하여 구현되었으며, 위키피디아(25억 단어)와 BooksCorpus(8억 단어)와 같은 레이블이 없는 텍스트 데이터로 사전 훈련된 언어 모델이다.
- 양방향 문맥 학습: 앞뒤 문맥을 모두 반영해 단어 의미 이해
- 학습 방법
- Masked Language Model (MLM): 문장 일부를 [MASK]로 숨기고 예측
- Next Sentence Prediction (NSP): 두 문장이 연속되는지 판단
- 사전 학습 + 미세 조정: 대규모 데이터로 학습 후 특정 작업에 활용
LLM의 주요 파라미터
| Top P | Maximum Tokens | Temperature |
| - 확률적 필터링을 통해 모델의 출력 단어를 제한하는 파라미터 - p = 0.9 라면 출력 확률이 가장 높은 단어들의 합이 90% 이상인 단어만 고려 |
- 생성되는 출력의 최대 길이를 설정한다 - 입력과 출력의 토큰 합계는 모델의 토큰 제한을 넘을 수 없다 |
- 출력의 창의성을 제어하는 파라미터 - 값이 낮을수록 일관되고 결정적인 결과 - 값이 높을수록 더 창의적인 출 |
Prompt engineering
- chat completion : 사용자의 질문이나 요구에 대해 자연스럽고 일관성 있는 전체 대화를 생성
- 기사 제목 교정 : 어색하거나 잘못된 기사 제목을 문맥에 맞고 매끄러운 형태로 수정
- 영단어장 생성 : 주어진 영어 문장 또는 텍스트에서 핵심 단어를 추출하고, 뜻과 예문을 포함한 단어장을 만
- ReAct 기법 : 문제 해결을 위해 추론(Reasoning)과 행동(Action)을 번갈아 수행하는 방식으로, 에이전트가 환경과 상호작용하며 답을 도출
- 면접 질문 생성 : 특정 직무나 주제에 맞춰 지원자에게 적절한 면접 질문을 자동으로 생성
chat completion
: 입력 완성의 구조로, 질문에 최적화된 api
from openai import OpenAI
client = OpenAI(api_key=OPENAI_API_KEY)
response = client.chat.completions.create( # chat.completions의 파라미터
model="gpt-4o",
messages=[{ # system prompt, user prompt 각각 두 가지 생성
"role" : "system",
"content" : [
{
"type" : "text",
"text" : "당신은 아주 친절한 챗봇입니다."
}
]
},
{
"role" : "user",
"content" : [
{
"type" : "text",
"text" : "화요일 저녁 뭘 먹으면 좋을까?"
}
]
}],
response_format= {
"type" : "text"
},
temperature=0.8,
max_tokens=2048,
top_p=1,
frequency_penalty=0,
presence_penalty=0,
)
기사 제목 교정
from openai import OpenAI
def correct_title(query, temperature=0.3):
client = OpenAI(api_key=OPENAI_API_KEY)
system_instruction = """
너는 편집장이야. 기자들이 송고한 기사 제목을 교정해줘
### 지시사항 ###
- 기사의 제목이 명확하고 주제와 잘 맞도록 수정
- 독자의 관심을 끌 수 있도록 간결하고 임팩트 있는 표현을 사용할 것
- 비속어, 은어 등은 제거하고 의미가 유지되도록 제목을 교정할 것
### 출력형식 ###
- 원래 제목 : [기사의 원래 제목]
- 교정 제목 :
[기사의 교정된 제목]
[기사의 교정된 제목]
[기사의 교정된 제목]
### 예시 ###
- 원래 제목 : "어제 서울에 큰불이 나서 수백명이 대피했다"
- 교정 제목 : "서울 대형 화제, 수백명 대피!"
"수백명 대피한 서울화재"
"서울서 화재, 수백명 대피해"
"""
user_message = f"""
다음 제목을 교정해주세요.
제목:{query}"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[{
"role" : "system",
"content" : [
{
"type" : "text",
"text" : system_instruction
}
]
},
{
"role" : "user",
"content" : [
{
"type" : "text",
"text" : user_message
}
]
}],
response_format= {
"type" : "text"
},
temperature=temperature,
max_tokens=2048,
top_p=1,
frequency_penalty=0,
presence_penalty=0,
)
return response.choices[0].message.content
+ 이외에도 문자를 음성으로 변환하는 tts, 음성을 문자로 변환하는 stt 등의 api를 사용할 수 있다
OpenAI 활용 - Moderation
- 사용자로부터 입력된 텍스트 또는 이미지가 유해하거나 부적절한 콘텐츠인지 자동으로 감지해주는 기능

from openai import OpenAI
client = OpenAI(api_key=OPENAI_API_KEY)
response = client.moderations.create(
model="omni-moderation-latest",
input="저놈은 개새끼입니다."
)
import pandas as pd
md_df = pd.DataFrame(response.results[0].categories, columns=['category', 'bool'])
md_df
<출력>

Ollama를 이용한 LLaMa3 모델 사용하기
- ollama를 이용한 llama3 기능
- 1. 간단한 질의
- 2. 입력 프롬프트에 따른 출력 변화
- 3. 파라미터 조절
- 4. 응답에 특정 단어를 포함하도록 하기
- 5. 다국어 처리 실험
- 6. 간단한 대화 시스템
예시로 응답에 특정 단어를 포함하는 api를 사용해보자
def generate_text_with_word(prompt, required_word): # 문장에 반드시 포함할 단어를 요구
print(f'[ Prompt : {prompt} | 포함할 단어 : {required_word}]')
prompt = prompt + f"<Please make sure to include the word '{required_word}' in your response.>"
response = ollama.generate(model='llama3', prompt=prompt)
res_txt = response['response']
if required_word.lower() in res_txt.lower():
print("성공❤️❤️")
else:
print("실패🥹🥹")
return res_txt
test_cases = [
("Describe the future of AI", "truck"),
("Tell me about space exploration", "Mars")
]
for prompt, required_word in test_cases:
response = generate_text_with_word(prompt, required_word)
print(f'Response: {response}')
print('=' * 100)
[출력]
[ Prompt : Describe the future of AI | 포함할 단어 : truck]
성공❤️❤️
Response: The future of AI includes applications in autonomous truck technology.
==============================================================================================
[ Prompt : Tell me about space exploration | 포함할 단어 : Mars]
성공❤️❤️
Response: Mars is one of the primary targets for future space exploration missions.
==============================================================================================
Runpod 이용해보기
runpod이란 안정적인 클라우드 GPU 컴퓨팅 서비스를 제공하는 클라우드 컴퓨팅 플랫폼으로, 기본적으로 클라우드 기반 GPU 대여 플랫폼이다.
[GPU, CPU 자원 선택]

[서버 세팅]

모델 선택 후 depoly on demand를 누르면 아래와 같이 실행 가능한 터미널과 주피터 환경이 뜬다

ollama 환경에 접속하기 위해 터미널 창에서 다음과 같은 다운로드를 실행한다

[GPU 할당 완료 화면]

[주피터 환경에서 GPU 할당 받아 파일 생성]

[파일 저장 후 pod 해제하기]
pod을 중지하더라도 요금제가 계속 할당되기 때문에 로컬에 파일을 저장한 후 delete를 해 pod을 비워줘야 한다!! ⭐⭐

Vector DB
벡터 DB란 벡터 형식으로 저장된 데이터 (고차원 임베딩 데이터)를 관리하고, 유사도 기반 검색 및 작업을 최적화하도록 설계된 DB이다.
일반적인 관계형 DB와 달리 유사도를 기반으로 데이터를 검색하는 최근접 이웃 검색 기법(Approximate Nearest Neighbor) 을 활용한다.
- 특징
- 벡터 임베딩 저장: 데이터를 벡터로 변환해 저장
- 유사도 검색 최적화: 입력 벡터와 가장 유사한 벡터를 빠르게 검색
- 확장성: 대규모 벡터 데이터를 처리할 수 있는 구조 제공
- 장점
- 고차원 데이터를 효율적으로 관리
- 비정형 데이터(이미지, 텍스트 등) 처리에 적합
- 유사도 계산을 빠르게 수행
- 적용 분야: 추천 시스템, 콘텐츠 기반 검색, 이미지 검색, 자연어 검색 등
Chroma DB를 활용한 키워드 기반 검색
1. 설치
import chromadb
2. 클라이언트, 컬렉션 생성
import chromadb
from sentence_transformers import SentenceTransformer
# 인공지능 문서 데이터를 벡터로 변환 -> 데이터 베이스에 저장,관리 할 수 있는 환경 세팅
client = chromadb.PersistentClient(path='./chroma_db')
collection = client.get_or_create_collection(name='ai_documents')
# 텍스트 임베딩 모델 로드
model = SentenceTransformer('all-MiniLM-L6-v2')
3. 데이터 불러오기
documents = [
"인공지능은 인간의 작업을 자동화하는 기술이다.",
"기계 학습은 패턴을 학습하여 예측하는 기술이다.",
"벡터 데이터베이스는 유사도를 기반으로 데이터를 검색하는 DB이다.",
"자연어 처리는 인간의 언어를 이해하고 생성하는 기술이다.",
"강화 학습은 보상을 통해 최적의 행동을 학습하는 알고리즘이다.",
"챗봇은 사용자의 질문에 자동으로 응답하는 시스템이다.",
"딥러닝은 심층 신경망을 활용하여 복잡한 데이터를 분석하는 기술이다.",
"오토인코더는 입력 데이터를 압축하고 복원하는 비지도 학습 모델이다.",
"GAN은 두 개의 신경망이 경쟁하며 학습하는 생성 모델이다.",
"클러스터링은 데이터를 유사한 그룹으로 나누는 비지도 학습 방법이다.",
"전이 학습은 사전 학습된 모델을 새로운 작업에 활용하는 기법이다.",
"하이퍼파라미터 튜닝은 모델 성능을 높이기 위한 설정 최적화 과정이다.",
"트랜스포머는 문맥을 고려한 자연어 처리에 효과적인 모델 구조이다."
]
# documents에 있는 모든 문서 -> 벡터로 변환 -> 데이터베이스에 저장
for i, doc in enumerate(documents):
embedding = model.encode(doc).tolist() #각 문서를 model(임베딩모델) 사용해서 숫자 벡터(embedding)로 변환
collection.add(
ids=[str(i)], #각 문서마다 고유한 id부여
embeddings=[embedding], #변환된 임베딩 벡터 저장
metadatas=[{"text":doc}] #원본 문서 텍스트도 메타데이터로 저장
)
4. 모델 불러오기
query_keyword = 'AI'
query_embedding = model.encode(query_keyword).tolist()
results = collection.query(query_embeddings=query_embedding, n_results=2)
for result in results["metadatas"][0]:
print('검색된 문서:', result['text'])
results

💡 Keep
로직을 짜고 api나 모델을 불러와 바로바로 결과를 확인할 수 있다는 점에서 LLM에 재미를 붙이고 있는 것 같다이번주에 개인 프로젝트가 주어졌는데 아쉬움없도록 시연까지 꼼꼼히 설계해봐야겠다
⚠️ Problem
NLP 들어오고부터 빅분기 필기와 정처기 실기 시험이 겹쳐서 부랴부랴 달려온 것 같아서 회고도 제대로 못쓴걸 반성한다ㅠ5월에는 바짝 따라가야겠다고 느낀다
그리고 ollama나 chorma 환경 세팅이 충돌나서 깔고지우고깔고지우고를 반복한다는 문제가 있다
hugging face에서 모델 가져올때 초기 anaconda prompt 에서 환경변수를 잘 지정해야겠다고 느꼈다.
🔥 Try
이번주에 있을 개인프로젝트와 복습들을 꼼꼼히 하는 내가 됐으면....🍀
'SKN > Remind' 카테고리의 다른 글
| sk네트웍스 family AI 캠프 11기 4월 5주차 회고록 (1) | 2025.05.04 |
|---|---|
| sk네트웍스 family AI 캠프 11기 4월 4주차 회고록 (3) | 2025.04.28 |
| sk네트웍스 family AI 캠프 11기 4월 1주차 회고록 (0) | 2025.04.07 |
| sk네트웍스 family AI 캠프 11기 3월 3주차 회고록 (0) | 2025.03.24 |
| sk네트웍스 family AI 캠프 11기 5주차 회고록 (0) | 2025.03.11 |