Dify×Google Colabで簡単ナレッジ管理！ドキュメントの追加・更新を自動化する方法


![logo_Dify.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816986/62a6c6ed-92f5-b590-4c08-ad41f126a467.png)

## はじめに
本記事では、Google Colabを活用してDifyのナレッジにドキュメントを自動で追加・更新する方法をご紹介します。PythonスクリプトとナレッジAPIを組み合わせて、効率的なナレッジ管理を実現しましょう。

## 今回使用するデータ、開発環境
今回使用するデータは世界30ヵ国の食文化が記載されているデータです。
「食文化」と「追加の国」という2つのシートがあります。

開発環境：Google colaboratory

## データの整形
ナレッジに入れるためデータを整形していきます。

まずGoogle DriveをColabに接続します。
そして必要なライブラリをインポートし、使用するファイルを読み込みます。
```python
#Google DriveをColabに接続
from google.colab import drive
drive.mount("/content/drive/")

#必要なライブラリをインポート
import os
import pandas as pd
import requests

#ファイルの読み込み
path = "my_path"
file_name = "culture.xlsx"
sheet_name = "食文化"
df = pd.read_excel(os.path.join(path,file_name),sheet_name=sheet_name)
df.head()
```
[出力]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816986/08df934c-a466-d378-e659-162e27169217.png)


csvファイルやexcelファイルをDifyに入れたとき、カラムが一つの方がチャンク分けしやすかったので、そのように変更します。
```python
df["country_food_info"] = df["country"] + ":" + df["food_info"]
df = df["country_food_info"]
df.head()
```
[出力]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816986/f993b66e-448b-93dc-e80a-7b43fe5cdec4.png)

エクセルを保存します。
```python
output_file = "output.xlsx"
df.to_excel(os.path.join(path,output_file),index=False)
```
これでデータの整形は完了です。

## 空のデータセットを作成
空のデータセットを作成する前にAPIキーを作成しましょう。
Difyを開き、ナレッジのAPIから「＋新しいシークレットキーを作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816986/98c6393f-16cb-d4bd-782b-a5bf30351cfb.png)
APIキーをコピーしておきましょう。

以下は空のデータセットを作成するコードです。
```python
API_KEY = "先ほどコピーしたAPIキー"
BASE_URL = "https://api.dify.ai/v1"

def create_empty_dataset(BASE_URL,API_KEY):
  url = f"{BASE_URL}/datasets"
  headers = {
      "Authorization" : f"Bearer {API_KEY}",
      'Content-Type': 'application/json'
  }
  data = {
      "name": "food_culture", #データセット名
      "permission": "only_me" 
      }

  response = requests.post(url,json = data,headers = headers)
  return response


result = create_empty_dataset(BASE_URL,API_KEY)
print(result.status_code)
```
「200」と出力されたら成功です。

Difyを開いてナレッジに空のデータセットが作成されているか確認しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816986/6a0edc9e-7e4c-3fa3-0b7c-a18678cf2c9d.png)

## ファイル内にドキュメントを作成する。
先ほど作成したファイル内にドキュメントを作成していきます。

以下のコードを実行し、"id"の値をコピーしましょう。
```python
print(result.json())
```
以下はドキュメントを作成するコードです。
```python
import json
DATASET_ID = "先ほどコピーしたid"

def upload_spreadsheet(dataset_id, file_path, api_key, base_url):
    url = f"{base_url}/datasets/{dataset_id}/document/create_by_file"
    headers = {
        "Authorization": f"Bearer {api_key}",
    }
    data = json.dumps({
            "data_source":'先ほどコピーしたid',
            "name":"food_culture",
            "indexing_technique": "high_quality",
            "process_rule": {
                "rules": {
                    "pre_processing_rules": [
                        {"id": "remove_extra_spaces", "enabled": True},
                        {"id": "remove_urls_emails", "enabled": True}
                    ],
                    "segmentation": {
                        "separator": '"country_food_info":', #セグメント識別子
                        "max_tokens": 500
                    }
                },
                "mode": "custom"
            }
    })

    files = {
        "data": (None, data, "text/plain"),  # JSONデータ
        "file": open(file_path, "rb")       # アップロードするファイル
    }
    response = requests.post(url, headers=headers, files=files)
    return response


FILE_PATH = os.path.join(path,output_file)  # アップロードするスプレッドシートファイルのパス
result = upload_spreadsheet(DATASET_ID,FILE_PATH,API_KEY,BASE_URL)
print(result.status_code)
```
200と出力されたら成功です。
確認のため、データセット内にドキュメントが作成されているかを確認しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816986/5f397e03-de23-9075-3cb4-2a41e1851d23.png)


# ファイルを通してドキュメントを更新
最後にドキュメントを更新していきましょう。

先ほどと同様に、以下のコードを実行し、"id"の値をコピーしましょう。
```python
print(result.json())
```

次に更新結果が分かりやすいように追加のデータを読み込みます。
```python
sheet_name = "追加の国"
add_df = pd.read_excel(os.path.join(path,file_name),sheet_name=sheet_name)
add_df.head()
```
[出力]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816986/6110a9ce-266b-63fa-ff85-9b82a9ebf8b8.png)

追加データも元データと同じように処理し、元データと結合して一つのデータにします。
```python
add_df["country_food_info"] = add_df["country"] + ":" + add_df["food_info"]
add_df = add_df["country_food_info"]
df = pd.concat([df,add_df],axis=0)

output_file = "output.xlsx"
df.to_excel(os.path.join(path,output_file),index=False)
```

以下はドキュメントを更新するコードです。
```python
DOCUMENT_ID = "先ほどコピーしたid"

def upload_spreadsheet(dataset_id, document_id, file_path, api_key, base_url):
    url = f"{base_url}/datasets/{dataset_id}/documents/{document_id}/update_by_file"
    headers = {
        "Authorization": f"Bearer {api_key}"
    }
    data = {
            "name":"Dify",
            "indexing_technique": "high_quality",
            "process_rule": {
                "rules": {
                    "pre_processing_rules": [
                        {"id": "remove_extra_spaces", "enabled": True},
                        {"id": "remove_urls_emails", "enabled": True}
                    ],
                },
                "mode": "custom"
            }
    }
    files = {
        "file": open(file_path, "rb")  # スプレッドシートをそのまま送信
    }
    response = requests.post(url, headers=headers, json=data, files=files)
    return response


FILE_PATH = os.path.join(path,output_file)  # アップロードするスプレッドシートファイルのパス

result = upload_spreadsheet(DATASET_ID,DOCUMENT_ID,FILE_PATH,API_KEY,BASE_URL)
print(result.status_code)
```

200と出力されたら成功です。
ドキュメントが更新されているかを確認しましょう。

## おわりに
これで、Google Colabを活用したDifナレッジへのファイル追加・更新の自動化が実現しました。日々の作業を簡略化することで、ナレッジ管理にかかる時間を削減し、より生産的なタスクに集中できるようになります。
この記事でご紹介した方法以外にも、ドキュメントの削除など様々な自動化が可能なので、試してみましょう。

## 参考文献
[Maintain Knowledge Base via API](https://docs.dify.ai/guides/knowledge-base/maintain-dataset-via-api)