🚀 LightRAG シンプルかつ高速なRAGフレームワーク(GoogleColab付)


[LightRAG公式ページ](https://lightrag.github.io) | [arXiv:2410.05779](https://arxiv.org/abs/2410.05779) | [LearnOpenCVでの紹介](https://learnopencv.com/lightrag)

LightRAGは、テキストやナレッジグラフ、ベクターストアを活用して効率的なRAGワークフローを可能にするフレームワークです。  
ここでは、Google Colab風にセルごとに解説とコードを整理し、日本語で手軽にLightRAGを始められる手順を紹介します。

**ポイント:**
- ドキュメント、PDF、CSV、Docxなど様々な形式のコンテンツを取り込み可能
- OpenAI API互換、HuggingFaceモデル、Ollamaモデルなど多様なLLMに対応
- 取得したコンテキストを活用し、高度な質問に自然言語で回答
- Neo4Jなどの商用付加ストレージは使用せず、デフォルトのJsonなどを利用可能（簡素化のためNeo4J例は省略します）
- グラフ可視化なども可能ですが、ここでは別途可視化コードを用意することにします

---

## インストールと準備

まずはLightRAGをインストールします。  
PyPIからもインストール可能ですが、ここではソースからのインストールを推奨します。


<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">LightRAGを取り敢えずGoogle colabで動かしてみます③<br>取り敢えず4000行の文章を2000行にしたらいけました！！<br>普通にRAGの挙動見てるけど良さそう！！ <a href="https://t.co/wnA33dPUvT">https://t.co/wnA33dPUvT</a> <a href="https://t.co/xC9bpwHiYB">pic.twitter.com/xC9bpwHiYB</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1866503317658243486?ref_src=twsrc%5Etfw">December 10, 2024</a></blockquote> 

### インストール(ソースから)
```python
# LightRAGのリポジトリをcloneしてインストール（例）
# ※本セルはGoogle Colab上で実行することを想定しています。
# もしGitが使えない環境やリポジトリURLが必要なら下記コメントを外して適宜調整してください。
!git clone https://github.com/HKUDS/LightRAG.git

%cd LightRAG
!pip install -e .
# ↑ ソースからインストールの例

# ここではPyPIからインストールする例を示します:
# pip install lightrag-hku
```

```python
import os
from google.colab import userdata

os.environ["OPENAI_API_KEY"] = userdata.get('OPENAI_API_KEY')
```

---

## LightRAGの基本的な使い方

LightRAGは、作業用ディレクトリを指定し、LLMやEmbedding関数を設定することで動作します。  
以下は、ダミーテキスト（例：チャールズ・ディケンズの「クリスマスキャロル」）を取り込み、RAG問い合わせを行う基本例です。

※OpenAIモデルを使用する場合、`OPENAI_API_KEY` の環境変数が必要です。

### データの準備
```python
# デモ用のテキストファイルを取得（英語の小説）
!curl https://raw.githubusercontent.com/gusye1234/nano-graphrag/main/tests/mock_data.txt > ./book.txt
```

### 基本的なセットアップとデータ挿入
```python
import nest_asyncio
nest_asyncio.apply()
```

```python
import os
from lightrag import LightRAG, QueryParam
from lightrag.llm import gpt_4o_mini_complete

WORKING_DIR = "./dickens"
if not os.path.exists(WORKING_DIR):
    os.mkdir(WORKING_DIR)

# LLMモデル関数にはデフォルトでgpt_4o_mini_completeを使います
rag = LightRAG(
    working_dir=WORKING_DIR,
    llm_model_func=gpt_4o_mini_complete
)

# テキストの挿入
with open("./book.txt") as f:
    rag.insert(f.read())
```

**解説:**  
`LightRAG`インスタンスを作成し、`rag.insert()`でコンテンツをベクターストアやKVストア、グラフに登録します。  
これで後のクエリ時に、このテキストの知識を活用可能になります。

---

## クエリの実行

`rag.query()`メソッドを使って、モデルに質問を投げかけます。  
`QueryParam`を指定することで、`local`, `global`, `hybrid`, `naive` などの検索モードを選べます。

### 検索モードと質問の例
```python
# テキストに関するテーマを尋ねる例
query_text = "この物語の主要なテーマは何ですか？"

# naive検索（単純検索）
print("===Naive検索===")
print(rag.query(query_text, param=QueryParam(mode="naive")))

# local検索（ローカルエンティティ重視）
print("===Local検索===")
print(rag.query(query_text, param=QueryParam(mode="local")))

# global検索（グローバル関係重視）
print("===Global検索===")
print(rag.query(query_text, param=QueryParam(mode="global")))

# hybrid検索（ローカル+グローバル混合）
print("===Hybrid検索===")
print(rag.query(query_text, param=QueryParam(mode="hybrid")))
```

**解説:**  
`mode`によって、RAGが返すコンテキストや検索方法が変化します。  
- `naive`：単純な類似検索  
- `local`：ローカルコンテキスト（エンティティ）重視  
- `global`：グローバル関係性重視  
- `hybrid`：ローカル・グローバル両面から考慮

---

## OpenAIライクなAPIの使用例（任意）

OpenAI互換API形式のLLMやEmbeddingsを使用したい場合、下記のような関数を設定できます。  
（ここではサンプルコード紹介のみ、実際に動かす場合は適宜API Keyが必要）

### OpenAI互換形式の使用例（解説のみ）
```python
# こちらは実行例ではなくサンプルコードです。
# APIキーなどは環境変数で設定してください。
# from lightrag.llm import openai_complete_if_cache, openai_embedding
# import numpy as np
#
# async def llm_model_func(
#     prompt, system_prompt=None, history_messages=[], keyword_extraction=False, **kwargs
# ) -> str:
#     return await openai_complete_if_cache(
#         "solar-mini",
#         prompt,
#         system_prompt=system_prompt,
#         history_messages=history_messages,
#         api_key=os.getenv("UPSTAGE_API_KEY"),
#         base_url="https://api.upstage.ai/v1/solar",
#         **kwargs
#     )
#
# async def embedding_func(texts: list[str]) -> np.ndarray:
#     return await openai_embedding(
#         texts,
#         model="solar-embedding-1-large-query",
#         api_key=os.getenv("UPSTAGE_API_KEY"),
#         base_url="https://api.upstage.ai/v1/solar"
#     )
#
# # 上記関数を使用するには、ragインスタンス作成時に指定
# # rag = LightRAG(
# #     working_dir=WORKING_DIR,
# #     llm_model_func=llm_model_func,
# #     embedding_func=EmbeddingFunc(
# #         embedding_dim=4096,
# #         max_token_size=8192,
# #         func=embedding_func
# #     )
# # )
```

---

## Hugging FaceモデルやOllamaモデルの利用

Hugging FaceモデルやOllamaモデルでも同様の設定が可能です。  
GPU環境でローカルLLMを使用したい場合、Hugging FaceモデルやOllama対応が便利です。

### Hugging Faceモデル利用例（解説のみ）
```python
# 実行例：HuggingFaceモデルを用いる場合
# from transformers import AutoModel, AutoTokenizer
# from lightrag.llm import hf_model_complete, hf_embedding
# from lightrag.utils import EmbeddingFunc
#
# rag_hf = LightRAG(
#     working_dir="./hf_demo",
#     llm_model_func=hf_model_complete,  # Hugging Faceモデルでのテキスト生成
#     llm_model_name='meta-llama/Llama-3.1-8B-Instruct',  # HFのモデル名
#     embedding_func=EmbeddingFunc(
#         embedding_dim=384,
#         max_token_size=5000,
#         func=lambda texts: hf_embedding(
#             texts,
#             tokenizer=AutoTokenizer.from_pretrained("sentence-transformers/all-MiniLM-L6-v2"),
#             embed_model=AutoModel.from_pretrained("sentence-transformers/all-MiniLM-L6-v2")
#         )
#     ),
# )
```

---

## 複数ファイルの取り込みやテキスト以外のファイルのサポート

`textract`を使ってPDFやDocxなどをテキスト化して挿入可能です。  
下記はコード例だけ示します。

### Multi-file対応（解説のみ）
```python
# import textract
# file_path = 'TEXT.pdf'
# text_content = textract.process(file_path)
# rag.insert(text_content.decode('utf-8'))
```

**解説:**  
`textract`は多様なファイル形式（PDF, DOCX, PPTX, CSVなど）をテキストに変換するライブラリです。  
変換後のテキストを`rag.insert()`で挿入可能です。

---

## カスタムナレッジグラフの挿入

独自のKG(ナレッジグラフ)をJSON形式で挿入できます。  
ここではNeo4Jなどの外部ストレージは使わず、デフォルト実装（NetworkX）を利用します。

### カスタムKG挿入例（解説のみ）
```python
# custom_kg = {
#     "entities": [
#         {
#             "entity_name": "CompanyA",
#             "entity_type": "Organization",
#             "description": "A major technology company",
#             "source_id": "Source1"
#         },
#         {
#             "entity_name": "ProductX",
#             "entity_type": "Product",
#             "description": "A popular product developed by CompanyA",
#             "source_id": "Source1"
#         }
#     ],
#     "relationships": [
#         {
#             "src_id": "CompanyA",
#             "tgt_id": "ProductX",
#             "description": "CompanyA develops ProductX",
#             "keywords": "develop, produce",
#             "weight": 1.0,
#             "source_id": "Source1"
#         }
#     ],
#     "chunks": [
#         {
#             "content": "ProductX, developed by CompanyA, has revolutionized the market.",
#             "source_id": "Source1",
#         },
#     ],
# }
#
# rag.insert_custom_kg(custom_kg)
```

**解説:**  
`insert_custom_kg`を使えば、事前に定義したエンティティ・関係・チャンクをLightRAG内部のKGに統合できます。

---

## 不要なエンティティの削除

### エンティティ削除（解説のみ）
```python
# rag.delete_by_entity("Project Gutenberg")
```

**解説:**  
`delete_by_entity`で特定エンティティ名を持つノードをKGから削除できます。

---

## グラフ可視化（任意）

ここでは可視化は別途としますが、`networkx`や`pyvis`を用いてHTMLで可視化も可能です。

```python
# ※本コードは実行例としてはコメントアウト
from pyvis.network import Network
import networkx as nx

G = nx.read_graphml('./dickens/graph_chunk_entity_relation.graphml')
net = Network(notebook=True)
net.from_nx(G)
net.show('knowledge_graph.html')
```

**解説:**  
`pyvis`を用いると、生成されたナレッジグラフをHTML形式で可視化できますが、Neo4Jによる大規模可視化は今回は省略します。

---

## まとめ

ここまでで、LightRAGの基本的な使用例をGoogle Colab風に整理しました。

- コンテンツ挿入: `rag.insert()`
- クエリ実行: `rag.query("質問文", param=...)`
- 多様なLLMやEmbeddingsに対応: OpenAI/HF/Ollama対応例
- テキスト以外のファイル対応: `textract`でPDF等挿入
- カスタムKG挿入やエンティティ削除

これらを組み合わせることで、独自ドキュメントやナレッジをRAGで活用し、よりインテリジェントなクエリアンサーや情報抽出が可能になります。

興味があれば、[arXiv論文(英語)](https://arxiv.org/abs/2410.05779)や[LearnOpenCVでの紹介(英語)](https://learnopencv.com/lightrag)などを参照してください。


## 📒ノートブック

https://colab.research.google.com/drive/12SG7-Xd3uYiNlp7wQnQ7gJggrQOjcxNB?usp=sharing

## 参考サイト

https://lightrag.github.io

<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>