고갱

[인공지능] 졸업 작품 #5, LLM 한계점 극복 본문

인공지능/졸업작품

[인공지능] 졸업 작품 #5, LLM 한계점 극복

주인장 고갱 2025. 2. 5. 16:35

사실 지난 한 달간 많이 작업을 못했다.

외주도 맡고있기도 했고, 동시에 해외 여행도 있었고, 그 사이에 GPU 서버가 초기화된 탓도 있었다.

 

실제로 다시 시작한건 한 2주일 정도 되는 것 같은데, 그 사이에 좀 많이 정보를 찾아 헤맸다.

무엇을, 그리고 왜 정보를 찾았는지를 정리해보고자 한다.

 

⭐ 그래서 무엇을, 왜?

우선 내가 만드는 서비스는 법률 상담 서비스이다.

법률을 다루는 만큼 할루시네이션을 억제하는 것은 매우 중요한 사안이기도 하다.

 

그래서 이를 해결하기 위해서 여러가지 방법을 적용해보는 과정을 가지고 있다.

 

1. 우리나라의 법이 정적이지 않고, 수시로 개정되고, (즉 Finetuning을 하기에는 부적합할 수 있음.)
2. 할루시네이션을 억제하기 위해

 

위 두 가지 이유로 기존에는 LLMRAG를 연결하여 이를 수행하려고 하였다.

 

하지만 이번에 RAG를 이어서 수행하면서 문제가 발생하였다.

 

❗  어떤 문제?

검색기의 적절성 문제

 

내가 사용하는 임베딩 모델은 문맥 파악도 가능한 모델로 알려진 'BAAI/bge-m3' 이다.

그렇다면 이 모델은 정확하게 적절하게 사용이 될까?

 

정답은 그렇지 않다.

결국 임베딩 모델은 자연어를 벡터로 변환하는 작업만을 수행할 뿐, 스스로 판단할 수는 없다.

 

"홍길동씨는 2024년 12월 15일 A씨를 폭행하였다."
"홍길동씨는 2024년 12월 19일 A씨의 지갑을 훔쳐 달아났다."

 

위 문장과 같이 명시적으로 폭행이나, 의미적으로 절도인 경우에는 유사도로 알맞은 법률을 찾아낼 수 있지만,

만약 죄가 되지 않는 문장인 경우에는 어떨까?

 

"홍길동씨는 2024년 12월 15일 학교에서 커피를 마셨다."

 

위 문장을 토대로 검색기를 통해 검색을 하게되면 결과가 아래와 같이 나온다.

검색기 결과

 

이는 위에서 말했다시피 임베딩 모델은 자연어를 벡터로 변환하는 작업만을 수행할 뿐이기 때문에 이게 법적으로 문제가 되는지 안되는지는 판단할 수 없는 것이다.

 

그렇다면 이렇게 필요 없는 조항을 RAG를 통해 가져오고 이를 통해 LLM에 넘겨주게 되면 어떻게 될까?

 

RAG를 수행하는 시간이야 크게 소요되지는 않지만, 만약 가져오는 조항이 많다면 LLM에 넘어가는 쓸모없는 정보의 양이 많아진다. 이는 결국 성능이 저하될 수 있기 때문에 좋지 않은 상황이다.

 

그래서 이를 해결하기 위해 진짜 며칠을 고민하고 고민하다가 선택한 방법은 결국 파인튜닝 + HyDE 기법이였다.

물론, Full Finetuning을 하기에는 너무나도 긴 시간과 많은 자원이 소모되기에 LoRADoRA 등을 이용할 예정이다.

 

❓ HyDE? LoRA? DoRA? 

이는 LLM을 처음 접하는 나에게는 되게 생소한 기술이었다.

그래서 관련된 논문을 읽고 다양한 사례, 예제를 읽느라 상당히 오랜 기간이 소요되었다.

 

1. HyDE란 무엇? 그리고 어떻게 사용?

 

 

우선, 위에서 언급한 "검색기의 적절성 문제" 는 정말 머리가 아픈 문제다.

무턱대고 문장을 검색기에 넣으면 최종 결과가 원하지 않는 방향으로 나올 수 있기 때문이다.

그렇다고 수 천 가지의 법률을 순회하면서 이 법률과 연관성이 있냐고 LLM에 질의할 수도 없는 노릇이다.

 

그래서 이 문제를 고민하다가 찾아낸 기법이 HyDE 기법이다.

기존 작동 방식

 

우선 기존 작동 방식은 앞서 말한 바와 같이 위 그림처럼 적절하지 못하게 작동하고 있다.

예방 접종 후 학교를 가다가 실수로 사람을 밀쳐서 다치게 했다.

 

이 문장은 인간인 우리가 보기에는 "과실로 인해 다른 사람이 다쳤다." 라는 것을 판단할 수 있다.

더 나아가 전문가의 눈에서 바라본다면 보자마자 "과실치상" 이라는 죄까지 연상할 수 있을 것이다.

 

하지만 임베딩 모델이 그 점을 판단할 수 있을까?

아쉽게도 그렇지 않다.

 

임베딩 모델은 말 그대로 자연어를 기계가 알아들을 수 있게 벡터 형식으로 변환하는 역할이기 때문에, 정말 우리가 바라던 대로 작동하기에는 어려움이 있을 수 밖에 없다.

 

그렇다면 본래 주어진 문장에서 어떤 부분이 법적으로 문제가 되는지를 판별할 수 있어야 하는데, 어떻게 하면 좋을까?

이런 판별은 LLM이 잘하지 않을까?

그렇다면 LLM을 붙여서 먼저 검사를 하면 어떨까?

 

이와 같은 동작 방식을 바로 HyDE 기법 (Hypothetical Document Embeddings) 이라고 부른다.

 

쿼리가 들어오게 되면 먼저 LLM에서 이 문장을 토대로 가상의 한 문서를 생성하고, 이를 토대로 검색을 하는 것이다.

이렇게 되면 비록 LLM을 거치는 횟수가 늘어나기 때문에 수행 시간이 더욱 길어지겠지만, 정확도가 중요한 경우에는 수행 시간이 길어지는 것보다 정확도가 늘어나서 얻는 이점이 더 크다.

 

HyDE 적용 후 작동 방식

 

이를 알기 쉽게 그림으로 나타내면 위 그림과 같다.

하나씩 순서대로 풀이해보면 아래의 순서와 같다.

 

  1. 첫 번째 LLM이 사용자가 입력한 문장이 어떤 죄명과 연관성이 있을지 문서화한다.
  2. 생성된 가상의 문서를 토대로 RAG를 수행한다.
  3. RAG를 수행하여 관련성이 있는 모든 문서를 LLM에 전달한다.
  4. 정확한 법률 정보를 토대로 예상 처벌 수위를 나열한다.

이렇게 하면 기존의 RAG보다 다소 괜찮은 결과가 나올 수 있다.

 

❓ 그러면 첫 번째 LLM이 죄명을 낼 수 있으면 처벌 수위까지도 다 낼 수 있는거 아닐까?

누구나 할 법한 생각이고 좋은 접근이긴 하지만, 곰곰히 생각하면 그렇게 해서는 안되는 이유가 있다.

 

초 거대 언어 모델이나 아주 뛰어난 수준의 LLM, 또는 Full Finetuning을 거친 LLM이라면 그래도 괜찮은 편이다.

하지만 그렇게 하더라도 결국 할루시네이션이 일어나는 것을 원천적으로 막기는 힘들다.

 

DeepSeek V3 의 환각 현상 (R1도 동일)
DeepSeek V3의 환각 현상

 

근래에 성능이 좋아 말이 많았던 DeepSeek R1, V3 조차 형법상 과실치상죄가 268조라고 하였지만 실제로는 266조이다.

 

처벌 수위 역시 제266조(과실치사)의 경우 500만원 이하의 벌금, 구류 또는 과료이고 제268조라 해도 5년 이하의 금고 또는 2천만원 이하의 벌금이다. 처벌 수위도 할루시네이션 현상이 일어난 것이다.

 

또한 근로기준법에서도 제36조(임금의 지급) 이라고 답변하였지만 임금의 지급이라는 조항은 없고 실제로는 제36조는 '금품의 청산' 이며, 제23조(해고의 예고) 라고 하였지만 실제로는 제23조는 '해고 등의 제한' 이고 '해고의 예고' 는 제26조이다.

 

비교적 간단한 문장이었는데도 환각 현상이 빈번하게 발생하는데 더 복잡하게 들어갔을 때에는 어떨지 난감하다.

 

즉, RAG와 결합하는 것이 최대한 할루시네이션 현상을 줄이는 것에 도움이 되기 때문에 HyDE 기법을 사용하는 것이다.

 

 

2. LoRA란 무엇? 왜 사용?

 

이제 다음은 LoRA와 DoRA를 다뤄볼 차례이다.

우선 LoRA를 살펴보자.

 

💬 배경

좀 멀리 과거로 가보자면 그때 당시에는 LM을 만드는 것이 정말 대세였다.

점차 생성형 인공지능이 주목을 받기 시작하던 시기였고, 그렇기에 너도 나도 LM을 만들기 시작했다.

하지만 시간이 지남에 따라 점점 더 많은 파라미터를 넣은 더 큰 모델, 일명 LLM을 만들기 시작했다.

 

수억 개의 파라미터를 넣는 모델이 나오기 시작하자 이제는 LLM을 만들 수 있는 환경은 점차 어려워졌다. 그 만큼의 성능을 받쳐줄 수 있는 환경이라 해봤자 큰 기업이나 연구소 수준을 되야했기 때문이다.

 

그렇게 되자 사람들은 LLM을 만드는 것보다, 이미 만들어져 있는 LLM을 입맛대로 바꾸는, 일명 Finetuning에 눈을 들이게 된다. 하지만 이도 잠깐, 점차 시간이 지나 수억 개의 파라미터가 수십 억, 수백 억 파라미터에 달하자 점차 Finetuning에도 한계가 오게되고, 사람들은 다른 대안을 찾기 위하여 노력을 한다.

 

그러던 중 나온 방법이 바로 LoRA 이다.

 

우리가 여행을 갔다고 생각해보자.

전자 제품을 사용하려고 했는데 110V 전압을 사용하는 국가에서 우리가 가지고 있는 220V 전자 제품은 소용이 없다.

  1. 전자 제품을 분해 해서 110V 에서도 작동될 수 있게 할 것인가?
  2. 110V 전원 변환 어댑터같이 110V 전압을 220V 전압으로 바꿔주는 것을 사용할 것인가?

우리에겐 위 두 가지의 대안이 있고, 이 중 첫 번째가 바로 Full Finetuning, 두 번째가 바로 LoRA 같은 것이다.

(비유적으로 표현한 것이라 전공자의 눈에는 적절치 못한 부분이 있지만, 비전공자들을 위한 비유적 표현이므로 넘어가자.)

 

💻 원리

사실 LoRA 의 원리를 완전히 이해하기 위해서는 언어 모델의 원리와 구조에 대해서 잘 알아야 한다.

간략하게 다루자면 기존 모델의 Weight 값은 그대로 둔 상태에서 Adapter를 추가하는 것이라 보면 된다.

 

즉, 기존 모델의 Weight 값은 그대로이지만, LoRA 의 레이어를 더해주었기 때문에 추론 시에는 사용되는 Weight 값이 변하게 된다.

이미지 출처: 논문

 

이는 논문에 나온 이해를 돕기 위한 그림으로, 왼쪽의 파란 박스가 사전 훈련된 가중치 (Weight) 이고, 우측이 LoRA 의 Layer 들이다.

 

여기서 우측 아래의 A는 LoRA의 Layer의 첫 번째 레이어로, d * r 의 차원 크기를 지님.

(이 중 d가 본래 모델의 행렬 차원, r은 low-rank 차원으로 사용자가 설정한다.) 

 

우측 위의 B는 LoRA의 두 번째 레이어로, r * k 의 차원 크기를 지닌다.

(k는 본래 모델의 출력 차원, r은 low-rank 차원으로 사용자가 설정한다.)

 

이러한 구조 덕에 저차원 행렬 A와 B만 학습하면 되므로 파라미터 수가 크게 줄어든다는 원리이다.

 

 

그래서 이 LoRA를 왜 사용하냐고 묻는다면, 기존에 있는 판결문 데이터를 학습시키는 데 이용할 생각이다.

 

 

 

3. DoRA란 무엇? 왜 사용?

 

LoRA가 저비용으로 놀라운 효과를 이끌어 낼 수 있다는 점은 절대 무시하지 못한다.

 

하지만 LoRA는 결국 기존 모델보다는 특정 부분에 있어 더 나은 성능을 도출시킬 수 있겠지만, LoRA의 보정값이 제한되고 주어진 rank 차원에서만 학습이 가능하다는 점으로 인해 Full Finetuning 보다 더 낫다고 보기에는 힘들 수 있다.

 

이러한 LoRA의 한계점을 극복하기 위해 나온 방법이 바로 가중치 분해 LoRA, 즉 DoRA 이다.

LoRA와 DoRA의 성능 지표, 출처: NVIDIA 블로그

 

실제로 LoRA 보다 DoRA 가 상식 추론과 같은 부분에서는 성능 면에서 훨씬 크게, 그 외 분야에서도 차이를 보였다.

 

DoRA는 사전 학습된 Weight 값을 크기와 방향으로 분해하여 이를 Finetuning 하기 때문에 LoRA에 비해서 Trainable 파라미터 수가 많아 시간이 더 소요되기 때문에 일단 어떻게 할지 조금 더 고민 중에 있다.

 

이전에는 Finetuning은 안된다고 말했지만, 그것은 Full Finetuning에 한정된 이야기였고, 법률이 빠르게 개정되더라도 시행일까지는 시간이 남기 때문에 LoRA나 DoRA Finetuning 정도는 수행할 시간이 충분하기 때문이다.

 

사용 이유는 위에서 언급한 LoRA 사용 이유와 같다.

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

일단 지금은 Finetuning용 데이터셋을 구축하는데 초점을 맞추고 있다.

 

지금은 데이터셋을 크롤링으로 돌려놓고 기다리고 있는데, 계속 법률 서비스에서 비정상 트래픽으로 차단당해서 뭔가 이상해서 사이트 Network 오고가는 것을 지켜봤더니 클라이언트 단에서 지속적으로 서버로 신호를 보내는 것을 찾았다.

(사실 비정상 트래픽으로 차단했다는 말은 핑계이고 매크로나 봇임을 Javascript로 탐지하는 것 같았다.)

 

이를 토대로 기존에 크롤링 방식으로 하면 매크로인 것이 탐지되는 것 같아 Chrome Web driver + Selenium 기반의 크롤링 방식으로 바꾸니까 데이터를 잘 수집하기 시작했다.

 

아무리 무제한 열람인 사이트에 돈을 내고 사용하더라도 이렇게 하는 것은 도덕적으로는 옳지 않다고 보기 때문에, Finetuning 이후에는 데이터를 파기하려고 하고 있다.

(교수님께서 예전에 도움이 필요하면 말하라 하셔서 사이트 멤버십이나 법률 데이터 쪽에서 도움을 받고싶다고 연락드리니 도움을 못준다 하셔서 그냥 내 스스로 해결했다.)

 

아무튼 데이터셋 구축이 끝나면 본격적으로 다시 시작할 예정이다.

 

외주같이 다른 프로젝트도 진행해야 하기 때문에 Finetuning을 돌려놓고 기다리는 동안 다른 프로젝트를 진행하면 되지 않을까 하는 생각을 하고 있다.

 

🗣 여담

최근에 DeepSeek V3나 R1이 되게 좋다고 해서 직접 671b 모델을 돌려보았는데 조금만 손 보면 너무 잘 만들어질 것 같았다.

(학교 서버는 사양이 671b는 커녕 70b도 안돌아가는 수준이라 그냥 어떻게 어떻게 GPU를 빌려서 딱 4~5번 돌렸다.)

 

하지만 이 연구의 목적이 애초에 소형 모델로 뛰어난 정확도를 지니게 하는 것이 목적이기 때문에 그냥 그렇게 지나가는 해프닝이었다.

 

 

👍 참고 자료

LoRA 논문

Hu, E. J., Shen, Y., Wallis, P., Allen-Zhu, Z., Li, Y., Wang, S., Wang, L., & Chen, W. (2021). LoRA: Low-Rank Adaptation of Large Language Models. arXiv preprint arXiv:2106.09685. https://doi.org/10.48550/arXiv.2106.09685

 

LoRA: Low-Rank Adaptation of Large Language Models

An important paradigm of natural language processing consists of large-scale pre-training on general domain data and adaptation to particular tasks or domains. As we pre-train larger models, full fine-tuning, which retrains all model parameters, becomes le

arxiv.org

 

DoRA 논문

Liu, S., Wang, C.-Y., Yin, H., Molchanov, P., Wang, Y.-C. F., Cheng, K.-T., & Chen, M.-H. (2024). DoRA: Weight-Decomposed Low-Rank Adaptation. arXiv preprint arXiv:2402.09353. https://doi.org/10.48550/arXiv.2402.09353

 

DoRA: Weight-Decomposed Low-Rank Adaptation

Among the widely used parameter-efficient fine-tuning (PEFT) methods, LoRA and its variants have gained considerable popularity because of avoiding additional inference costs. However, there still often exists an accuracy gap between these methods and full

arxiv.org

 

DoRA 게시물 (NVIDIA)

 

파인 튜닝을 위한 LoRA의 강력한 대안, DoRA 살펴보기

전체 파인 튜닝(FT)은 일반적으로 특정 다운스트림 작업에 맞게 미리 학습된 일반 모델을 조정하는 데 사용됩니다. 학습 비용을 줄이기 위해 최소한의 파라미터로 사전 학습된 모델을 미세 튜닝

developer.nvidia.com