はじめに
本記事では、Google Colabを活用してDifyのナレッジにドキュメントを自動で追加・更新する方法をご紹介します。PythonスクリプトとナレッジAPIを組み合わせて、効率的なナレッジ管理を実現しましょう。
今回使用するデータ、開発環境
今回使用するデータは世界30ヵ国の食文化が記載されているデータです。
「食文化」と「追加の国」という2つのシートがあります。
開発環境:Google colaboratory
データの整形
ナレッジに入れるためデータを整形していきます。
まずGoogle DriveをColabに接続します。
そして必要なライブラリをインポートし、使用するファイルを読み込みます。
#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()
csvファイルやexcelファイルをDifyに入れたとき、カラムが一つの方がチャンク分けしやすかったので、そのように変更します。
df["country_food_info"] = df["country"] + ":" + df["food_info"]
df = df["country_food_info"]
df.head()
エクセルを保存します。
output_file = "output.xlsx"
df.to_excel(os.path.join(path,output_file),index=False)
これでデータの整形は完了です。
空のデータセットを作成
空のデータセットを作成する前にAPIキーを作成しましょう。
Difyを開き、ナレッジのAPIから「+新しいシークレットキーを作成」をクリックします。
以下は空のデータセットを作成するコードです。
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を開いてナレッジに空のデータセットが作成されているか確認しましょう。
ファイル内にドキュメントを作成する。
先ほど作成したファイル内にドキュメントを作成していきます。
以下のコードを実行し、"id"の値をコピーしましょう。
print(result.json())
以下はドキュメントを作成するコードです。
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と出力されたら成功です。
確認のため、データセット内にドキュメントが作成されているかを確認しましょう。
ファイルを通してドキュメントを更新
最後にドキュメントを更新していきましょう。
先ほどと同様に、以下のコードを実行し、"id"の値をコピーしましょう。
print(result.json())
次に更新結果が分かりやすいように追加のデータを読み込みます。
sheet_name = "追加の国"
add_df = pd.read_excel(os.path.join(path,file_name),sheet_name=sheet_name)
add_df.head()
追加データも元データと同じように処理し、元データと結合して一つのデータにします。
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)
以下はドキュメントを更新するコードです。
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ナレッジへのファイル追加・更新の自動化が実現しました。日々の作業を簡略化することで、ナレッジ管理にかかる時間を削減し、より生産的なタスクに集中できるようになります。
この記事でご紹介した方法以外にも、ドキュメントの削除など様々な自動化が可能なので、試してみましょう。