Retrieval 효율 개선을 위한 데이터 전처리
이전까지 upstageEmbedding 를 활용해서 간단하게 테스트를 진행했는데, 결과적으로는 대답이 적절하게 오지 않는다.
그 이유는 가져오는 문서에서 답변이 있는 데이터가 이미지 로 구성되어 있어 파싱하지 못했기 때문이다.
document-to-text-loader 를 하기 위해서는 이미지는 텍스트로, 표는 마크다운 에디터 형식으로 변경해야 한다.
아래 이미지를 예시로 들 수 있는데, 상단의 표를 마크다운 에디터를 통해 아래와 같이 변경해야 한다.

그렇다면 마크다운된 파일을 활용하자면 아래와 같이 진행할 수 있다.
https://rusharp.tistory.com/189 에서 만든 코드를 그대로 사용하되, 문서를 가져오는 부분은 수정해야 한다.
1. 문서 가져오기
먼저 여기서 표를 마크다운으로 변경한 tax_with_markdown.docx 파일을 준비해서 입력한다.

2. 문서 쪼개기

3. Upstage embedding 모델을 사용해서 embedding

4. DB 에 embedding 값 입력하기
아래와 같은 Pinecone index 를 생성하고, 위에서 embedding 한 값을 입력해야 한다.


5. 유사도 검색하기
이후 아래와 같이 질문과 유사한 문서 3개를 검색했을 때 결과를 확인할 수 있다.

6. LLM과 RAG 설정하기
그다음에 Upstage LLM을 불러오고, RAG 프롬프트를 질문을 던진 뒤 대답을 받는다.

아래가 markdown 을 적용하기 전의 대답이고, 위가 markdown 을 적용한 뒤의 대답으로
비교적 정확한 답변을 받아볼 수 있지만, 여전히 올바르지 않은데, 왜냐하면 정답은 624만원이기 때문이다.

그렇다면 이 질문이 정확한 대답을 하게 만들기 위해선 어떤 경로를 거쳐야 할까?
6. Retrieval 효율 개선을 위한 키워드 활용.
여전히 정답이 틀린 이유 증 하나는 `유사도 검색하기` 에서 컨텍스트로 제공하는 양이 3개로 늘어나면서
답변이 만족스럽게 되지 못하게 된건데, {"k": 1} 로 바꾸기 위해서는 "질문에 가장 정확한 대답을 할 수 있는 문서"가
높은 우선순위로 올 수 있도록 유사도를 변경하거나 프롬프트를 수정하는 등을 통해 정리할 수 있다.

6-1. Langchain에서 chain을 구성하여 사용자 입력을 사전에 따라 변환하기.
먼저 문서를 봤을 때, 5,000만원에 대한 내용에서는 `직장인` 이 아닌, `거주자`로 명시하고 있어서.
해당 링크를 참고하여 직장인을 포함하여 사람이 들어가는 모든 표현을 거주자로 변환한다.
먼저 langchain_core 을 install한 뒤에 아래와 같이 dictionary를 명시해준다.
여기서 dictionary 는 규칙 또는 사전 역할을 하는 리스트로서 직장인에 대한 질문을 거주자로 변경한다.
그다음 Lahgchain에서 입력된 prompt 를 바탕으로 llm 모델이 변환된 질문을 그대로 출력한다.
이후 StrOutParser() 를 통해 모델의 응답을 문자열로 변환하여 규칙에 따라 질문이 문자열로 반환된다.

그럼 query를 dictionary_chain에 넣어서 변환된 질문을 받을 수 있다.

마지막으로 입력된 query를 dictionary_chain 을 통해 직장인을 거주자로 변경한다.
그 다음으로 변환된 질문을 RAG 인 qa_chain에 입력하여 최종 답변을 받으면 정확한 대답을 받을 수 있다.

여기서 추가적인 한계가 있는데, 대답이 실행할 때마다 약간씩 다르게 들어온다는 점이다.
이부분에 대해서는 이전에 포스팅했던 부분 중 Hallocination과 Ground Truth 점수가 낮다고 생각된다.
이를 위해 숙련도가 올라가면 모델을 변경하거나 아니면 2중 llm 등의 방식을 통해 변경해보려 한다.
