포스트

GraphRAG를 Memory로 확장하기

GraphRAG를 Memory로 확장하기
  • Hipporag: Neurobiologically inspired long-term memory for large language models, NeurIPS, 2024.
  • From RAG to Memory: Non-Parametric Continual Learning for Large Language Models, arXiv, 2025.

RAG는 LLM에 새 지식을 붙이는 사실상의 표준이에요. 하지만 검색 단위가 passage 하나로 고립돼 있어서, 여러 passage에 흩어진 정보를 엮어야 하는 작업에는 약해요. Multi-hop QA가 대표적인 예시예요. 보통은 retrieval과 generation을 여러 번 반복하는 iterative 방식으로 이 문제를 우회하는데, 비용이 크고 그래도 못 푸는 경우가 남아요. HippoRAG는 이 한계를 인간의 장기기억 구조를 모방해서 설계했어요.

뇌에서 영감을 얻다

Overview

HippoRAG의 출발점은 hippocampal memory indexing theory예요. 이 이론은 인간 장기기억을 세 부분으로 나눠요. Neocortex는 실제 기억 표상을 처리하고 저장해요. Hippocampus는 neocortex의 기억 단위를 가리키는 index를 들고 있고, 단위 사이의 association을 저장해요. Parahippocampal region(PHR)은 둘 사이를 잇는 통로예요.

이 구조는 두 가지 기능을 해요. Pattern separation은 서로 다른 경험의 표상을 구분되게 만들어요. Pattern completion은 부분 단서로부터 완전한 기억을 되살려요. 새 정보를 통합할 때 neocortex 표상을 통째로 갱신하는 대신 hippocampal index만 바꾸면 된다는 점이 핵심이에요.

HippoRAG는 세 부분을 이렇게 대응시켜요.

  • Artificial neocortex는 LLM이에요. Passage를 처리해 지식을 뽑아요.
  • Artificial hippocampal index는 open KG(Knowledge Graph)예요.
  • PHR은 retrieval encoder예요. 비슷한 개념을 이어줘요.

Personalized PageRank에 대해

두 논문의 검색은 Personalized PageRank(PPR) 위에서 돌아가요. 이 알고리즘을 먼저 짚고 가면 나머지가 쉽게 읽혀요.

출발은 PageRank예요. PageRank는 graph 위를 떠도는 random surfer를 가정해요. Surfer는 현재 node에서 edge를 따라 이웃으로 이동하고, 가끔 edge를 무시한 채 graph의 임의 node로 순간이동(teleport)해요. 이 과정을 오래 반복하면 각 node에 머무는 확률이 한 분포로 수렴해요. 이 stationary distribution이 곧 node의 중요도 점수예요. 많은 node에서 짧은 경로로 닿는 node일수록 높은 점수를 받아요.

갱신 규칙은 이래요.

\[\vec{r}^{(t+1)} = (1-\alpha)\,\mathbf{M}\vec{r}^{(t)} + \alpha\,\vec{v}\]

$\mathbf{M}$은 transition matrix로, edge를 따라 이웃으로 이동하는 확률을 담아요. $\alpha$는 teleport 확률이고, $\vec{v}$는 teleport했을 때 도착하는 분포예요. 일반 PageRank에서 $\vec{v}$는 모든 node에 균등해요. Surfer가 어디로든 똑같은 확률로 순간이동한다는 뜻이에요.

Personalized PageRank는 이 $\vec{v}$ 하나만 바꿔요. 균등 분포 대신 seed node 집합에만 확률을 줘요. 그러면 surfer는 teleport할 때 항상 seed로 돌아와요. 결과적으로 stationary distribution이 seed와 그 주변으로 쏠려요. PPR 점수는 각 node가 seed에서 얼마나 가까운지를 graph의 모든 경로를 종합해 매긴 값이 돼요.

여기서 $\alpha$의 역할이 중요해요. $\alpha$가 크면 surfer가 자주 seed로 돌아와 가까운 이웃에 점수가 집중돼요. $\alpha$가 작으면 멀리까지 탐색해 더 먼 node에도 점수가 퍼져요. 두 논문은 이 $\alpha$를 reset probability라고 불러요. HippoRAG는 0.5로 둬요.

이 성질이 retrieval과 잘 맞아요. Seed를 query에서 뽑은 node로 두면, PPR 한 번이 seed의 multi-hop 이웃을 부드럽게 펼쳐 줘요. 직접 이웃만 더하는 방식과 달리, 여러 hop 떨어졌어도 여러 seed가 공유하는 node라면 확률이 쌓여요. 이게 HippoRAG가 single-step으로 multi-hop을 푸는 메커니즘이에요. HippoRAG 2는 seed를 고르는 방법과 seed별 reset probability를 정교하게 다듬어 같은 메커니즘을 강화해요.

HippoRAG는 어떻게 색인하고 검색할까

HippoRAG는 offline indexing과 online retrieval 두 단계로 동작해요.

method

Offline indexing은 corpus를 KG로 바꾼다

Instruction-tuned LLM $L$이 각 passage에서 OpenIE로 triple을 뽑아요. OpenIE(Open Information Extraction)는 정해진 schema 없이 텍스트에서 (subject, relation, object) 형태의 triple을 뽑는 작업이에요. 관계 종류를 미리 고정하는 일반 정보 추출과 달리, “(Thomas, works on, Alzheimer’s)”처럼 문장에 나온 관계를 그대로 표현으로 쓸 수 있어요. Schema가 없는 open extraction이라 관계와 개념을 자유롭게 생성해요. 이때 1-shot prompting을 두 단계로 써요. 먼저 named entity를 뽑고, 그 entity를 prompt에 넣어 triple을 추출해요. 두 단계로 나누면 named entity 쪽으로 적당히 치우치면서도 일반 개념까지 담는 균형이 나와요.

추출 결과는 noun phrase node 집합 $N$과 relation edge 집합 $E$가 돼요. 여기에 retrieval encoder $M$이 synonymy edge $E’$를 더해요. 두 node의 embedding cosine similarity가 threshold $\tau$를 넘으면 같은 뜻으로 보고 edge를 연결해요. 서로 다른 passage에 표현만 다르게 등장한 개념이 이 edge로 묶여요.

색인 과정은 $|N| \times |P|$ 크기의 행렬 $\mathbf{P}$도 만들어요. 각 noun phrase가 각 passage에 몇 번 등장했는지를 담아요. 이 행렬은 나중에 node 점수를 passage 점수로 바꿀 때 써요.

Online retrieval은 PPR 한 번으로 multi-hop을 한다

Query $q$가 들어오면 LLM이 query named entity $C_q = {c_1, \dots, c_n}$를 뽑아요. 이를 같은 encoder $M$으로 인코딩하고, $N$에서 cosine similarity가 가장 높은 node를 골라 query node $R_q$로 삼아요.

\[r_i = e_k, \quad k = \arg\max_j \ \mathrm{sim}(M(c_i), M(e_j))\]

이제 query node를 seed로 두고 PPR을 돌릴 준비를 해요. Personalized distribution $\vec{n}$은 seed에만 같은 확률을 주고 나머지는 0으로 둬요.

Seed 확률에는 보정을 하나 넣어요. Node specificity는 IDF처럼 흔한 node의 영향을 줄이는 신호인데, 전역 통계 없이 각 node의 정보만으로 계산해요.

\[s_i = |P_i|^{-1}\]

$P_i$는 node $i$가 등장한 passage 집합이고, $|P_i|$는 그 집합의 크기, $|P_i|^{-1}$은 이 개수의 역수 $1/|P_i|$예요. Node가 한 passage에만 나오면 $s_i = 1$이고, 100개 passage에 나오면 $s_i = 0.01$로 작아져요. 여러 passage에 흔하게 퍼진 node일수록 값이 작아지는 IDF 신호예요. PPR을 돌리기 전에 seed 확률에 $s_i$를 곱하면, 드문 node일수록 자기 이웃을 더 강하게 띄우고 흔한 node는 영향이 줄어요.

이제 PPR을 돌리는데, 여기서 single-step이라는 말의 뜻이 드러나요. Iterative RAG는 multi-hop을 탐색할 때, 검색하고, LLM이 읽고, 부족하면 다시 query를 만들어 또 검색해요. Hop을 넘을 때마다 retrieval과 LLM 호출을 반복하니, 3-hop이면 이 라운드를 세 번 돌려요. HippoRAG는 이 값비싼 retrieval 라운드를 한 번만 돌려요. Query entity를 뽑는 LLM 호출 한 번, 그다음 PPR 한 번으로 끝나요.

그런데 hop은 그 PPR 안에서 일어나요. 갱신 규칙에서 transition matrix $\mathbf{M}$을 곱하는 부분이 확산을 맡아요. $\mathbf{M}$을 한 번 곱할 때마다 확률이 edge를 하나 건너 이웃으로 퍼지고, 이 곱셈을 수렴할 때까지 반복하니 반복 횟수만큼 hop이 쌓여요. 즉 PPR의 iteration이 곧 hop이에요. 세는 단위가 다르다는 점이 핵심이에요. “한 번”은 retrieval 라운드를 세는 말이고, PPR step은 그 라운드 안에서 도는 행렬 곱이에요. 전자는 LLM을 호출하는 비싼 연산이고, 후자는 여러 step을 walk하는 가벼운 연산이에요.

예를 들어 볼게요. “Alzheimer’s를 연구하는 Stanford 교수는?”이라는 query면 query node는 Stanford와 Alzheimer’s가 돼요. 정답 인물 Thomas는 query에 등장하지 않아요. 하지만 KG에는 (Thomas, works at, Stanford)와 (Thomas, works on, Alzheimer’s) edge가 있어요. PPR을 돌리면 Stanford에서 Thomas로, Alzheimer’s에서도 Thomas로 확률이 흘러요. Thomas는 두 seed 양쪽에서 질량을 받아 높은 점수가 돼요. 결국 Thomas가 담긴 passage가 검색돼요. 두 hop 떨어진 답을 PPR 한 번이 이어 준 것이에요.

Hop 깊이는 reset probability $\alpha$가 조절해요. $\alpha$가 작으면 확률이 더 멀리 퍼져 세 hop, 네 hop 떨어진 node까지 닿아요. 대신 거리가 멀수록 점수가 감쇠하니, 가까운 연관이 더 강하게 반영돼요.

PPR이 끝나면 갱신된 분포 $\vec{n}’$이 나와요. 각 원소 $n’_i$가 node $i$의 최종 확률이고, 이 값이 곧 query와의 연관 점수예요. 높을수록 seed에서 짧고 많은 경로로 닿았다는 뜻이에요. 그런데 우리가 검색해 넘길 대상은 phrase node가 아니라 passage예요. 그래서 색인 때 만든 행렬 $\mathbf{P}$로 node 점수를 passage 점수로 옮겨요.

\[\vec{p} = \mathbf{P}^\top \vec{n}'\]

한 passage의 점수는 그 안에 등장한 node들의 확률을 모은 값이에요. 높은 확률 node를 많이 품은 passage일수록 점수가 높아져요. 이 $\vec{p}$를 내림차순 정렬해 상위 top-$k$ passage를 뽑고, 그게 downstream QA의 context로 들어가요.

HippoRAG에서 중요한 건 뭘까

Ablation1

논문은 ablation 결과를 보여줘요. PPR을 빼면 성능이 크게 떨어져요. Query node만 쓰거나 query node와 직접 이웃만 더하는 단순 대안은 PPR보다 약해요. 흥미롭게도 PPR 없이 이웃만 더하면 query node만 쓸 때보다도 나빠져요. 연관을 검색에 반영하는 일은 단순 이웃 확장이 아니라 graph 전체에 확률을 흘리는 방식이 중요하다는 뜻이에요.

OpenIE를 맡는 LLM도 영향이 커요. End-to-end OpenIE 모델인 REBEL로 바꾸면 성능이 많이 떨어져요. REBEL이 일반 개념 triple을 적게 뽑아 유용한 연관을 놓치기 때문이에요. 반면 Llama-3.1-8B나 70B 같은 open-weight LLM은 GPT-3.5와 견줄 만해서, 큰 corpus를 색인할 때 더 싼 대안이 돼요.

Node specificity와 synonymy edge는 데이터셋마다 효과가 달라요. Node specificity는 MuSiQue와 HotpotQA에서 도움이 크고, synonymy edge는 named entity 비중이 큰 2WikiMultiHopQA에서 효과가 가장 커요.

HippoRAG는 single-step으로 multi-hop을 푼다

HippoRAG의 가장 큰 강점은 single-step multi-hop retrieval이에요. 모든 supporting passage를 한 번에 다 가져오는 비율(all-recall)로 보면 ColBERTv2와의 격차가 더 벌어져요. 부분적으로 더 맞히는 게 아니라, 정답에 필요한 passage를 통째로 회수하는 데서 이득이 나와요.

논문은 multi-hop을 두 종류로 나눠요. Path-following question은 정해진 한 경로를 따라가면 풀려요. “Alhandra가 태어난 지역은?” 같은 질문은 출생지라는 한 경로만 따라가면 돼서 iterative 방식도 잘 풀어요. Path-finding question은 달라요. “Alzheimer’s를 연구하는 Stanford 교수는?” 같은 질문은 Stanford 쪽 경로와 Alzheimer’s 쪽 경로가 모두 가능해서, 어느 한쪽을 따라가는 iterative 방식으로는 길을 잃어요. 두 단서를 한 인물에서 연관 지을 수 있어야 풀려요. HippoRAG는 KG 위 PPR로 이 연관을 한 번에 잡아내요.

비용도 강점이에요. Single-step HippoRAG는 IRCoT 같은 iterative 방식과 비슷하거나 나은 성능을 내면서 online retrieval이 10~30배 싸고 6~13배 빨라요. HippoRAG를 IRCoT의 retriever로 끼우면 추가 이득도 나와요.

하지만 HippoRAG의 한계점도 있어요. Query를 named entity 중심으로 파싱하고 KG도 entity 중심이라, 색인과 추론 양쪽에서 context가 손실돼요. 그래서 긴 담화 이해처럼 맥락이 중요한 작업에서 약하고, 단순 사실 QA에서는 표준 RAG보다 떨어지는 문제가 생겨요. HippoRAG 2가 바로 이 지점을 겨냥해요.

구조를 더한 RAG는 factual memory에서 무너진다

HippoRAG 2는 문제를 다시 정의하면서 시작해요. RAG로 장기기억을 흉내 내려면 세 가지 능력이 모두 필요해요.

  • Factual memory는 사실을 정확히 떠올리는 능력이에요. Simple QA로 측정해요.
  • Associativity는 흩어진 사실을 multi-hop으로 잇는 능력이에요. Multi-hop QA로 측정해요.
  • Sense-making은 길고 복잡한 맥락을 해석하는 능력이에요. NarrativeQA 같은 discourse understanding으로 측정해요.

논문이 RAPTOR, GraphRAG, LightRAG, HippoRAG를 세 축에서 함께 평가하니, structure-augmented RAG가 자기 특기 밖에서 무너지는 패턴이 드러나요. HippoRAG는 context 부족으로 담화 이해에서 약하고, RAPTOR는 LLM 요약이 corpus에 noise를 더해 simple QA와 multi-hop QA에서 떨어져요. 공통점은 구조를 더한 방법들이 기본 사실 검색에서 standard RAG보다 못하다는 점이에요. HippoRAG 2의 목표는 세 축에서 동시에 standard RAG를 넘는 것이에요.

HippoRAG 2로의 발전

HippoRAG 2는 OpenIE와 PPR이라는 뼈대를 그대로 두고, query 기반 contextualization 한계를 세 가지 개선으로 메워요. Passage를 PPR graph에 직접 넣고, query를 triple 선택에 더 깊이 개입시키고, online 단계에서 LLM이 무관한 triple을 걸러내게 해요.

Passage를 graph에 넣다

HippoRAG의 KG는 개념을 담은 phrase node 위주라 concept-context tradeoff가 있어요. 개념은 간결하지만 정보를 잃고, 맥락은 풍부하지만 복잡해요. HippoRAG 2는 dense-sparse coding 관점에서 둘을 섞어요. Phrase node는 개념을 압축한 sparse coding으로, passage는 맥락을 담은 dense coding으로 봐요.

방법은 KG에 passage node를 새로 넣는 것이에요. 각 passage를 node로 만들고, 그 passage에서 나온 모든 phrase에 “contains” 라벨의 context edge로 연결해요. HippoRAG는 graph search 점수와 embedding 점수를 사후에 합치는 document ensemble을 썼는데, HippoRAG 2는 passage를 graph 안에 두어 맥락을 검색 과정에 직접 녹여요. Offline indexing 절차 자체는 HippoRAG와 같고, node와 edge만 풍부해져요.

Query를 triple에 잇다

HippoRAG는 query를 NER로 파싱해서 개념 중심으로 KG에 연결해요. 맥락 신호가 버려지는 지점이에요. HippoRAG 2는 query를 KG에 잇는 세 방법을 비교해요.

  • NER to node는 HippoRAG의 원래 방식이에요. Query에서 entity를 뽑아 node에 매칭해요.
  • Query to node는 query 전체를 embedding으로 node에 매칭해요.
  • Query to triple은 query 전체를 triple에 매칭해요.

기본값은 query-to-triple이에요. Triple이 개념 사이의 관계를 통째로 담고 있어서 query 의도를 더 풍부하게 반영해요. Query-to-node는 별 이득이 없어요. Query와 node의 granularity가 달라서, phrase 수준인 NER 결과나 node와 잘 안 맞기 때문이에요.

Recognition memory는 triple을 걸러낸다

인간 기억 인출은 recall과 recognition으로 나뉘어요. Recall은 외부 단서 없이 떠올리는 것이고, recognition은 단서를 보고 알아보는 것이에요. HippoRAG 2는 query-to-triple을 이 두 단계로 모델링해요. 먼저 embedding model로 top-$k$ triple 집합 $T$를 가져와요(recall). 그다음 LLM이 $T$를 걸러 관련 있는 부분 집합 $T’ \subseteq T$만 남겨요(recognition). 이 triple filtering이 graph search의 seed를 깨끗하게 만들어요.

HippoRAG 2의 online retrieval은 어떻게 동작할까

method2

먼저 query-to-triple과 recognition memory가 남긴 filtered triple에서 phrase node를 뽑아요. 만약 남은 triple이 없으면 embedding model로 top passage를 바로 검색하는 방식으로 fallback해요. Triple이 있으면 filtered triple의 평균 ranking 점수로 최대 $k$개의 phrase node를 골라요.

여기에 모든 passage node도 seed로 넣어요. 활성화 범위를 넓히는 게 multi-hop reasoning에 도움이 되기 때문이에요. Reset probability는 두 종류 node에 다르게 줘요. Phrase node는 ranking 점수로, passage node는 embedding similarity에 weight factor를 곱한 값으로 정해요. 이 weight factor는 phrase node와 passage node의 영향을 맞추는 역할을 하고, 기본값은 0.05예요.

이렇게 정한 reset probability로 PPR을 돌리고, PageRank 점수로 passage를 정렬해요. Top passage가 downstream QA의 context로 들어가요. 구현에는 Llama-3.3-70B-Instruct를 extractor와 triple filter로, NV-Embed-v2를 retriever로 써요.

Ablation이 각 요소의 기여를 보여줘요. Query-to-triple은 NER-to-node 대비 multi-hop recall@5를 평균 12.5% 올려요. Passage node를 빼면 떨어지고, triple filter는 작지만 일관된 이득을 줘요. Reset weight factor도 결과에 민감해서 0.05 부근이 가장 좋아요.

두 논문은 무엇을 주장하나

HippoRAG는 RAG를 인간 장기기억 구조로 다시 짜요. LLM(OpenIE), open KG, PPR을 hippocampal indexing theory에 대응시켜, single-step retrieval 한 번으로 multi-hop을 풀어요. 핵심 주장은 KG 위 PPR이 passage 경계를 넘는 연관을 검색에 반영하고, iterative 방식보다 싸고 빠르면서 비슷하거나 나은 성능을 낸다는 것이에요. 특히 여러 경로가 가능한 path-finding 질문에서 강점이 분명해요.

HippoRAG 2는 같은 뼈대 위에서 사실 검색까지 회복시켜요. Passage node로 맥락을 graph에 넣고(dense-sparse integration), query를 triple에 잇고(deeper contextualization), LLM으로 triple을 거르며(recognition memory), HippoRAG의 entity 중심 한계를 메워요. 그 결과 associativity에서 SOTA embedding model 대비 약 7점을 올리면서 factual memory와 sense-making에서도 떨어지지 않아요. 두 논문을 잇는 줄기는 같아요. RAG를 검색 기법이 아니라 LLM의 non-parametric 장기기억으로 보고, 그 기억을 인간 기억 구조에 맞춰 설계한다는 관점이에요.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.