728x90
반응형

LLM 생성을 위한 텍스트 임베딩 검색의 단점 탐색

추상적인

외부 지식은 환각, 오래된 지식 등 LLM의 문제를 해결하는 열쇠이며, 이를 통해 LLM은 Retrieval-Augmented Generation(RAG)을 통해 보다 정확하고 신뢰할 수 있는 응답을 생성할 수 있어요. 하지만 LLM이 항상 예상대로 응답할 수는 없죠. 실제 사례를 분석함으로써 이 문서에서는 우려 사항의 여러 범주와 이러한 제한 사항이 나타나 LLM 생성 콘텐츠의 부정확성을 초래하는 사례를 보여줍니다.

배경

영화 그래프

Machine Learning 및 Large Language Model 초보자가 이를 쉽게 이해할 수 있도록 Neo4j에 저장된 영화 그래프를 사용하여 개념을 살펴볼게요.

아래 블로그 게시물에는 Movie Graph에 대한 더 완전한 지침과 Node 및 패턴에 대한 텍스트 임베딩을 생성하고 저장하는 방법이 나와 있어요. 주어진 질문에 대해 가장 유사한 텍스트를 검색합니다.

지식 그래프의 미래: 구조적 검색과 Semantic Search가 하나로 통합될 것인가?

경량 RAG 솔루션

다시 말하지만, LangChain 및 LlamaIndex와 같은 LLM/RAG 프레임워크의 학습 곡선을 더욱 줄이기 위해 Neo4j Graph Database Management System에서 제공하는 Cypher 및 APOC 절차만 사용하려 해요.

이전 게시물에서 RAG 애플리케이션 구축을 위한 이 경량 접근 방식에 대한 자세한 내용을 확인할 수 있습니다.

Neo4j를 사용하여 경량 RAG 애플리케이션 구축

LLM 모델

다음 테스트는 gpt-4–0613을 사용하여 수행되었는데, 가장 최근이자 가장 발전된 LLM이에요. 텍스트 임베딩 모델의 경우, 텍스트 임베딩-ada-002가 지식 내용과 질문 모두에 사용되었어요.

Query 결과의 예

모든 영화가 출연했어요(참조: 톰 행크스 영화):

╒════════════════════════╤══════════╕
│m.title                 │m.released│
╞════════════════════════╪══════════╡
│"Joe Versus the Volcano"│1990      │
├────────────────────────┼──────────┤
│"A League of Their Own" │1992      │
├────────────────────────┼──────────┤
│"Sleepless in Seattle"  │1993      │
├────────────────────────┼──────────┤
│"Apollo 13"             │1995      │
├────────────────────────┼──────────┤
│"That Thing You Do"     │1996      │
├────────────────────────┼──────────┤
│"You've Got Mail"       │1998      │
├────────────────────────┼──────────┤
│"The Green Mile"        │1999      │
├────────────────────────┼──────────┤
│"Cast Away"             │2000      │
├────────────────────────┼──────────┤
│"The Polar Express"     │2004      │
├────────────────────────┼──────────┤
│"The Da Vinci Code"     │2006      │
├────────────────────────┼──────────┤
│"Charlie Wilson's War"  │2007      │
├────────────────────────┼──────────┤
│"Cloud Atlas"           │2012      │
└────────────────────────┴──────────┘

그가 출연한 모든 영화 (이하 톰 크루즈 영화):


╒════════════════╤══════════╕
│m.title         │m.released│
╞════════════════╪══════════╡
│"Top Gun"       │1986      │
├────────────────┼──────────┤
│"A Few Good Men"│1992      │
├────────────────┼──────────┤
│"Jerry Maguire" │2000      │
└────────────────┴──────────┘

유사성이 결정되는 방식

Vector Search가 어떻게 작동하는지 알아보기 위해 간단한 질문부터 시작해 볼게요.

톰 행크스는 누구인가요?

여기는 Cypher를 사용해서 Neo4j의 vector index를 통해 텍스트 embedding 검색을 사용하여 답변을 생성하는 부분이에요. 충분한 콘텐츠를 검색하기 위해 top_k = 200을 사용해서 반환된 최상위 매칭 embeddings에 대해 검색을 수행하죠.

:param question=>'Who is Tom Hanks?';
:param top_k=>200;

// 1. Get text embedding for the question
CALL apoc.ml.openai.embedding([$question],NULL , {}) 
YIELD index, text, embedding 
// 2. Search for similar embeddings via vector index
WITH text, embedding
CALL db.index.vector.queryNodes($vector_index, $top_k, embedding) YIELD node, score
WITH node, score
RETURN $question, node.text AS context, score;

텍스트 embedding similarity search 결과는 다음과 같아요:

╒═══════════════════╤══════════════════════════════════════════════════════════════════════╤══════════════════╕
│$question          │context                                                               │score             │
╞═══════════════════╪══════════════════════════════════════════════════════════════════════╪══════════════════╡
│"Who is Tom Hanks?"│"Person  name Tom Hanks born 1956 "                                   │0.955516517162323 │
├───────────────────┼──────────────────────────────────────────────────────────────────────┼──────────────────┤
│"Who is Tom Hanks?"│"Person [Tom Hanks] ACTED_IN Movie [You've Got Mail]"                 │0.9315997362136841│
├───────────────────┼──────────────────────────────────────────────────────────────────────┼──────────────────┤
│"Who is Tom Hanks?"│"Person [Tom Hanks] ACTED_IN Movie [That Thing You Do]"               │0.9315773248672485│
├───────────────────┼──────────────────────────────────────────────────────────────────────┼──────────────────┤
│"Who is Tom Hanks?"│"Person [Tom Hanks] ACTED_IN Movie [Cast Away]"                       │0.9312677383422852│
├───────────────────┼──────────────────────────────────────────────────────────────────────┼──────────────────┤
│"Who is Tom Hanks?"│"Person [Tom Hanks] ACTED_IN Movie [Apollo 13]"                       │0.9302988052368164│
├───────────────────┼──────────────────────────────────────────────────────────────────────┼──────────────────┤
│"Who is Tom Hanks?"│"Person [Tom Hanks] DIRECTED Movie [That Thing You Do]"               │0.9302213788032532│
├───────────────────┼──────────────────────────────────────────────────────────────────────┼──────────────────┤
│"Who is Tom Hanks?"│"Person [Tom Hanks] ACTED_IN Movie [A League of Their Own]"           │0.9287475347518921│
├───────────────────┼──────────────────────────────────────────────────────────────────────┼──────────────────┤
│"Who is Tom Hanks?"│"Person [Tom Hanks] ACTED_IN Movie [The Polar Express]"               │0.9279540181159973│
├───────────────────┼──────────────────────────────────────────────────────────────────────┼──────────────────┤
... ... (192 more rows to follow) 

텍스트 삽입 검색은 Person node를 잘 찾아주는 것 같아요.

여기서 흥미로운 점은 "Person [Tom Hanks] DIRECTED Movie [That Thing You Do]" 행인데, 출연한 영화에 대한 행보다 약간 더 높은 유사성 점수를 가지고 있다는 거예요. 왜 그럴까요? 제 생각에는 사전 학습 단계에서 사용된 데이터에서 이 감독의 영화에 대한 언급이 더 많았기 때문인 것 같아요. 그렇지만 이게 답변을 크게 바꾸지는 않으니 다음으로 넘어가도록 하죠.

Tom Hanks와 관련된 모든 레코드가 나열되면, 그와 관련된 레코드(유사성 점수 > 0.91)가 나오네요. 처음 4개는 이름에 Tom이 들어가서 어느 정도 이해가 되죠.

그런데 "Person name Bill Paxton born 1955"라는 행은 톰 행크스와는 전혀 관련이 없는 것 같아서 언뜻 보기에는 조금 이상했어요. 목록을 계속 내려가다 보면 사실 <영화의 또 다른 배우>라는 것을 알 수 있어요 (Apollo 13의 공동 배우).

... ... (14 records upfront) 

│"Who is Tom Hanks?"│"Person  name Tom Cruise born 1962 "                                  │0.9114127159118652│
├───────────────────┼──────────────────────────────────────────────────────────────────────┼──────────────────┤
│"Who is Tom Hanks?"│"Person  name Tom Skerritt born 1933 "                                │0.910643458366394 │
├───────────────────┼──────────────────────────────────────────────────────────────────────┼──────────────────┤
│"Who is Tom Hanks?"│"Person  name Tom Tykwer born 1965 "                                  │0.9104374647140503│
├───────────────────┼──────────────────────────────────────────────────────────────────────┼──────────────────┤
│"Who is Tom Hanks?"│"Person [Tom Cruise] ACTED_IN Movie [A Few Good Men]"                 │0.902335524559021 │
├───────────────────┼──────────────────────────────────────────────────────────────────────┼──────────────────┤
│"Who is Tom Hanks?"│"Person  name Bill Paxton born 1955 "                                 │0.9013911485671997│
├───────────────────┼──────────────────────────────────────────────────────────────────────┼──────────────────┤
│"Who is Tom Hanks?"│"Person [Meg Ryan] ACTED_IN Movie [You've Got Mail]"                  │0.9006932973861694│

분명히 이건 gpt-4가 사전 훈련 과정에서 방대한 데이터로부터 배운 내용일 거예요. 아폴로 13호는 꽤 중요한 영화이고, 공동 배우도 마찬가지고요. 이건 상식/공공 지식 영역에서 이미 충분한 지식을 갖고 있는 LLM 기반의 Semantic Search의 위력이기도 하죠.

생성 결과

검색과 생성을 결합하는 Cypher 쿼리는 다음과 같아요. 또한 향후 평가를 위해 질문과 일치하는 Vector Embedding `NODE` ID를 생성된 답변과 함께 Graph Database에 저장했어요.

// 1. Get text embedding for the question
CALL apoc.ml.openai.embedding([$question],NULL , {}) 
YIELD index, text, embedding 
// 2. Search for similar embeddings via vector index
WITH text, embedding
CALL db.index.vector.queryNodes($vector_index, $top_k, embedding) YIELD node, score
// 3. Retrieve text
WITH node, score
WITH collect(node.text) AS sentences, collect(id(node)) AS nodeIds, collect(score) AS scores
CREATE (q:Question) SET q.text = $question, q.ids = nodeIds, q.scores = scores
// 4. Prepare context by concatenating texts
WITH q, sentences
WITH reduce(text='', x IN sentences | text + x + 'n') + 'n----n' AS context, q
// 5. Let LLM generate answers for the prompt
WITH "You are a customer service agent that helps a customer with answering questions about movies. Use the following context to answer the question at the end. Make sure not to make any changes to the context if possible when prepare answers so as to provide accuate responses. If the answer can't be found in context, just say that I don't know, don't try to make up an answer.nn----Contextn"
  AS system_message,
  "n----nQuestion:" AS user_message, context, q
CALL apoc.ml.openai.chat([
      {role:"system", content:system_message + context},
      {role:"user", content:$question}
    ], NULL, {model:'gpt-4'}) YIELD value
WITH q, context, value
SET q.answer = value.choices[0].message.content, q.created = value.created, q.finish_reason = value.choices[0].finish_reason
RETURN $question, context, value;

gpt-4는 검색된 컨텍스트를 사용해서 아래 답변을 생성했네요.

톰 행크스는 1956년생으로 'You've Got Mail', 'That Thing You Do', 'Cast Away', 'Apollo 13', 'A League of their Own', 'The Polar Express', 'Joe Versus the Volcano', 'Cloud Atlas', 'Sleepless in Seattle', 'Charlie Wilson's War', 'The Green Mile' 등 여러 영화에 출연했습니다. 그는 또한 영화 '당신이 하는 일'을 감독했습니다.

솔직히 말씀드리면, 정답은... 꽤 정확해요. 요약도 잘 되어 있고 개인 정보, 주연 영화, 감독 영화에서 얻은 지식을 다루고 있어서 완전하다고 볼 수 있죠.

관련 없는 소음

위의 샘플에서 검색 프로세스는 필연적으로 관련성이 낮은 콘텐츠를 많이 가져올 수밖에 없다는 걸 알 수 있을 거예요. 결과적으로 LLM이 정확한 답변을 생성하려면 강력한 소음 견고성이 필요하죠.

노이즈 견고성은 모델이 노이즈가 있는 문서에서 유용한 정보를 추출할 수 있다는 의미에요. 여기서 노이즈 문서는 질문과 관련은 있지만 답변 정보가 전혀 포함되지 않은 콘텐츠를 말해요. 위 샘플의 경우 노이즈가 있는 레코드는 14행 이후부터 200행까지의 레코드인데, 이는 top_k에 의해 제한되죠. 무려 92% 이상이에요!

하지만 그래프 속 레코드가 몇 개나 관련되어 있는지에 대한 사전 지식이 없기 때문에 Fine-tuning은 top_k를 실행 가능한 접근 방식으로 만들지 못할 거예요. 문서의 청크 크기를 조정하는 것도 마찬가지고요.

불행히도, 노이즈가 있는 내용이 있을 때 GPT-4가 항상 올바르게 작동하는 건 아니에요. 다른 질문을 테스트해 볼게요.

1995년 이전에 톰 행크스는 몇 편의 영화에 출연했으며, 그 영화는 무엇인가요?

연결 후 검색된 컨텍스트:

"Person  name Tom Hanks born 1956 
Person [Tom Hanks] ACTED_IN Movie [That Thing You Do]
Person [Tom Hanks] ACTED_IN Movie [A League of Their Own]
Person [Tom Hanks] ACTED_IN Movie [You've Got Mail]
Person [Tom Hanks] ACTED_IN Movie [Sleepless in Seattle]
... ... ... ...
(row #93)
Movie  title Sleepless in Seattle tagline What if someone you never met, someone you never saw, someone you never knew was the only someone for you? released 1993 
... ... ... ...
(row #162)
Movie  title A League of Their Own tagline Once in a lifetime you get a chance to do something different. released 1992 
... ... ... ... 
(200 rows in total)

생성된 답변:

문맥상 톰 행크스가 출연한 모든 영화에 대한 구체적인 개봉 날짜가 나와 있지 않아요. 따라서 1995년 이전에 그가 출연한 영화가 무엇인지 정확하게 판단할 수 없어요.

정답: 위의 TOM-HANKS-MOVIES를 확인해 보세요. 영화가 3개 이상 있어야 해요.

╒════════════════════════╤══════════╕
│m.title                 │m.released│
╞════════════════════════╪══════════╡
│"Joe Versus the Volcano"│1990      │
├────────────────────────┼──────────┤
│"A League of Their Own" │1992      │
├────────────────────────┼──────────┤
│"Sleepless in Seattle"  │1993      │
├────────────────────────┼──────────┤

GPT-4가 컨텍스트 중간에 뭐가 있는지 잊어버린 것 같아요. 이와 관련된 논문 ()에서 소위 Lost in the Middle 현상을 다루고 있는데, 꽤 흥미로운 정보를 얻을 수 있을 거예요.

간단한 수학 추론

LLM은 일반적으로 논리적 추론에서는 좋은 결과를 보여주지만, 간단한 수학 관련 문제에서는 형편없는 경우가 많아요.

질문:

2000년 이전에 톰 행크스는 몇 편의 영화에 출연했으며, 그 영화는 무엇인가요?

생성된 답변:

Tom Hanks는 2000년 이전에 9편의 영화에 출연했어요. 여기에는 'That Thing You Do', 'A League of their Own', 'You've Got Mail', 'Sleepless in Seattle', 'Joe Versus the Volcano', 'Apollo 13', 'The Green Mile', 'The Polar Express', 'The Da Vinci Code'가 있어요.

'The Da Vinci Code'는 2004년에 출시되었으므로 답변에 포함되면 안 되겠죠.

정보 통합

정보 통합은 모델이 여러 문서의 정보를 통합해야 하는 복잡한 질문에 답할 수 있는지 평가하는 거예요. Retrieval-Augmented Generation(RAG)의 경우, 문제는 검색 프로세스에서 나타나요. 즉, 검색된 콘텐츠가 얼마나 충분한지 확인하는 과정에서 문제가 생기는 거죠. 생성 단계에서도 문제가 발생할 수 있고요.

질문:

40~50세에 톰 행크스와 톰 크루즈가 출연한 영화는 무엇인가요?

생성된 답변:

톰 행크스는 1956년생이니 40~50세는 1996–2006년이 되겠네요. 이 기간 동안 그는 'That Thing You Do', '라이언 일병 구하기', '찰리 윌슨의 전쟁', '다빈치 코드', '유브 갓 메일', '캐스트 어웨이', '클라우드 아틀라스', '그린 마일', '폴라 익스프레스' 등의 영화에 출연했어요.

톰 크루즈는 1962년생이므로 40~50세라면 2002~2012년이 되죠. 하지만 제공된 맥락에 따르면 이 기간 동안 톰 크루즈가 출연한 영화는 나열되어 있지 않아요.

답변은 거의 정확한 결과를 제공했을 뿐만 아니라 결과를 얻기 위한 논리적인 단계도 제시했어요. 정말 놀랍죠! 하지만 '클라우드 아틀라스'는 2012년에 출시되었으므로 답변에 포함되면 안 돼요. LLM이 자체 추론에 대해 생성된 답변을 검증할 수 있는 방법이 필요하겠어요.

부정적 거부

부정적 거부란 검색된 컨텍스트에 필요한 지식이 없을 때 LLM이 질문에 대한 답변을 거부해야 한다는 의미에요. LLM은 "정보 부족" 또는 기타 거부 신호를 나타낼 것으로 예상되죠. RAG 구현을 위해 일반적으로 을 에 추가하는데, 예를 들면 이런 식이에요.

당신은 고객이 영화에 대한 질문에 답변하도록 돕는 고객 서비스 상담원입니다. 마지막 질문에 답하려면 다음 컨텍스트를 사용하세요. 답변을 작성할 때에는 가능한 한 문맥을 변경하지 않도록 하여 정확한 답변을 제공하시기 바랍니다.문맥상 답변을 찾을 수 없는 경우 모른다고 말씀해 주세요. 답을 만들어내려고 하지 마세요.

질문:

톰 행크스가 영화 반지의 제왕을 감독한 해는 언제입니까?

생성된 답변:

모르겠습니다.

이는 위 지침의 내용과 일치하네요.

상충되는 지식 감지

LLM(Large Language Model)에서 충돌하는 지식 검색은 답변 생성을 위해 주어진 컨텍스트 내에서 모순되는 정보가 발견되는 인스턴스를 식별하고 처리하는 모델의 능력을 나타내요. 효과적인 상충되는 지식 감지를 통해 LLM은 이러한 불일치를 인식하고 가장 신뢰할 수 있는 정보를 선택하거나, 다양한 관점을 제공하거나, 응답을 생성할 때 상충을 인정할 수 있어요. 이는 LLM에서 제공하는 정보의 정확성과 신뢰성에 기여하죠.

나에게검색된 컨텍스트의 시작 부분에 충돌하는 텍스트 조각:

"Person [Tom Hanks] did not DIRECT Movie [That Thing You Do] 
Person [Tom Hanks] DIRECTED Movie [That Thing You Do]
Person [Tom Hanks] ACTED_IN Movie [You've Got Mail]
Person [Tom Hanks] ACTED_IN Movie [A League of Their Own]
Person [Tom Hanks] ACTED_IN Movie [That Thing You Do]
... ... (196 more rows to come)

질문:

톰행크스가 감독한 영화는 무엇인가요?

생성된 답변:

톰 행크스 감독의 영화는 'That Thing You Do'입니다.

상충되는 텍스트를 어디에 삽입했든 처음이든 끝이든 결과는 같았어요. 왠지 GPT-4는 갈등을 무시하고 영화를 연출한 것이 굳건하다고 믿었던 것 같아요.

반사실적 견고성

반사실적 견고성은 모델이 명령을 통해 검색된 컨텍스트에서 알려진 사실 오류의 위험을 식별할 수 있는지 여부를 평가해요. 테스트를 위해 LLM이 직접 답변할 수 있는 질문을 할 수 있지만 검색된 컨텍스트에는 사실적 오류가 포함되어 있죠.

여기서는 검색된 컨텍스트의 시작 부분에 잘못된 사실을 삽입할게요.

"Person [Tom Hanks] DIRECTED Movie [Lord of the Rings] 
Person [Tom Hanks] DIRECTED Movie [That Thing You Do]
Person [Tom Hanks] ACTED_IN Movie [You've Got Mail]
Person [Tom Hanks] ACTED_IN Movie [A League of Their Own]
Person [Tom Hanks] ACTED_IN Movie [That Thing You Do]
Person  name Tom Hanks born 1956 
... .. (195 more rows to come)

질문:

톰행크스가 감독한 영화는 무엇인가요?

생성된 답변:

톰 행크스는 영화 '반지의 제왕'과 'That Thing You Do'를 감독했습니다.

이 경우 GPT-4와 같은 고급 LLM도 명백히 잘못된 사실에 대해 어떠한 경고도 제공하지 못했어요.

요약

의미론적 의미를 포착하는 데 혁신적이기는 하지만 텍스트 임베딩은 종종 상황 민감성, 상황적 의미 및 진화하는 언어 사용으로 인해 어려움을 겪어요(원본 논문). Retrieval-Augmented Generation(RAG)과 같은 솔루션에 적용되는 동안 임베딩 기반 유사성 검색 방법을 기반으로 검색된 콘텐츠는 결과적으로 Large Language Model(LLM) 생성의 정확성과 정확성에 영향을 미칠 수 있죠.

RAG가 LLM의 응답 정확도를 향상시킬 수 있음에도 불구하고 위에서 언급한 문제로 인해 여전히 심각한 어려움을 겪고 있어요.

  • 상충되는 지식 감지

도메인별 임베딩 모델을 Fine-tuning하면 일부 문제를 해결하고 개선할 수 있어요.더욱 발전된 검색 전략벡터 검색을 다른 검색 기술과 결합합니다.

이에 대한 블로그 게시물은 다음에서 확인할 수 있어요.

지식 그래프에 대한 협업 필터링을 통해 텍스트 임베딩의 의미 체계 검색 향상

고급도 있고Neo4j RAG 전략LangChain에서 사용하려면:

마스터의 langchain/templates/neo4j-advanced-rag · langchain-ai/langchain

RAG 솔루션을 구현할 때 이러한 제한 사항과 관련된 시나리오에 대해 정의된 특정 테스트 사례 및 평가 지표가 있어야 해요.


  • gpt-4
  • RAG
  • 벡터 유사성 검색

에이치시스템즈LogTree는 Neo4j 기반 GraphRAG 플랫폼으로, 데이터를 자동으로 지식그래프화하고 자연어 질의로 즉시 답을 제공합니다.

👉 에이치시스템즈 홈페이지

728x90
반응형

+ Recent posts