LLM 모델을 사용하여 다양한 형식의 표 데이터를 어떻게 사용할 수 있을까?
투자 회사에서 일하는 재무 분석가를 생각해보자. 당신의 업무는 잠재적인 투자 기회를 파악하는 것이다. 검색 증강 생성(RAG) 시스템을 사용하여 시장 동향, 투자 기회, 경제적 위험을 쉽고 빠르게 파악하고 "어느 산업에 억만장자가 가장 많을까?" 또는 "다른 지역에서 억만장자의 나이 분포는 어떻게 비교될까?" 같은 질문에 답하는 것을 고려할 수 있다.
첫 번째 단계는 해당 정보를 얻기 위해 출처로 가는 것이다. 하지만 문서에는 텍스트 뿐만 아니라 표도 포함되어 있다.

LLM과 구조화된 데이터의 과제
인간에게는 텍스트와 표 사이의 연결점을 생각해내는 것이 간단하지만, LLM에게는 그렇지 않다.
LLM은 순차적으로 텍스트 처리를 하도록 설계되어 있다. 즉, 한 번에 한 단어나 문장씩 정보를 읽고 이해한다. 그러나 표는 다른 형식으로 정보를 표시한다. 데이터를 행과 열로 구성하여 다차원 구조를 생성한다.
따라서 LLM은 행과 열의 패턴을 인식하고, 다양한 데이터 포인트 간의 관계를 이해 해야하고, 헤더와 셀 값의 의미를 해석해야 한다.
실제로 프롬프팅 해보기
세계 억만장자 목록을 보여주는 위 그림을 기반으로 하여, 미래의 RAG 프레임워크에 공급하고 그 억만장자 목록에 대한 질문에 답해보자.
1단계: 라이브러리 임포트
import os
import sys
import pandas as pd
from typing import List
!pip install beautifultable #시각적으로 표 형식 구현
from beautifultable import BeautifulTable
!pip install opencv-python
!pip install camelot-py
!pip install ghostscript camelot
2단계: 데이터 준비
판다스 데이터프레임으로 추출된 데이터를 정리할 수 있도록 하는 과정을 거친다.
file_path= "./세계_억만장자_위키피디아.pdf"
# camelot을 사용하여 테이블 구문 분석
def get_tables ( path: str , pages: List [ int ] ):
for page in pages:
table_list = camelot.read_pdf(path, pages= str (page))
if table_list.n> 0 :
for tab in range (table_list.n):
# 테이블을 데이터프레임으로 변환합니다.
table_df = table_list[tab].df
table_df = (
table_df.rename(columns=table_df.iloc[ 0 ])
.drop(table_df.index[ 0 ])
.reset_index(drop= True )
)
table_df = table_df.apply( lambda x: x. str .replace( '\n' , '' ))
# 열 이름을 XML 태그로 유효하도록 변경
table_df.columns = [col.replace( '\n' , ' ' ).replace( ' ' , '' ) for col in table_df.columns]
table_df.columns = [col.replace( '(' , '' ).replace( ')' , '' ) for col in table_df.columns]
return table_df
# 페이지 번호에서 데이터 테이블 추출
df = get_tables(file_path, 페이지=[ 3 ])
데이터 프레임의 테이블을 Json, CSV, Markdown 등 다양한 형식으로 변환한다.
# 테스트 세트 준비
eval_df = pd.DataFrame(columns=[ "데이터 형식" , "데이터 원시" ]) # , "질문", "답변"
# JSON 형식으로 데이터 저장
data_json = df.to_json(orient= 'records' )
eval_df.loc[ len (eval_df)] = [ "JSON" , data_json]
# 데이터를 사전 목록으로 저장
data_list_dict = df.to_dict(orient= 'records' )
eval_df.loc[ len (eval_df)] = [ "DICT" , data_list_dict]
# 데이터를 CSV 형식으로 저장
csv_data = df.to_csv(index= False )
eval_df.loc[ len (eval_df)] = [ "CSV" , csv_data]
# 데이터를 다음으로 저장 탭으로 구분된 형식
tsv_data = df.to_csv(index= False , sep= '\t' )
eval_df.loc[ len (eval_df)] = [ "TSV (탭으로 구분)" , tsv_data]
# HTML 형식으로 데이터를 저장합니다.
html_data = df.to_html(index= False )
eval_df.loc[ len (eval_df)] = [ "HTML" , html_data]
# LaTeX 형식으로 데이터를 저장합니다.
latex_data = df.to_latex(index= False )
eval_df.loc[ len (eval_df)] = [ "LaTeX" , latex_data]
# Markdown 형식으로 데이터를 저장합니다.
markdown_data = df.to_markdown(index= False )
eval_df.loc[ len (eval_df)] = [ "Markdown" , markdown_data]
# 데이터를 문자열로 저장합니다
string_data = df.to_string(index= False )
eval_df.loc[ len (eval_df)] = [ "STRING" , string_data]
# 데이터를 NumPy 배열로 저장합니다
numpy_data = df.to_numpy()
eval_df.loc[ len (eval_df)] = [ "NumPy" , numpy_data]
# 데이터를 XML 형식으로 저장합니다
xml_data = df.to_xml(index= False )
eval_df.loc[ len (eval_df)] = [ "XML" , xml_data]
테스트 데이터셋을 확인해본다.
from pandas import option_context
with option_context('display.max_colwidth', 150):
display(eval_df.head(10))
3단계: 검증을 위한 모델 설정
테이블 데이터로 테스트를 수행하기 전 모델을 연결 설정한다. (예시에서는 AzureOpenAI 사용) 자격 증명이 필요하다.
from openai import AzureOpenAI
client = AzureOpenAI(
api_key=OAI_API_Key,
api_version=OAI_API_Version,
azure_endpoint=OAI_API_Base)
def response_test(question:str, context:str, model:str = "gpt-4"):
response = client.chat.completions.create(
model=model,
messages=[
{
"role": "system",
"content": MESSAGE_SYSTEM_CONTENT,
},
{"role": "user", "content": question},
{"role": "assistant", "content": context},
],
)
return response.choices[0].message.content
각 행이 개별적인 context 정보 단위를 나타내는 데이터셋을 사용하고 있으므로 반복문을 구현하여 행을 하나씩 처리하고 각 행에 대한 모델 해석을 저장한다.
def run_question_test(query: str, eval_df:str):
questions = []
answers = []
for index, row in eval_df.iterrows():
questions.append(query)
response = response_test(query, str(row['Data raw']))
answers.append(response)
eval_df['Question'] = questions
eval_df['Answer'] = answers
return eval_df
def BeautifulTableformat(query:str, results:pd.DataFrame, MaxWidth:int = 250):
table = BeautifulTable(maxwidth=MaxWidth, default_alignment=BeautifulTable.ALIGN_LEFT)
table.columns.header = ["Data Format", "Query", "Answer"]
for index, row in results.iterrows():
table.rows.append([row['Data Format'], query, row['Answer']])
return table
4단계: 결과 산출
이제 각 테이블 데이터셋에서 결과를 얻고, 그 결과를 테이블로 표시해본다.
query = "What's the Elon Musk's net worth?"
result_df1 = run_question_test(query, eval_df.copy())
table = BeautifulTableformat(query, result_df1, 150)
print(table)
출처: Tabular Data, RAG, & LLMs: Improve Results Through Data Table Prompting
'AI engineering > LLM' 카테고리의 다른 글
[LLM] 딥시크란? 맥북으로 딥시크 간단하게 돌려보기 (0) | 2025.02.16 |
---|---|
이 ChatGPT는 스스로 마인크래프트를 합니다. - LLM, AI agent (0) | 2024.12.30 |
[LLM] ChatGPT, Claude, Gemini 같은 LLM이란? 초보도 쉽게 알기 (0) | 2024.12.28 |