기본 모델의 성능을 살펴보기 위한 기본 코드를 돌려보았는데 여러 질문을 해 본 결과 꽤나 잘못된 정보를 답변하는 경우가 존재했다.
택한 데이터가 논문이었기 때문에 챗봇으로 활성화를 했을 경우 치명적일 것이라고 판단했다.
대대적으로 전처리부터 다시했다.
전처리
import re
def remove_table_section(text):
# "표"라는 단어가 포함된 부분부터 그 이후의 내용 제거
text_without_table = re.split(r"\n표", text, maxsplit=1)[0]
return text_without_table.strip()
for doc in docs:
doc.page_content = remove_table_section(doc.page_content)
청크로 나누기
CharacterTextPlitter : 텍스트를 나눌 때 사용할 구분자를 지정해서 나누는 방법
RecursiveCharacterTextSplitter : 단일 구분자 기준으로 텍스트를 분할하는 것이 아닌 우선순위에 따라 재귀적으로 적용하여 텍스트를 나눔
Retriever 선택
질문
아래 질문들의 경우 표 데이터를 제거한 후 제대로 추출할 수 있었던 질문, 표 데이터도 같은 문맥의 문서로 취급되었기 때문
1. Open Ko-LLM Leaderboard에는 어떤 기업들이 참여하고 있어?
2. Open Ko-LLM Leaderboard에는 카카오가 참여하고 있어?
아래 질문들의 경우 retriever에 BM25를 적용함으로 제대로 추출할 수 있었던 질문, 적용하지 않을 시 Hullcination을 일으킴
3. 한국의 LLM 리더보드에 ETRI가 참여하고 있어?
4. 한국의 LLM 리더보드에 카카오가 참여하고 있어?
5. Open Ko-LLM Leaderboard에는 카카오가 참여하고 있어?
6. Open Ko-LLM Leaderboard에는 ETRI가 참여하고 있어?
7. 카카오의 인공지능 윤리 원칙에 책임성이 포함되어 있어?
이를 통해 RAG의 성능을 원하는 수준까지 올릴 수 있게 되었다.
더 높은 성능을 원한다면 프롬프트 엔지니어링을 고차원하는 방법이 있을 수 있겠다.
# set the LANGCHAIN_API_KEY environment variable (create key in settings)
from langchain import hub
import os
from dotenv import load_dotenv
load_dotenv()
langchain_api_key = os.getenv("LANGCHAIN_API_KEY")
# Langchain 라이브러리에서 원하는 프롬프트 댕겨오기
os.environ["LANGCHAIN_API_KEY"] = langchain_api_key
prompt = hub.pull("rlm/rag-answer-hallucination")
# 프롬프트 텍스트만 추출
prompt_text = prompt.messages[0].prompt.template
# 댕겨온 프롬프트 template 저장
output_dir = "Prompts"
output_path = os.path.join(output_dir, "prompt3.txt")
# 프롬프트 데이터를 파일에 저장
with open(output_path, "w", encoding="utf-8") as file:
file.write(prompt_text)
print(f"Prompt saved to {output_path}")
main.ipynb
output_dir = "Prompts"
output_path = os.path.join(output_dir, "prompt3.txt")
promt_txt = ""
# 프롬프트 데이터를 파일에 저장
with open(output_path, "r", encoding="utf-8") as file:
promt_txt = file.read()
promt_txt
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
# 프롬프트 템플릿 정의 (prompt1, prompt3)
contextual_prompt = ChatPromptTemplate.from_messages([
("system", promt_txt),
("user", "Context: {context}\\n\\nQuestion: {question}")
])