[AI] PDF 의 테이블을 모델이 인식하지 못한다고?

늘 공부하는 괴짜·2025년 6월 8일
0

AI : Langchain (RAG)

목록 보기
30/38
post-thumbnail

1. PDF 파일을 읽다가

1-1. 이런식으로 테이블이 들어가있는 문서는 어떨까... 싶어서

1-2. PyPDFLoader로 읽어봤더니 이런식으로 변환되는 거였다.

옵션명 타입 필수 여부 설명
model_path str 필수 GGUF 모델 파일의 경로.
n_ctx int 선택 컨텍스트 창 크기 (처리할 수 있는 최대 토큰 수)
n_gpu_layers int 선택 GPU에 오프로드할 모델 레이어 수 (-1은 모두 오프로드, 0은 CPU만 사용)
temperature float 선택 샘플링 온도 (0.0 ~ 2.0+). 낮을수록 결정론적, 높을수록 창의적
top_p float 선택 Top-P (nucleus) 샘플링. 누적 확률 P값 이내의 토큰만 고려
max_tokens int 선택 생성할 최대 토큰 수.
stopping_words List[str] 선택 생성 중단 문자열 목록.
verbose bool 선택 상세 로깅 출력 여부.

2. 뭐 모델이 읽기만 하면 되지 뭐...

임베딩은 nomic-embed-text, llm은 exaone3.5:2.4b

from langchain_ollama import OllamaLLM, OllamaEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain.prompts import ChatPromptTemplate
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains import create_retrieval_chain
from langchain_core.documents import Document

table_data = """
ID  내용 설명                                 상태       비고
1   사용자 등록 요청, 처리되었으나 일부 정보↓누락추가 조치 필요 완료       이메일 재전송 필요 (7일 내)
2  백엔드 응답 지연 현상.로그 미수집 → 원인 불분명(조사중) 진행중     모니터링 포트 추가 필요
3   "사용자: 앱 느려요!" 라는 피드백이 있음. UX 개선 요구(특히 안드로이드) 🟡 대기 중 기획안 미확정
4  DB 마이그레이션 사전 준비중—현재 구성 백업 실패 사례 존재❗ 위험 ⚠️     백업 로그 누락
5  문서 양식 통일 필요…팀 내 전달방식 불일치→ 혼란 발생 가능성 有 📌 필요     Notion 정책 검토
6 신규 기능 요청: 알림 커스터마이징 가능하게 (단, 중요도 분류 기준 모호) 검토 중     우선순위 낮음
7   서버 리소스 초과: Redis TTL 설정 누락 + 불필요한 캐시 유지 중 🚨 심각     일시적 scale-out 고려
8  iOS UI 깨짐 현상 발생 (iPhone SE 1세대 기준) ⏳ 분석 중  디바이스 해상도 차이 원인 추정
9   문장 끝에 공백 이슈 발생.유니코드 공백 문자( , )로 추정됨 🧪 테스트 중 다국어 입력기 영향 가능성
10  고객센터 응답지연: 평균 응답 3일↑ (정상은 24시간 이내) 🔴 이슈     인력 증원 요청됨
"""

# 마크다운 데이터를 Document 객체로 변환
documents = [Document(page_content=table_data, metadata={"source": "LlamaCpp_Options_Table"})]


# 2. 텍스트 분할 (청크 생성)
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)

print(f"원본 테이블 데이터 길이: {len(table_data)} 문자")
print(f"생성된 청크 수: {len(chunks)}")


# 3. 임베딩 및 벡터 저장소 생성 (Ollama Embeddings 및 FAISS 사용)
embeddings = OllamaEmbeddings(model="nomic-embed-text")

# FAISS.from_documents를 사용하여 벡터 저장소 생성
vectorstore = FAISS.from_documents(chunks, embeddings)

# 4. OllamaLLM 모델 초기화
llm = OllamaLLM(model="exaone3.5:2.4b")

# 5. RAG 체인 구축
# 5-1. 문서 결합 체인 (검색된 문서를 프롬프트에 삽입)
prompt = ChatPromptTemplate.from_template("""
주어진 컨텍스트를 사용하여 질문에 답변하세요.
만약 컨텍스트에 정보가 없다면, 모른다고 답하세요.

<context>
{context}
</context>

질문: {input}
""")

document_chain = create_stuff_documents_chain(llm, prompt)

# 5-2. 검색 체인 (질문 -> 검색 -> 문서 결합)
retriever = vectorstore.as_retriever()
retrieval_chain = create_retrieval_chain(retriever, document_chain)

# 6. RAG 쿼리 실행
question1 = "DB 마이그레이션 사전 준비중 상태는 무엇인가요?"
response1 = retrieval_chain.invoke({"input": question1})
print(f"\n--- 질문 1: {question1} ---")
print(f"답변: {response1['answer']}")
print(f"참조 문서: {response1['context'][0].page_content.strip().splitlines()[0]}...") # 첫 번째 참조 문서의 첫 줄 출력

3. 결과

뭔가 맞는거 같긴 한데...?

4. 테이블을 markdown 으로 바꿔보자.

| ID  | 내용 설명                                  | 상태       | 비고                         |
|-----|--------------------------------------------|------------|------------------------------|
| 1   | 사용자 등록 요청, 처리되었으나 일부 정보↓누락<br>추가 조치 필요 | 완료       | 이메일 재전송 필요 (7일 내) |
| 2  | 백엔드 응답 지연 현상.로그 미수집 → 원인 불분명(조사중) | 진행중     | 모니터링 포트 추가 필요     |
| 3   | "사용자: 앱 느려요!" 라는 피드백이 있음. UX 개선 요구<br>(특히 안드로이드) | 🟡 대기 중 | 기획안 미확정                |
|4   | DB 마이그레이션 사전 준비중—현재 구성 백업 실패 사례 존재❗ | 위험 ⚠️     | 백업 로그 누락              |
|5   | 문서 양식 통일 필요…팀 내 전달방식 불일치<br>→ 혼란 발생 가능성 有 | 📌 필요     | Notion 정책 검토            |
|6  | 신규 기능 요청: 알림 커스터마이징 가능하게 (단, 중요도 분류 기준 모호) | 검토 중     | 우선순위 낮음               |
|7    | 서버 리소스 초과: Redis TTL 설정 누락 + 불필요한 캐시 유지 중 | 🚨 심각     | 일시적 scale-out 고려       |
|8   | iOS UI 깨짐 현상 발생 <br>(iPhone SE 1세대 기준) | ⏳ 분석 중  | 디바이스 해상도 차이 원인 추정 |
|9   | 문장 끝에 공백 이슈 발생    .<br>유니코드 공백 문자( , )로 추정됨 | 🧪 테스트 중 | 다국어 입력기 영향 가능성   |
|10   | 고객센터 응답지연: 평균 응답 3일↑ (정상은 24시간 이내) | 🔴 이슈     | 인력 증원 요청됨            |

5. 결과

비슷한 것처럼 보이지만 위험 상태라고 정확하게 응답해준다.

Finally

테이블 데이터는 마크다운으로 작성하자.

profile
인공지능이라는 옷을 입었습니다. 뭔가 멋지면서도 잘 맞습니다.

0개의 댓글