해당 글은 Google Machine Learning Bootcamp 2024의 수료 요건 중 하나였던 GemmaSprint 프로젝트를 진행한 후, 이를 바탕으로 프로젝트의 전반적인 내용을 정리해 소개합니다.
1. 프로젝트 소개
1.1. 프로젝트 설명
TextTure 프로젝트는 비정형 텍스트 데이터를 자동으로 정형 데이터로 변환하여 데이터베이스에 손쉽게 저장하고, 저장된 데이터를 효율적으로 검색할 수 있는 솔루션을 제공하는 프로젝트입니다.
이를 통해, 사용자가 작성한 게시판 글이나 코멘트와 같은 비정형 텍스트 데이터를 Gemma2 모델을 활용해 키워드 추출을 진행한 후 데이터베이스 필드에 맞게 정형화하고, 분석 진행을 위한 사용자의 요청을 데이터베이스 스키마를 검색하여 SQL 쿼리로 변환(Text-to-SQL)하여 응답하는 두 가지 주요 기능을 제공합니다.
비정형 텍스트 데이터인 "Text"를 정형 데이터로 변환한다는 의미로 프로젝트명을 "TextTure(Text-to-StrucTured)"로 선정했습니다.
1.2. 주제 선정 이유
비정형 데이터를 정형 데이터로 변환하는 작업은 다양한 비즈니스 영역에서 필수적입니다. 데이터베이스에 손쉽게 데이터를 저장하고, 이 데이터를 효율적으로 검색할 수 있는 시스템을 구축하는 것은 시간과 리소스를 절약하는 데 큰 도움이 됩니다. TextTure 프로젝트는 이러한 작업을 자동화하여 데이터 관리의 효율성을 높이는 데 중점을 두고 진행했습니다.
2. 기술 스택
본 프로젝트에서 사용된 기술 스택은 다음과 같습니다.
- 프로그래밍 언어: Python
- 백엔드 프레임워크: FastAPI
- LLM 프레임워크 : Langchain
- 텍스트 분석 모델: Gemma2:2b 모델
- 데이터베이스: MariaDB (SQLAlchemy를 통한 연결)
- 기타 : Docker
3. TextTure 아키텍처
TextTure의 아키텍처는 다음과 같이 구성됩니다:
- 유저 입력: 사용자는 게시판 글 또는 코멘트를 입력
- API 서버: FastAPI로 구성된 API 서버가 유저 입력을 수신
- Gemma 모델: Gemma2:2b 모델이 유저의 텍스트 데이터를 분석하여 제목, 카테고리, 내용 등을 추출
- 데이터베이스 저장: 추출된 데이터는 데이터베이스(MariaDB)에 저장
- Text-to-SQL 기능: 사용자는 텍스트 쿼리를 입력하고, Gemma2:2b 모델을 통해 이를 SQL 쿼리로 변환하여 응답
이 아키텍처를 통해 TextTure는 비정형 텍스트 데이터를 자동으로 정형화하고 데이터베이스에 저장하며, 이후 데이터베이스에 저장된 데이터를 효율적으로 검색할 수 있는 기능을 제공합니다.
4. 기능 설명
4.1. 키워드 추출 및 데이터베이스 저장
이 기능은 사용자가 게시판에 작성한 비정형 텍스트에서 제목, 카테고리, 내용과 같은 중요한 키워드를 추출하여 데이터베이스에 저장하는 것입니다. 이를 통해 비정형 데이터를 정형 데이터로 변환하고 효율적으로 관리할 수 있습니다.
구현 코드
- 키워드 추출 함수(extract_keywords_from_text):
Gemma2:2b 모델을 호출하여 게시물 텍스트에서 title, main_category, sub_category, contents와 같은 필드를 추출합니다.
추출된 필드는 데이터베이스에 저장할 준비가 됩니다.
def extract_keywords_from_text(text: str) -> dict:
prompt = f"다음 텍스트에서 제목, 메인 카테고리, 서브 카테고리, 내용을 추출하세요: {text}"
response = call_gemma(prompt)
if not response:
raise ValueError("Gemma2:2b 모델이 응답하지 않거나 빈 응답을 반환했습니다.")
# 정규식을 사용하여 제목, 메인 카테고리, 서브 카테고리, 내용 추출
title_match = re.search(r"\*\*제목:\*\*\s*(.+)", response)
main_category_match = re.search(r"\*\*메인 카테고리:\*\*\s*(.+)", response)
sub_category_match = re.search(r"\*\*서브 카테고리:\*\*\s*(.+)", response)
contents_match = re.search(r"\*\*내용:\*\*\n*(.+)", response, re.DOTALL)
extracted_data = {
"title": title_match.group(1) if title_match else "",
"main_category": main_category_match.group(1) if main_category_match else "",
"sub_category": sub_category_match.group(1) if sub_category_match else "",
"contents": contents_match.group(1).strip() if contents_match else ""
}
return extracted_data
- 데이터베이스 저장 함수 (add_content_to_db):
위에서 추출한 키워드를 MariaDB 데이터베이스에 저장하는 역할을 합니다. extract_keywords_from_text로 추출된 데이터를 NewsBase로 변환한 후, 이를 데이터베이스에 삽입합니다.
def add_content_to_db(content: RawContent, db: Session):
# 키워드 추출
extracted_data = extract_keywords_from_text(content.contents)
# 데이터베이스에 저장할 데이터 생성
news_data = NewsBase(
title=extracted_data["title"],
main_category=extracted_data["main_category"],
sub_category=extracted_data["sub_category"],
contents=extracted_data["contents"],
source_site=content.source_site
)
# 데이터베이스에 삽입
return create_news(db, news=news_data)
4.2. Text-to-SQL
이 기능은 사용자가 텍스트 형식으로 입력한 데이터베이스 쿼리 요청을 SQL 쿼리로 변환하는 것입니다. 이때 Gemma2:2b 모델을 사용하여 텍스트 데이터를 SQL 문법에 맞는 쿼리로 변환하고, 데이터베이스 스키마를 분석하여 정확한 쿼리를 반환합니다.
구현 코드
- Text-to-SQL 함수 (sql_from_text):
사용자가 입력한 텍스트를 데이터베이스 스키마와 대조하여 SQL 쿼리로 변환하는 작업을 담당합니다. 이를 위해 Gemma2:2b 모델을 사용하여 SQL 쿼리를 생성합니다.
def sql_from_text(user_input):
# 데이터베이스 스키마 정보를 가져옴
schema_info = get_database_schema()
# 데이터베이스 스키마 문자열 생성
schema_str = "\n".join([f"Table {table}: {', '.join(columns)}" for table, columns in schema_info.items()])
prompt = f"""
다음은 데이터베이스 스키마입니다:
{schema_str}
위 스키마를 참고하여 다음 요청을 SQL 쿼리로 변환하세요:
{user_input}
"""
# Gemma2:2b 모델로 SQL 쿼리 생성
sql_query = call_gemma(prompt)
return sql_query
5. API 사용 예시
5.1. 키워드 추출 및 데이터베이스 저장 API
POST 요청으로 게시물 텍스트를 전송하고, Gemma2:2b 모델이 데이터를 분석하여 데이터베이스에 저장합니다.
- 요청 예시
{
"contents": "최근에 발표된 아이폰 15는 혁신적인 기능을 추가하여 많은 관심을 받고 있습니다. 특히 새로운 카메라 기술이 주목받고 있으며, 업계 전문가들은 아이폰 15의 카메라 성능이 매우 우수하다고 평가하고 있습니다.",
"source_site": "Tech News"
}
- 응답 예시
{
"message": "키워드 추출 성공",
"data": {
"contents": "*최근에 발표된 아이폰 15의 혁신적인 기능 중 특히 새로운 카메라 기술이 주목받고 있습니다. \n* 아이폰 15의 카메라 성능이 업계 전문가들의 평가에서 매우 우수하다고 언급됩니다.",
"title": "아이폰 15 카메라 혁신!",
"main_category": "스마트폰, 아이폰 ",
"id" : 1,
"source_site": "Tech News"
}
}
- 요청 결과 확인
- 데이터베이스의 데이터 적재 확인
MariaDB 서버에 접속하여 데이터가 적재되었음을 확인할 수 있다.
5.2. Text-to-SQL API
사용자는 자연어로 작성된 텍스트 쿼리를 입력하여 SQL 쿼리를 반환받을 수 있습니다.
- 요청 예시
{
"user_input": "뉴스 테이블에서 데이터베이스 필드가 뭐가 있는지 알 수 있는 쿼리문을 알려줘"
}
- 응답 예시
{
"message": "```sql\nSELECT column_name FROM news; \n``` \n"
}
- 요청 결과 확인
6. 결론
TextTure 프로젝트를 진행하며 데이터 자동화의 중요성을 직접 경험해볼 수 있었습니다. 실제로 여러 산업에서 비정형 데이터를 효율적으로 처리하는 것이 중요한데, 이를 가볍게나마 구현해볼 수 있어 의미가 있었습니다.
특히, 복잡한 데이터 처리 과정을 자동화하는 작업이 생각보다 더 많은 이점을 가져다준다는 것을 느꼈습니다. 이를 계기로, 앞으로도 이런 자동화 과정을 더 다양한 프로젝트에 적용해보고 싶습니다.
7. Github Repository
프로젝트의 모든 소스 코드는 아래의 Github 링크에서 확인할 수 있습니다.
https://github.com/GOOGLE-MLB-2024-GJ/TextTure
GitHub - GOOGLE-MLB-2024-GJ/TextTure
Contribute to GOOGLE-MLB-2024-GJ/TextTure development by creating an account on GitHub.
github.com
'Project' 카테고리의 다른 글
[Landscape Analysis] 첫 외주를 맡다! (0) | 2025.03.03 |
---|---|
[ParkScore] 한국 도시공원 평가 지표 프로젝트 (1) | 2024.07.11 |