graphRAGをAzure OpenAIで試してみる

# graphRAGをAzure OpenAIで試してみる

## graphRAGとは？
Microsoft ResearchにてgithubにOSS公開された、構造化階層型のRAGライブラリ。（graphRAG自体はアプローチの名称であり、ライブラリ名称も同じ、ということのよう。）テキストデータからエンティティを抽出してナレッジグラフを作成し、RAGと組み合わせて使用することで回答精度を向上させることができる。

ソリューションアクセラレータというIaCコードも付帯されていてAzure AI Search等のリソースを手軽に作ってくれるようだが、今回はローカルとLLM、Embeddingsのみエンドポイント指定で利用する最小構成で利用してみる。

## インストール
rustのインストール
graphragをインストールしようとしたところrustのインストールを求められたのでインストールする。（環境によっては不要かと。）

```bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```
→PATHを通すため、terminal再起動

graphragインストール
```bash
pip install graphrag
```

## 設定
ワークスペース用のディレクトリ、知識用の入力ファイル・ディレクトリを作成
```bash
mkdir -p ./test/input
```

GraphRAG用ワークスペースの設定
```bash
python -m graphrag.index --init --root ./test
```
./testに構成ファイル等が作成されるので修正する。

### settings.yamlの修正
APIキーの設定。Azure OpenAIのLLM(gpt-4o等）とEmbeddingsの設定例。
.envファイルが作成されるのでそちらで環境変数にAPIKeyを設定するのが本筋だが、ひとまずベタ書き。

```yaml
encoding_model: cl100k_base
skip_workflows: []
llm:
  api_key: [API Key]
  type: azure_openai_chat # or azure_openai_chat
  model: gpt-4o
  model_supports_json: true # recommended if this is available for your model.
  # max_tokens: 4000
  # request_timeout: 180.0
  api_base: https://[deploy-name].openai.azure.com/
  api_version: 2024-05-01-preview
  # organization: <organization_id>
  deployment_name: gpt-4o
  # tokens_per_minute: 150_000 # set a leaky bucket throttle
  # requests_per_minute: 10_000 # set a leaky bucket throttle
  # max_retries: 10
  # max_retry_wait: 10.0
  # sleep_on_rate_limit_recommendation: true # whether to sleep when azure suggests wait-times
  # concurrent_requests: 25 # the number of parallel inflight requests that may be made
  # temperature: 0 # temperature for sampling
  # top_p: 1 # top-p sampling
  # n: 1 # Number of completions to generate

parallelization:
  stagger: 0.3
  # num_threads: 50 # the number of threads to use for parallel processing

async_mode: threaded # or asyncio

embeddings:
  ## parallelization: override the global parallelization settings for embeddings
  async_mode: threaded # or asyncio
  llm:
    api_key: [API key]
    type: azure_openai_embedding # or azure_openai_embedding
    #model: text-embedding-ada-002
    api_base: https://[deploy-name].openai.azure.com/
    api_version: 2024-02-15-preview
    # organization: <organization_id>
    deployment_name: text-embedding-ada-002
    # tokens_per_minute: 150_000 # set a leaky bucket throttle
    # requests_per_minute: 10_000 # set a leaky bucket throttle
    # max_retries: 10
    # max_retry_wait: 10.0
    # sleep_on_rate_limit_recommendation: true # whether to sleep when azure suggests wait-times
    # concurrent_requests: 25 # the number of parallel inflight requests that may be made
    # batch_size: 16 # the number of documents to send in a single request
    # batch_max_tokens: 8191 # the maximum number of tokens to send in a single request
    # target: required # or optional
  
```

知識用の入力データの指定（今回はtxtファイルで用意したので特に修正なし）
```yaml
input:
  type: file # or blob
  file_type: text # or csv
  base_dir: "input"
  file_encoding: utf-8
  file_pattern: ".*\\.txt$"
```

./test/input にtxtファイルを用意する。
今回は以下のwikiの全文をコピペしたファイル（hikaru.txt）を配置した。

光る君へ （wikipedia）
https://ja.wikipedia.org/wiki/%E5%85%89%E3%82%8B%E5%90%9B%E3%81%B8

### インデクス作成
```bash
python -m graphrag.index --root ./test
```
→量によってはEmbeddingsのクォータ制限を絞っているような場合に途中でエラーが出ることもあるが、しばらく待って再試行でレジュームされる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288299/348d69ec-0121-5f83-43e8-094c45b381ff.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288299/b518e866-40da-9659-fa42-448d906aa689.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288299/b325f81b-c748-e251-a50d-c946d34b9863.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288299/954b83f4-48a3-587b-a20d-553ed2c3aaf9.png)


完了するまで数十分かかった。

## graphRAG問い合わせ実行

```bash
python -m graphrag.query --root ./test --method local "清少納言は誰に仕えていた？"
```

```bash
SUCCESS: Local Search Response: 清少納言は、平安時代中期の女流作家であり、特に『枕草子』の著者として知られています。彼女は一条天皇の中宮である藤原定子に仕えていました。藤原定子は、藤原道長のライバルである藤原道隆の娘であり、清少納言はその宮廷生活の中で多くの文学的活動を行いました。

### 清少納言の仕え先

- **藤原定子**: 清少納言は一条天皇の中宮である藤原定子に仕えていました。藤原定子の宮廷は、当時の文化と文学の中心地であり、清少納言はその中で多くの文学作品を生み出しました。

### 宮廷での役割

清少納言は、藤原定子の宮廷で侍女として仕え、その知識と教養を活かして多くの文学作品を執筆しました。彼女の代表作である『枕草子』は、宮廷生活や自然、日常の出来事についての随筆であり、平安時代の貴族社会の一端を垣間見ることができます。

### 影響と評価

清少納言の作品は、当時の宮廷文化や文学に大きな影響を与えました。彼女の鋭い観察力と豊かな表現力は、後世の文学者にも多大な影響を与え続けています。

清少納言が仕えていた藤原定子の宮廷は、彼女の文学的才能を開花させる場であり、その影響は現在まで続いています。
```



### ナレッジグラフの可視化
settings.yamlのgraphmlを変更することで、ナレッジグラフを出力させることが可能。

```yaml
snapshots:
  graphml: true
  raw_entities: false
  top_level_nodes: false
```

→output/artifactsに*.graphmlファイルができるようになる。
graphmlファイルの表示は手っ取り早くyEdというサービスで表示してみた。（エンティティ名が図中に表示されないのでイマイチわかりづらい）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288299/64d1059d-17f9-13f7-9cc3-4935c053e0fd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288299/1b8e566a-3625-6fe2-7106-774662b440f6.png)


上記質問の「清少納言」のエンティティのDescriptionは以下のとおり。このグラフとwikiのチャンクをベースにして回答している。


```text
"清少納言, also known as ききょう, is a female noble who interacts with まひろ and later starts writing '枕草子' to encourage 定子."
"清少納言 (Sei Shonagon) is a lady-in-waiting to Fujiwara no Teishi and the author of 'The Pillow Book'. She is known for her strong-willed and outspoken nature, as well as her extensive knowledge and independence."
"清少納言 is a historical figure and author of '枕草子', discussed in the TV program '歴史探偵'."
```


## 参考
https://note.com/avakansai/n/n82dcf5c8d02c

https://microsoft.github.io/graphrag/

https://internet.watch.impress.co.jp/docs/column/shimizu/1608736.html

https://atmarkit.itmedia.co.jp/ait/articles/2408/03/news056.html