고갱

[인공지능] 졸업 작품 #3, LLM + RAG 본문

인공지능/졸업작품

[인공지능] 졸업 작품 #3, LLM + RAG

주인장 고갱 2024. 12. 22. 16:40

우리나라 법을 토대로 법률 상담 서비스를 졸업 작품으로 선정했던 지난 번에 이어서 오랜만에 진척 사항을 들고왔다.

시험기간이 길었던 탓에 1달만에 쓰게되었다.

 

🤔 주요 변경점?

크게는 LLM을 바꾸었다는 점이다.

기존에는 GPU가 없는 개인 맥미니 서버였기에 양자화 모델인

'MLP-KTLim/llama-3-Korean-Bllossom-8B-gguf-Q4_K_M'

를 선택하고 Ollama로 구동하였는데, 이젠 L4 4장 달린 서버에서 돌리기 때문에 다른 모델을 선정하고자 하였다.

(GPU가 생김에 따라 더 이상 양자화 모델을 사용하지 않아도 된다는 점 역시 매력으로 다가왔다.)

 

그리하여 사용하게 된 모델은 'CohereForAI/aya-expanse-8b' 모델이다.

테스트할때에는 32b 모델로 진행하였는데 성능이 상당히 개선된 모습을 볼 수 있었다.

다만 L4 4장으로는 32b 모델이 돌아가지 않아서 8b로 타협할 수 밖에 없었다.

(32b, 8b 모델 둘 다 상업적 목적으로 사용해서는 안된다는 이용 약관이 존재한다.)

 

기존에 사용했던 'MLP-KTLim/llama-3-Korean-Bllossom-8B-gguf-Q4_K_M' 모델에서는

감기에 걸렸는데 병원을 가지 않았다. 처벌이 어떻게 되나?

라는 질문에 대해서 아래와 같이 답변하는 아쉬운 결과였지만,

기존 모델의 답변 결과

 

이번에 사용한 모델에서는 아래와 같이 답변하는 모습을 보여주었다.

제79조의3(벌칙)에 따르면, 제41조제1항을 위반하여 입원치료를 받지 아니한 자는 1년 이하의 징역 또는 1천만원 이하의 벌금에 처할 수 있습니다. 그러나 감기는 일반적으로 입원치료가 필요한 질병이 아니므로, 이 조항이 바로 적용되지는 않을 가능성이 높습니다. 감기 증상이 심하거나 합병증이 발생하여 입원치료가 필요한 경우라면, 이 조항이 적용될 수 있습니다.
제79조의3에 따르면, **제41조제1항을 위반하여 입원치료를 받지 아니한 자**는 1년 이하의 징역 또는 1천만원 이하의 벌금에 처해질 수 있습니다. 감기는 일반적으로 가벼운 질병으로 인식되어 입원치료가 필요하지 않을 수 있지만, **감기 증상이 심하거나 합병증이 발생할 경우 입원치료가 필요할 수 있습니다.** 법적 처벌 여부는 감기 증상의 심각성과 의료진의 판단 기준에 따라 달라질 수 있으므로, **의료진의 진단과 처방에 따라 적절한 치료를 받는 것이 중요합니다.** **참고:** * 위 내용은 법률 자문이 아니며, 단지 제공된 문서에 근거한 정보입니다. * 구체적인 상황에 대한 법률적 조언은 변호사와 상담하시기 바랍니다.

 

상당히 답변의 수준이 높아진 것을 볼 수 있다.

(위가 32b, 아래가 8b의 모습이다.)

 

 

🤔 사소한 변경점

추가로 바뀐 점은 답변 생성 과정이다.

기존에는 이러한 LCEL을 invoke 해줌으로 답변을 생성해주었지만, 보다 나은 UX 향상을 위해서 Streaming으로 뽑아내게 하였다. 

LCEL이 무엇인지는 아래 링크를 참조하길 바란다.
 

LangChain Expression Language (LCEL) | 🦜️🔗 LangChain

* Runnable Interface

python.langchain.com

 

현재는 작은 양의 데이터만 넣어주고 있지만 추후에는 수 배에서 수 십배는 더 많은 양의 쿼리가 들어갈 수 있기 때문에 스트리밍 방식으로 작은 조각 단위로 처리해줄 필요가 있기 때문이다.

기존 코드
새로운 코드

Streaming으로 답변을 생성하는 모습

 

이렇게 하면 추후에 서비스를 구현할 때에도 실시간으로 처리해줄 수 있으니 UX 향상에 도움이 될 것이다.

 

 

❓  어떤 문제점?

1. 다른 조항 참조 문제

 

하지만 문제점도 아직 남아있다.

이전 게시물에서 언급했듯이 한 조항이 다른 조항을 참조하고자 하는 경우이다.

Metadata 만드는 모습

 

우선 현재는 "제N조" 라는 글자를 찾되, "의N" 이라는 표현도 부가적으로 찾는 정규식을 이용한다.

다시 말해, "제N조(의N)" 을 찾는 샘이다.

 

모든 표현을 찾고나서 첫 번째 요소는 해당 문서의 조항을 article_number으로 기록하게 되고, 그를 제외한 나머지 요소들을 참조 조항, references로 기록해준다.

 

단 "(의N)" 에 해당하는 내용이 없으면 1로 간주한다.

예를 들어

제82조의2: 82-2
제82조: 82-1

 

참조 조항을 기록할때에는 set로 한 번 캐스팅한 후 다시 list로 캐스팅하여 중복 요소를 제거하도록 하였다.

 

Metadata에 데이터가 들어간 모습

 

위와 같은 과정을 거치면 이런 식으로 참조 조항을 Dict 형식으로 뽑아내고 문서의 메타데이터로 넣어주게끔 된다.

이렇게 하면 해당 조항이 몇번 조항인지, 참조해야하는 문서가 어떤 문항인지 등을 확인할 수 있는 것이다.

(그 과정에서 메타데이터에 list 형식을 넣을 수 있게 filter_complex_metadata를 사용해야 한다.)

(아래에서 후술할 문제점과 연결됌)

 

이를 토대로 참조 문항을 가져오는 것을 구현하는 것을 목표로 했으나 아쉽게도 한 가지의 문제가 더 남아있다.

제76조의6(벌칙 적용에서 공무원 의제) 심의위원회 위원 중 공무원이 아닌 사람은 「형법」 제127조 및 제129조부터 제132조까지의 규정을 적용할 때에는 공무원으로 본다.
  [본조신설 2020. 3. 4.]
  [제76조의5에서 이동 <2024. 1. 23.>]
제82조(양벌규정) 법인의 대표자나 법인 또는 개인의 대리인, 사용인, 그 밖의 종업원이 그 법인 또는 개인의 업무에 관하여 제77조부터 제81조까지의 어느 하나에 해당하는 위반행위를 하면 그 행위자를 벌하는 외에 그 법인 또는 개인에게도 해당 조문의 벌금형을 과(科)한다. 다만, 법인 또는 개인이 그 위반행위를 방지하기 위하여 해당 업무에 관하여 상당한 주의와 감독을 게을리하지 아니한 경우에는 그러하지 아니하다.

 

위와 같이 '제N조부터 제N조' 라는 표현이 삽입되었을 때에는 범위로 모든 조항을 참조로 삼아야하는데,

아직 그에 대한 처리가 안되있는 실정이다.

Metadata의 references가 2개밖에 없는 모습

 

사진에 나와있듯이 77조81조만 참조로 여기는 모습이다.

 

이를 해결하기 위해 '부터' 라는 표현이 나오면 범위로 가져오는 방안을 생각하고 있지만 다른 법률을 넣었을 때에도 같은 표현이리라는 보장이 없기 때문에 고민인 상황이다.

 

물론 당장에는 해당 표현도 처리를 해줄 예정이긴 하다.

처리를 해주고 나서 다른 문서를 가져오는 시스템도 구현하지 않을까 싶다.

 

2. 메타 데이터의 복잡성

 

 

두 번째 문제는 Metadata 내부에 지원되는 타입이 한정된다는 문제점이다.

Document에 Json 형식으로 넣어주는 것까지는 문제가 없었다.

하지만 이를 Chroma 데이터베이스로 저장해줄 때에는 Metadata 에 저장할 수 있는 타입이 한정적이다.

ValueError: Expected metadata value to be a str, int, float or bool, got None which is a NoneType in upsert.

이런 문제가 발생을 하는데, 해석하면 볼 수 있듯이 메타데이터의 값은 str, int, float, bool 을 처리할 수 있는데, 다른 타입을 받았다는 오류이다.

여기서 None, NoneType에 초점을 두지 말자. 이는 정규식을 만족하지 않으면 "article_number" 필드를 None으로 만들어주게 했던 함수 설정때문에 그렇다.

 

ValueError: Expected metadata value to be a str, int, float or bool, got [] which is a list in upsert.

None이 아니여도 이런식으로 문제가 발생한다.

 

Try filtering complex metadata from the document using langchain_community.vectorstores.utils.filter_complex_metadata.

함수 설명

아무튼 기존에는 이를 해결하기 위해 위와 같은 오류 내용에서 뒤에있는 filter_complex_metadata 만 보고 사용했는데 자세히 읽고 보니 지원되지 않는 타입을 필터링 아웃한다는 말이 있는것을 보고 해결 방법이 아니였음을 뒤늦게 알았다.

 

어쩐지 문서를 읽어올때 메타데이터가 누락되는 현상이 있었다.

 

이것도 더 생각해보고 어떻게 해결해야할지 신중하게 접근하고자 한다.

 

 

 

❗ 앞으로 무엇을 해야할까?

위에서 언급한 부분을 처리하고 결과를 다시 지켜봐야한다.

 

[인공지능] 졸업 작품 #2, LLM + RAG

 

gogang0704.tistory.com

위 게시물의 "❗ 앞으로 무엇을 해야할까?" 부분을 확인해보면 나오는 질문 "질병관리청장의 허가를 받지 않고 고위험병원체를 국내로 반입하였다. 처벌이 어떻게 되나?" 과 겹치는 부분이다.

 

이전 처리 결과
새로운 답변, 보다 정확하고 확실한 답변

 

이전에는 첫 번째 사진과 같이 에매모호한 문장을 생성했지만, 이제는 "구체적인 처벌 수위에 대해서는 관련 법률이나 질병관리청의 지침에 명시되어 있지 않습니다." 와 같이 제공된 문서가 없다고 말해주는 정도의 진척 사항이 있긴 하지만, 근본적인 해결은 아니기 때문에 이를 해결하고자 한다.

 

😕 부차적인 할 일

고민해봐야 할 점도 있었다.

제79조의3에 따르면, **제41조제1항을 위반하여 입원치료를 받지 아니한 자**는 1년 이하의 징역 또는 1천만원 이하의 벌금에 처해질 수 있습니다. 감기는 일반적으로 가벼운 질병으로 인식되어 입원치료가 필요하지 않을 수 있지만, **감기 증상이 심하거나 합병증이 발생할 경우 입원치료가 필요할 수 있습니다.** 법적 처벌 여부는 감기 증상의 심각성과 의료진의 판단 기준에 따라 달라질 수 있으므로, **의료진의 진단과 처방에 따라 적절한 치료를 받는 것이 중요합니다.** **참고:** * 위 내용은 법률 자문이 아니며, 단지 제공된 문서에 근거한 정보입니다. * 구체적인 상황에 대한 법률적 조언은 변호사와 상담하시기 바랍니다.

 

위에서 언급했던 이와 같은 답변에서 다소 아쉬웠던 점은 단순 감기는 전염병이나 심각한 병이 아님에도 불구하고 처벌 수위를 말해주는 모습이다.

RAG 를 수행하고 이를 넘겨주기 때문에 이를 토대로한 답변이 생성됨에 따라 이러한 현상이 나타난다고 유추하고 있다.

너무 제공된 문서를 억지로 끼워 맞추려는 이러한 현상을 방지하기 위해 프롬프트 엔지니어링이 어느정도 필요해보인다.

 

이제 본 게시물에 언급한 문제점을 해결하고 다시 물어본 결과가 기대될 따름이다.

 

이제 짐 정리랑 본가 이동으로 인해 다시 바빠지는데, 요새 계속 바쁘기만 해서 시간이 별로 안난다는 점이 조금 스스로도 안타깝게 생각한다. 그래도 시간이 나는대로 꼭 이어서 해야겠다.

날이 추운데 다들 감기 조심하세요!

 

 

👍 참고 자료

임베딩 모델

 

BAAI/bge-m3 · Hugging Face

For more details please refer to our github repo: https://github.com/FlagOpen/FlagEmbedding In this project, we introduce BGE-M3, which is distinguished for its versatility in Multi-Functionality, Multi-Linguality, and Multi-Granularity. Multi-Functionalit

huggingface.co

 

LLM (8b)

 

CohereForAI/aya-expanse-8b · Hugging Face

This repository is publicly accessible, but you have to accept the conditions to access its files and content. By submitting this form, you agree to the License Agreement and acknowledge that the information you provide will be collected, used, and shared

huggingface.co

 

LLM (32b)

 

CohereForAI/aya-expanse-32b · Hugging Face

This repository is publicly accessible, but you have to accept the conditions to access its files and content. By submitting this form, you agree to the License Agreement and acknowledge that the information you provide will be collected, used, and shared

huggingface.co

 

RAG에 사용된 데이터

 

감염병의 예방 및 관리에 관한 법률

 

www.law.go.kr