25년 3월 4주차 그래프 오마카세

GFM-RAG: Graph Foundation Model for Retrieval Augmented Generation

https://arxiv.org/pdf/2502.01113

GFM-RAG 리뷰입니다. GraphRAG 개념이 익숙하신 분들이라면, 본 논문 컨셉을 이해하기에 수월하실거라 생각됩니다. GraphRAG의 초반부인 Knowledge graph 만드는 부분과 후반부 Retrieval 결과를 Prompt 에 넣어 Decoding 하는 것은 유사하나 가운데 retrieval 단계에서 GDBMS를 활용하는게 아닌, GNN을 이용한다는게 가장 큰 차이입니다.

핵심은 다음 세 가지라고 할 수 있겠습니다.

1.Retrieval stage에서 Graph Foundation Model를 활용한 방식과 그 이유
2.Document 로부터 Entity를 추출하고, 유저 질의와 매칭하는 방식
3.엔지니어링

이 세 가지는 참고로 논문저자가 언급한 contribution은 아닙니다. 제 관점에서 보는 핵심인데요. 그 이유는 요새 GraphRAG가 관심을 많이 받으며, 많은 분들께서 시도 하고 계시는 와중에 발생하는 Entity 관리를 본 논문에서 잘 해냈다 라고 생각했고, 잘 했다 라고 생각한 3가지 요소를 핵심으로 봤기 때문입니다.

실무에서 활용하기 가장 합리적인 방식이라 생각하는 Neo4j 방법론을 잠시 언급하자면, entity 개별 text 정보를 embedding 하고 해당 feature 기반으로 연결 그리고 clustering . 여기에서 동일 clustering에 속해있는 entity끼리 text distance 연산 후 unifying. 이렇게 진행됩니다. Neo4j Cypher문과 함께인지라, 구체적으로 어떻게 진행되는지가 궁금하시면 링크를 참고해보시면 좋을거 같아요.

이외에도 Entity Resolution 개괄부터 각 분야마다 어떻게 적용하면 좋을지를 다룬 Neo4j Complete Guide 가 있으니 참조해보시면 좋을거 같네요.

다시 돌아와서, Figure1을 보면, 직관적으로 느껴집니다. GNN 이외에 LLM prompt, Doc Reranking, Entity Extraction & Linking 등 과 같은 부분들에서 관리해야할 포인트들이 많이 있겠음을요. 이 포인트들을 Config에 각기 다른 Parameter를 입력해주며 튜닝과 타 모델들과 연결하며 End2End로 answer까지 만들어줘야할텐데 이를 어떻게 할지 막막하셨을거라 생각되네요.

이 논문에서는 해당 flow 들을 hydra 와 bash 조합으로 깔끔하게 관리해줍니다. 때문에, 마지막 3번째 Entity를 잘 추출하고 이를 answer까지 갈 때 과연 어떻게 갈지 힌트를 줄 수 있는 엔지니어링 스킬이 담겨 있기에 본 논문을 추천드립니다.

Figure2에 나와 있는 5가지 단계를 각각 풀어보겠습니다. 위쪽 dashed line은 GFM-RAG 개요 아래쪽 dashed line은 GFM pretraining 과 Finetuning 하는 과정이 그려져 있습니다.


1.KG-Index Construction
Document Corpus 에서 Entity 를 추출하고 이를 Indexing 하는 단계입니다.
간단해보이지만, 내부에는 세부 3단계로 구성되어 있습니다.

  1. Document의 Passage(chunk와 유사) 를 넣고 Entity를 추출
  2. 추출된 Entity 가 무슨 객체인지 라벨링하는 단계
  3. 라벨링 되어있는 엔티티들끼리 무슨 Link가 있는지를 인지하고 라벨링하는 단계

이로써, Triple 데이터셋 이 완성됩니다. 다시말하면, Knowledge graph가 만들어진거죠. 여기에서 대부분 고민하는 부분인 Entity resolution을 어떻게하는지가 궁금하실텐데요. 그 부분은 다음과 같습니다.

# gfm-rag/gfmrag/kg_construction
logger.info("Adding synonymy edges")
        for phrase, neighbors in tqdm(sim_neighbors.items()):
            synonyms = []  # [(phrase_id, score)]
            if len(re.sub("[^A-Za-z0-9]", "", phrase)) > 2:
                phrase_id = kb_phrase_dict[phrase]
                if phrase_id is not None:
                    num_nns = 0
                    for neighbor in neighbors:
                        n_entity = neighbor["entity"]
                        n_score = neighbor["norm_score"]
                        if n_score < self.threshold or num_nns > self.max_sim_neighbors:
                            break
                        if n_entity != phrase:
                            phrase2_id = kb_phrase_dict[n_entity]
                            if phrase2_id is not None:
                                phrase2 = n_entity
                                synonyms.append((n_entity, n_score))
                                graph[(phrase, phrase2)] = "equivalent"
                                num_nns += 1

간단하게 말해보면, threshold와 최대 이웃 제한을 걸어둡니다. entity 별 score가 있고, 너무 많은 중복을 막기 위해 max sim neighbor 2가지를 condition으로 걸어둔거죠. 자세한 코드는 맨 위 주석 경로에서 볼 수 있습니다.

2.Query Initialization
이 부분은 간단합니다. 유저의 질의가 들어오면 이 질의를 sentence-transformer 를 활용해 임베딩해주는 단계입니다.

3.Query-dependent Message Passing
만들어진 GFM-Retrieval을 활용해 앞 단계에서 추출된 Embedding , Document 그리고 Knowledge graph 3개의 input을 넣어줍니다.

q 는 query , G는 Knowledge Graph (indexed) , H^0 은 entity intial feature입니다. initial feature는 sentence-transformer의 결과물입니다.

각 layer를 거치며, 초기에 만들어둔 document로부터 추출한 knowledge graph의 head , relation , tail (triple) embedding 값들이 message passing 되고, 최종적으로 entity-level 딴에서는, 각각의 entity 들이 연결되어 있는 neighbor entity 들의 weight를 aggregation 해서 structural 와 semantic 정보를 가지게 되는거죠. 이 값들이 결국 query 와 entity 값의 관련성을 비교하는 매체가 되고, 관련성이 높은 엔티티가 있는 document들을 추출해서 reranking stage 로 보냅니다.

4.Doc Ranking
위 Retrieval 결과로 top-k 개의 document가 추출됩니다. 주의할점은, Document마다 자주 언급되는 Entity가 있을것이고,반대로 그렇지 않은 Entity가 있을텐데 '자주' 언급된다하여 해당 문서와 쿼리가 연관성이 높다라고 할 수 없기에 이를 조정해주는 장치가 필요합니다. 이를 위해 IDF를 활용합니다. 기존에 저희가 자주 이용하던 TF-IDF와 동일합니다.

5.LLM Generation
Reranked Document와 Query를 LLM 에 주입하여 decoding 하는 단계입니다.

위에 이것저것 작성해놓았지만, 사실 아래 3개의 notation으로 이 논문을 정리할 수 있습니다. 인덱싱하고, Retrieval 하고, LLM에게 query와 Retrieved document를 prompt로 입력해줘서 답변 도출.

RAG에 굳이 Graph Foundation Model를 활용한 이유

  • Graph Semantic & Structure 을 Retrieval에 적용하기 위함. 이 부분을 기존과 비교해보면, GDBMS에 적재해놓은 Knowledge graph와 Query 유사도를 비교하기 위해 Query에서 Keyword & Sentence search 한 뒤, 도출된 entity 기반 graph traverse 가 발생하는것이라고 할 수 있습니다.
  • 각각 장단이 뚜렷한데요. 본 논문의 방법론은 GNN 의 구축 비용이 많이 드는것에 비해 text2cypher과 같은 schema 를 LLM에게 인지하기 위해 fine-tuning 이나 prompt engineering 을 하지 않아도 된다.
  • 즉, 조회에 대한 불확실성을 줄일 수 있다. 이고, 반면에 주로 활용하는 방식은 GNN 구축 비용이 적어지는 대신, GDBMS의 Search를 활용하기 위해 유저 Query 그리고 Graph Query 의존성이 높아진다 라는 점을 들 수 있겠습니다. GDBMS vs. GNN이라고 봐주시면 될 거 같아요.
  • 만일 multi-hop 쿼리가 중요한 상황이라면 GDBMS, 그렇지않고 entity resolution & query matching이 중요한 상황이라면 GFM을 활용하는게 좋을거 같아요.

Document 로부터 Entity를 추출하고, 쿼리와 매칭하는 방식

  • Query와 Entity를 비교하기 위해선 결국 Document 에서 Entity를 추출해야하고, 그 Entity 들간 관계를 만들어줘야합니다. 여기에선 기존 OpenIE를 활용했던 걸 LLM 를 활용했구요. 그렇게 Entity 추출을 하고, Entity Linking 이 되었으면

엔지니어링.

  • Foundation Model 하면 생각나는 키워드가 몇 개 있죠? 그 중 제가 어렵다고 생각되는 키워드 두 개는 바로 대용량 데이터 전처리 및 모델에 올리기 입니다. 1에서 언급된 General 한 지식을 토대 삼아 RAG specific inference 를 하기 위해선, 우선 General dataset을 학습시켜야겠죠. 여기에서는
  • 참고로 학습을 위해 A100 8대 (80G), 총 파라미터는 8M 라고 합니다. 데이터셋은 총 700k document로부터 60 개의 KG를 만들었고, 총 14M triple를 학습했다 라고 합니다.
  • 뿐만아니라, Retrieval tool로 colbert, dpr(dense passage retrieval) 를 활용한 코드, Node state update 발견할 수 있습니다. 이외에도 엔지니어링 측면에서 레퍼런스 삼을만한 부분이 많은 논문입니다. 꼭 코드도 함께 보시는걸 추천드립니다.

요즘 GPT 덕분에 논문 읽기가 이전대비 수월해졌습니다. 논문을 리뷰하는 형태보다 제가 논문을 보며 GFM-RAG 와 연관성 있는 부분을 질문 형태로 바꾸어 봤습니다. 질문에 해당하는 내용들이 궁금하면, 논문을 GPT attach 로 넣어 답변을 얻는게 효율적인지 않을까 하여 새로운 방식으로 접근해봤네요. 저희의 시간은 소중하니깐요.

Position: Graph Foundation Models are Already Here (research)

https://arxiv.org/pdf/2402.02216

GFM 만들때 발생하는 negative transfer을 방지하기 위해 고려해야하는 것들 부터 시작해서 node, link , graph prediction 할 때 알아두면 좋을 principle 들이 좋음.

  • 핵심은 ‘across different domains and tasks‘ 임. 이를 Network analysis, expressiveness, and stability 원리를 활용해서는 어떻게할것인가? 특히, expressiveness 와 stability 차이는 ?
  • Graph vocabulary 가 핵심이라 하는데 어떻게 이를 구축하면 좋을지?
  • 대표적인 GFM 모델들은 무엇이 있고, 그 중 GFM-RAG 에서 활용한 ULTRA 라는 모델은 무엇일까? 어떻게 흥행의 주역이 되었을까?
  • 성공적인 GFM 구축을 위해 고려해야할 것들 새로운 relationship 이 등장할 때 이를 인지하고 어떤 노드와 연결이 되는지를 판단하는 알고리즘이 필요하다. 이때, 무엇이 필요할까?
  • Node prediction (entity resolution - 여러개의 entity 가 종합되어 있을때, 이를 구하기)
  • Graph vocabulary 를 구축했다고 한들, 이를 활용해서 추론하는 GFM 이 적절하게 작동한다라는걸 판단하기 위해 Homophily , Heterophily 라는 지표가 존재한다는데 이는 과연 무엇일까?
  • Link prediction (온톨로지를 구축해서 Knowledge graph 까지 만들었으나, 새로운 관계가 발생할 수 있다.이때, 어떻게 추론하면 좋을까)
  • 평소에 link prediction 시, 성능 개선이 어려운 부분들이 많았었다. 여기에서는 node similarity 를 local side 뿐만아니라, global side 로도 접근한다는데 어떻게 접근한다는 걸까?
  • 준지도학습 방법론으로 유명한 GNN, 연결되어 있는 Node pair 간의 의존성을 기반으로 labeling 을 할 수 있는 방식들이 존재하는데, 이 방식들이 GFM 과 어떤 연관성이 있을까?
  • 분명 GNN task들간의 연관관계가 존재할 것이고, 이 연관관계를 활용해서 학습을 하면 유리할 부분이 있을거 같은데 과연 무엇일까?
  • Foundation Model 신에서 자주 언급되는 Neural Scaling Law , Graph Foundation Model에서는 언제 어떻게 등장할까? (개인적으로 4.1. 모두 읽어보셨으면 하네요.) ‘The key concern is whether graphs can strictly follow those principles. Uncertainty can be found on the human-defined graph construction criteria. For instance, the construction knowledge relying on expert knowledge may lead to uncertainty in edges.' 라는 부분이 현재 저희들이 겪고있는 가장 큰 문제를 잘 짚어주었기 때문입니다. 논문 저자들은 위 부분과 GFM을 어떤 관점으로 문제 정의하고 해결할 수 있었는지를 음미해보시죠.
  • Data / Model scaling 을 위해 각각 graph generation , Vanila gnn vs. graph transformer 등 접근 방식이 다르다는데 그 접근 방식이 왜 다르고, 왜 그렇게 접근하는걸까?

Graph Foundation Models: Concepts, Opportunities and Challenges

https://arxiv.org/pdf/2310.11829

GFM(Graph Foundation Model) 개념잡기 좋다. 기존 서베이 논문들은 Text 관점이 배제된채 GFM 을 언급했다면, 본 논문은 두 관점을 잘 작성해두었음. 톮아보기에 좋은 논문.

  • 텍스트에서 Foundation Model 과 그래프에서 Foundation Model 이 무슨 차이인지.
  • Graph Foundation Model 좋아보이는데 과연 어떤 한계점이 있는지.
  • Massage Passing 그리고 Graph Transformer의 차이점.
  • Graph Pre-training 모델을 만드는건 어려우니, Fine-Tuning 이나 Prompt Tuning (pre,post)를 하는게 합리적임. 과연 GraphRAG 를 위해 만들어놓은 그래프 스키마를 여기에 어떻게 적용할 수 있을까?
  • LLM 접근 방식은 어떻게 될까. GraphRAG에서 자주 언급되는 Graph-to-token(soft prompt) , Graph-to-text(hard prompt). 만일 위 방식들을 활용해야한다고 할때, 주의해야할 점들이 무엇일까.
  • 위 prompt 분류해서 LLM inject & alignment 활용하는거도 벅찬데 만일, hard prompt 를 활용했을때 일일이 prompt 를 만들어서 해야하는건가? 혹은 그렇지 않은 방식도 존재하는 걸까? Manual / Automatic Prompting 관점이 존재한다는데 어떻게 활용하는걸까?
  • GNN + LLM based Model - 서로 조화롭게 활용하는 방식은 없을까? GNN-based model은 직접 텍스트를 처리하고 예측할 수 없고, LLM-based model은 multi-hop logical reasoning 과 같이 특정 개체간의 관계를 연속적으로 탐색해서 답변을 내놓는데 제한이 있는 등 …

Read more

25년 8월 2주차 그래프 오마카세

Graph Tensor Networks: An Intuitive Framework for Designing Large-Scale Neural Learning Systems on Multiple Domain paper link : https://arxiv.org/abs/2303.13565 * 현재 토폴로지 신경망의 학습 메커니즘을 설계하는 과정에서 매우 중요한 텐서 연산에 대한 이해를 크게 도와준 논문 하나를 여러분들께 소개해드리려고 합니다. 그래프 구조를 활용하여 다양한 신경망의 텐서 연산

By admin

25년 8월 1주차 그래프 오마카세

A General Graph Spectral Wavelet Convolution via Chebyshev Order Decomposition paper link : https://arxiv.org/abs/2405.13806 official code : https://github.com/liun-online/WaveGC * 그래프 스펙트럼 컨볼루션은 그래프 신호처리 이론을 기반으로 그래프 필터링, 데이터 분석 등의 넓은 분야에서 활용되고 있습니다. 다음은 그래프 스펙트럼 변환을 위한 신호 기저 (고유벡터) 선택

By admin