본문 바로가기
📚도서 공부/LangChain으로 구현하는 LLM

4-1(자동 팩트 체크) Langchain 비서 구축

by Majestyblue 2024. 4. 19.

LLM의 환각은 생성된 텍스트가 입력과 비교했을 때 충실하지 않거나 무의미한 것을 나타낸다. 환각에 대처하는 한 가지 기술은 자동 팩트 체크이다. 이는 LLM이 외부 소스의 증거에 대해 제시한 증거를 확인하는 것이다. 이를 통해 부정확하거나 검증되지 않는 진술을 감지할 수 있다.

 

사실 확인은 주로 세 단계로 이루어진다.

  1. 주장 감지: 검증이 필요한 부분 식별
  2. 증거 검색: 주장을 지지하거나 반박하는 소스 찾기
  3. 판결 예측(verdic prediction): 증거를 기반으로 주장의 진위 평가

마지막 두 단계는 정당성 생성(justification production)과 판결 예측이라는 용어로도 부른다.

 

사전 훈련된 LLM에는 프롬프트를 통해 얻을 수 있는 광범위한 세계 지식이 포함되어 있다. 지식 베이스, 위키피디아, 교과서, 말뭉치에서 증거를 찾을 수 있다. 주장을 데이터에 기반으로 한 팩트 체크를 통해 LLM을 더 신뢰할 수 있다. 또한 사전 훈련된 LLM에는 훈련 데이터에서 얻은 광범위한 세계 지식이 포함되어 있다.

 

LLM에 가리기 등 다른 기술을 사용해 사실을 검색하도록 할 수 있다. 예를 들어 “Microsoft의 본사는 어디에 있니?”라는 질문에 답하기 위해 질문을 “Microsoft의 본사는 [MASK]에 있다”로 다시 작성하고 이를 언어 모델에 입력해 답을 얻을 수 있다.

 

또는 외부 도구를 통합해 지식 베이스, 위키피디아, 교과서 및 기타 말뭉치를 검색할 수 있다. 핵심 아이디어는 환각된 주장을 사실적인 데이터 소스에 기반해 검증하는 것이다.

 

LangChain에서는 문장 연결을 사용한 팩트 체크를 위한 체인 사용이 가능하며, 여기에는 모델이 주장에 들어간 가정을 적극적으로 의심하는 것이 포함된다. 이 자가 확인(self-checking) 체인인 LLMCheckerChain에서 모델은 순차적으로 프롬프트를 받게 되는데, 먼저 가정을 명시화하도록 유도되며 다음과 같이 보인다.

Here's statement: {statement} 
Make a bullet point list of the assumptions you made when producing the above statement.

다음 설명: {statement} 
위의 문장을 작성할 때 당신이 한 가정을 요약한 목록을 작성합니다.

 

 

이것은 문자열 템플릿으로서, 중괄호 안의 요소가 변수로 대체된다. 다음으로 이러한 가정은 다음과 같은 프롬프트로 모델에게 다시 전달돼 한 번에 하나씩 확인된다.

Here is a bullet point list of assertion:
{assertions}
For each assertion, determine whether it is true or false. If it is false, explain why.

다음은 주장의 요점 목록입니다:
{assertions}
각 주장에 대해 참인지 거짓인지 판단하십시오. 거짓이면 그 이유를 설명하십시오.

 

 

마지막으로, 모델은 최종 판단을 내리도록 지시받는다.

In light of the above facts, how would you answer the question 
'{question}'

위와 같은 사실에 비추어 볼 때, 그 질문에 대하여 어떻게 답할 것인가
'{질문}'

 

 

LLMCheckerChain은 이 모든 과정을 자동으로 수행한다.

아래의 입력에 대해 LLMCheckerChain을 사용하지 않았을 때와 사용하였을 때 답변을 비교해 보자.

from langchain.llms import GPT4All
model = "E:\\GPT4ALL\\Download Models\\mistral-7b-instruct-v0.2.Q4_0.gguf"
llm = GPT4All(model=model)
text = "What type of mammal lays the bggest eggs?"
# "어떤 종류의 포유동물이 가장 큰 알을 낳을까요?"
response = llm(text)
print(response)
<출력결과>
The platypus is a unique mammal that lays eggs. Platypuses are monotremes, 
which means they are one of only five species of mammals that lay eggs instead of giving 
birth to live young. The platypus's egg is not particularly large compared to other animals 
that lay eggs, such as birds or reptiles. An average platypus egg measures about 
10 centimeters (3.9 inches) long and 6 centimeters (2.4 inches) wide. However, 
if we compare the size of a platypus egg to its body size, it is relatively larger than 
an elephant's egg would be in relation to its body size. An adult platypus measures around 
1.8 meters (5.9 feet) long and weighs between 2-3 kilograms (4.4-6.6 pounds). 
If we were to calculate the relative size of a platypus egg based on an elephant's much 
larger body, it would be enormous! But in reality, platypus eggs are not that big compared to 
other types of eggs.

오리너구리는 알을 낳는 독특한 포유동물입니다. 오리너구리는 단일체인데, 이것은 그들이 살아있는 
아기를 낳는 대신 알을 낳는 단 다섯 종의 포유동물 중 하나라는 것을 의미합니다. 
오리너구리의 알은 새나 파충류와 같이 알을 낳는 다른 동물들에 비해 특별히 크지 않습니다. 
평균적인 오리너구리 알은 길이가 약 10 센티미터고 너비가 약 6 센티미터입니다. 하지만, 
만약 우리가 오리너구리 알의 크기를 몸의 크기와 비교한다면, 그것은 코끼리의 알보다 
상대적으로 더 큽니다. 다 자란 오리너구리는 길이가 약 1.8 미터이고 무게가 2-3 킬로그램 
(4.4-6.6 파운드)입니다. 만약 우리가 코끼리의 훨씬 더 큰 몸을 바탕으로 오리너구리 알의 
상대적인 크기를 계산한다면, 그것은 엄청날 것입니다! 하지만 실제로, 오리너구리 알은 다른 종류의 
알들과 비교해 볼 때 그렇게 크지 않습니다.

코끼리의 알보다 크다는 언급이 있다. 확실히 잘못 되었다.

 

 

LLMCheckerChain을 사용하였을 때 다음과 같다.

from langchain.chains import LLMCheckerChain

checker_chain = LLMCheckerChain.from_llm(llm, verbose=True)
checker_chain.run(text)
<출력결과>
> Entering new LLMCheckerChain chain...

> Entering new SequentialChain chain...

> Finished chain.

> Finished chain.
' None of the five monotreme species (platypuses, echidnas, etc.) lay the biggest eggs 
among all mammals. Mammals do not lay eggs; they give birth to live young. The largest eggs 
are actually laid by birds and some reptiles.'

' 다섯 종의 단공류 종 (오리너구리, 가시두더지 등) 중 어느 것도 모든 포유류 중에서 가장 
큰 알을 낳지 않습니다. 포유류는 알을 낳지 않습니다; 그들은 어린 나이에 삽니다.
가장 큰 알은 사실 새들과 몇몇 파충류들에 의해 낳습니다.'

우와… 실제로 검색해 보니 단공류는 오리너구리 1종, 가시두더지 4종, 총 5종이라고 한다.

 

 

device를 gpu로 변환해 보았다. 속도도 훨씬 빠르고 답변도 자연스럽고 구체적인 것 같다.

(rtx 3060 12GB 사용중이다.)

llm = GPT4All(model=model, device='gpu')
text = "What type of mammal lays the bggest eggs?"
checker_chain = LLMCheckerChain.from_llm(llm, verbose=True)
checker_chain.run(text)
<출력결과>
' It is important to note that monotremes (mammals that lay eggs) are quite rare in comparison 
to other mammals. Among them, platypuses have the largest known egg size relative to their
body size. However, if we consider absolute sizes of eggs from non-monotreme animals, 
for instance, an elephant does not lay eggs at all but gives birth to a large baby elephant 
instead. Therefore, no mammal lays the biggest egg in terms of absolute size as they do not 
follow this reproductive method. Instead, platypuses hold the record for having the largest 
egg relative to their body size among mammals that do lay eggs.'

' 주목할 점은 모노트렘(알을 낳는 포유류)은 다른 포유류에 비해 매우 희귀하다는 것입니다. 
그 중에서 오리너구리는 몸의 크기에 비해 알의 크기가 가장 큰 것으로 알려져 있습니다. 
하지만 예를 들어, 단생동물이 아닌 동물의 알의 절대적인 크기를 고려하면, 코끼리는 아예 알을 
낳지 않고 큰 아기 코끼리를 낳습니다. 따라서 이러한 번식 방법을 따르지 않기 때문에 절대적인 
크기로 가장 큰 알을 낳는 포유류는 없습니다. 대신 오리너구리는 알을 낳는 포유류 중에서 몸의 
크기에 비해 가장 큰 알을 낳는 기록을 가지고 있습니다.'

 

모델별로 질문별로 조금씩 다른 결과를 반환할 수 있으며 그 중 일부는 틀릴 수도, 올바른 식별일 수도 있다. 따라서 이 기술은 정확한 답변을 보장하지 않지만 일부 잘못된 결과를 방지할 수 있다.

팩트 체크 접근법은 주장을 더 작고 확인 가능한 쿼리로 분해하는 것을 포함하며 이는 주로 질문 응답 작업으로 구성될 수 있다. 여러가지 검색 엔진도 주장의 진실을 정확하게 포착하기 위해 주제와 근거에 관련된 내용을 검색할 수 있다.