【Part1】NotionとLangChainを統合させてみた 

documentReaderなどで、ストレージに置いたファイルを読み込んで回答させる記事はよくあります。私はNotionを使っているのですがリアルタイム情報からNotionの情報を読み込ませたいなとよく思っていました。そこで今回はNotionのリアルタイム情報を取得して答えさせてみようと思います。
ちなみに下記の記事で、名字（小畑）が使われますが、筆者の名前ですｗ

▼ここを参考に。

[Notion Reader - LlamaIndex 🦙 0.7.14 (gpt-index.readthedocs.io)](https://gpt-index.readthedocs.io/en/latest/examples/data_connectors/NotionDemo.html)

前も紹介したんですが、Llamaindexというライブラリがあり、これがすごく便利。。いろんなドキュメントローダーやらツールがゴロゴロ転がっています。興味ある人は一度見てみるといいと思います。ドキュメントローダーのコードとか見れます。そこまで難しいコードではないので、ちょろっとPythonやったことある人はすぐ理解できると思います。

今回はLangChainとLlamaindexライブラリのハイブリッドです！！（結構この組み合わせが定番になりつつある。。）

まずは、ゆっくりコードの解説です。

下記で必要なパッケージをインストールします。

```python
#必要ファイルインストール
!pip install langchain
!pip install openai
!pip install llama-index
```

いつも見慣れたパッケージ群ですねｗ

```python
import os
import openai
os.environ["OPENAI_API_KEY"]= #あなたのOPENAI APIKEYを入力してください。
openai.api_key = os.environ["OPENAI_API_KEY"]
```

OPENAIのKEYを環境変数に設定します。

```python
rom llama_index import ListIndex,NotionPageReader
```

ここで、ListIndex(Indexを突っ込むDB）とNotionPageReaderという読み込みクラスをセットします。

NotionのAPIの仕様は、リクエストを投げてもそのままMarkdownが帰ってくるわけではないので、こういうライブラリがあると成形をこっちがしなくて済んで楽ちんですね。

▼下記でNotionAPIキーを取得してきます。

**https://www.notion.so/my-integrations**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418662/88787ca2-fb71-d0ea-18c4-94be71cfa42b.png)


赤丸がシークレットキーです。

それを下記コードのintegration_token変数に格納します。

また、ページIDも取得してくる必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418662/99cce6c7-77f9-f201-7f38-fb38470883ce.png)


赤丸部分を下記のpage_ids変数の文字配列として格納します。

▼コードは下記のような感じ

```python
integration_token ="" #Notionのシークレット
page_ids = [""] #NotionのページID

#読み込み
documents = NotionPageReader(integration_token=integration_token).load_data(
    page_ids=page_ids
)
print(documents)

#indexDBに入れる
index = ListIndex.from_documents(documents)
query_engine = index.as_query_engine()
response = query_engine.query("小畑は何歳？")

print(response)
```

よし！コードはできた。。

# さあ実行！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418662/3ef5c5fb-14c5-b587-308e-8042c36acdb1.png)


ふぁっ！？

なんかうまく取れてないみたいですね・・・

いろんな英語サイトを旅してたら、「コネクトの追加」をやってね。とのこと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418662/cac7a2cf-921d-d7f9-ad6e-1da9df9ce657.png)
ここで、自分のAPIエンドポイントに対してコネクトします。
※ちなみに無料プランだと、ここ毎回やらないといけないみたい・・・
はっ！！わたしが無料プランだったのがいけなかったのか！！
エンタープライズだとオート許可が実行できるみたいです。

[APIコネクトの追加・管理 – Notion (ノーション)ヘルプセンター](https://www.notion.so/ja-jp/help/add-and-manage-connections-with-the-api)

それにしても、PageIDが取れなかったときの分岐を用意するか、TryCatchくらい用意してくれてもいいのにとも・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418662/1cd28adc-e5ea-4e5a-c759-47690675b55c.png)


requestsで取ってきたjsonデータを丸ごとforで回そうとしてる。。ほんとに取れたかどうかもわからないだろうに・・・

まあ、エラー時にコードを見ればいいか・・・

でも、もし本番とかで使うときは、このライブラリに色々修正をくわえる必要がありそうです。

と愚痴ったところで・・

# リベンジ！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418662/7a906ac5-6066-d298-328c-952a1919b05a.png)


おぉ～～取ってきましたね。

超簡単。。。簡単すぎる。。。

# ちなみにページの検索もできる！

https://github.com/jerryjliu/llama_index/blob/896820ace13f0b4c15d99aaffafa5fb4dc458864/llama_index/readers/notion.py#L114C14-L114C14

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418662/e6392b52-dabd-057c-1442-946e3574e6df.png)


ちなみにLlamaindexの公式では紹介されてませんが、検索機能もあるようです。
ここの丸部分のsearch関数を使えばできるみたいです。。。ほんとにできるのか・・・
引数は、queryで、この変数に検索文字列を入れれば回答してくれるようですね。

※List[Document]で返してないですね。このままIndex化用のfrom_ducuments関数にぶち込むと絶対に怒られるので、一旦printで表示してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418662/32c8bfcc-abb1-ca15-6b61-e08a47526735.png)


「小畑」で私のNotionのドキュメントから下記を取ってきました。

```python
['2bb79125-2d7b-4cb1-afd5-1ccb24bfcd9c']
```

ふむふむ。。ちゃんと自己紹介用のNotionページのIDと合ってる！使えたのか。。

ということでドキュメントも検索もできるようです。

▼下記が今回のサンプルコードです。▼

```python
# -*- coding: utf-8 -*-
"""langchain_Notion_Integ

Automatically generated by Colaboratory.

Original file is located at
    https://colab.research.google.com/drive/1jesBLOEWasPi8OkMo-nGf7ULO-o2aiSa
"""

#必要ファイルインストール
!pip install langchain
!pip install openai
!pip install llama-index

import os
import openai
os.environ["OPENAI_API_KEY"]="" #ここにあなたのOPENAPI KEYを！
openai.api_key = os.environ["OPENAI_API_KEY"]

from llama_index import ListIndex,NotionPageReader

integration_token =""　#ここにあなたのNotionKEYを！
page_ids = [""]　#ここにあなたのNotionページIDを！

#読み込み
documents = NotionPageReader(integration_token=integration_token).load_data(
    page_ids=page_ids
)
print(documents)

index = ListIndex.from_documents(documents)
query_engine = index.as_query_engine()
response = query_engine.query("小畑は何歳？")

print(response)
```