清水理史の「イニシャルB」
NASの文書をChatGPTのコンテキストに! QNAPの全文検索エンジン「Qsirch」を活用
2023年6月12日 06:00
NASに蓄えられた文書を外部のアプリやサービスから活用するにはどうすればいいか? その回答のひとつとなるのが、NASへのAPIアクセスの活用だ。QNAPやSynologyなどのNASは、APIアクセスが可能となっている。
AIの普及により、NASに蓄えられた文書をChatGPTなどのコンテキストとして活用したいという例もあるはずだ。そのような場合、実際にどのように使えばいいのかを検証してみた。
質問時のコンテキストとしてNASの情報を使う
ChatGPTなどの汎用的な言語モデルは、誰もが知る常識的なことはある程度正しく回答できても、狭い分野や特定の情報に対しては、正しく回答できないことがよく知られている。
このような場合、その特定分野の情報をデータセットとして与えてモデルを微調整するファインチューニングを施すことも可能だが、コストも時間もかかるため、通常はプロンプトの中でコンテキストとして一定の情報を与え、その情報を元に回答させる「in-context Learning」という手法を使うことが多い。
たとえば、以下のようなプロンプトを使うのが一例で、コンテキストとして、架空のプロジェクトの情報を与え、「事前知識ではなく以下のコンテキストを活用して質問に答えてください」とすることで、与えられた情報をもとに回答を引き出すことができる。
事前知識ではなく以下のコンテキストを活用して質問に回答してください。
コンテキスト:
- プロジェクト「ブルー」は次世代の社員アシスタントAIを実現するための新規事業
- 社内文書をデータベース化しGPT-4ベースのチャットAIとして提供する
- 2024年4月の全社展開を目指す
- 予算規模は1億円
質問:
プロジェクトブルーについて教えてください。
こうした手法は、企業などが自社内の情報をAIで活用するために採用されることが多い。例えば、自社製品に関するドキュメント、自社のホームページの情報やQAリソース、社内掲示板などのディスカッション、メールデータなどを活用することで、自社の情報に関して回答するAIを用意することができる。
このように社内のデータを外部のアプリやサービスから利用できるようにすることで、さまざまな活用が考えられる。今回の目標は、こうした使い方を小規模な環境や個人でも実現する第一歩として、NASへのAPIアクセスを実現することだ。
具体的には、QNAPのNASで利用できる全文検索エンジン「Qsirch」を利用し、API経由でNASのデータを検索できるようにしてみる。
長くなってしまうためPythonの環境構築などの細かな話は省略するうえ、筆者自身が複雑なコードを書くことができないため、ポイントのみの解説となる点はご容赦いただきたい。
QsirchのAPIを活用する
まずは、QsirchのAPIを確認してみよう。QsirchがインストールされたQNAPのNAS(メモリ2GB以上必要、推奨4GB以上)を用意し、以下のアドレスでアクセスすることで、APIの使い方を確認できる。
「login」や「search」などの機能ごとに必要なパラメーターなどが記載されているので、まずは確認しておくといいだろう。
今回はPythonでアクセスするが、ポイントとなるのは認証だ。検索のためのAPIを利用するには、事前にNASにログインする必要があり、その認証情報を引き継いだ状態で、ほかのAPIを実行する必要がある。
当初、最新のQsirch 5.x系の方法のドキュメントが見つからなかったため、やり方がわからなかったのだが、結局のところ、最初にユーザー名とパスワードを指定してログインすると、QQS_SIDというトークンが発行されるので、これを次のリクエストのヘッダーに含めて検索などを実行すればいいようだ。
というわけで、QsirchにAPI経由でアクセスするコードが以下の通りになる。なお、今回は検索結果を3つのみ表示するように制限している。数を増やしたい場合は、コメント「# %% 検索実行」の2行下「apiurl = endpoint + "search?sort_by=created&sort_dir=desc&limit=3&q=" + query」の、「limit=3」の部分の数を増やせばいい。
# %% 初期設定
import requests, json
ipaddr = "192.168.1.16"
endpoint = "http://" + ipaddr + ":8080/qsirch/latest/api/"
# %% ログイン処理
apiurl = endpoint + "login/"
headers = {"Content-Type": "application/json"}
data = {"account": "testuser", "password": "Test1234"}
json_data = json.dumps(data)
res = requests.post(apiurl, data=json_data, headers=headers)
res_json = json.loads(res.text)
qqssid = res_json.get("qqs_sid")
#print(qqssid)
# %% 検索実行
query = "生成AI"
apiurl = endpoint + "search?sort_by=created&sort_dir=desc&limit=3&q=" + query
cookie = "QQS_SID=" + qqssid
headers = {"Content-Type": "application/json", "Cookie": cookie}
res = requests.get(apiurl, headers=headers)
res_json = json.loads(res.text)
#print(res_json)
for items_data in res_json["items"]:
print(items_data["name"] + "." + items_data["extension"])
print(items_data["content"])
# %% ログアウト
apiurl = endpoint + "logout/"
cookie = "QQS_SID=" + qqssid
headers = {"Cookie": cookie}
res = requests.get(apiurl, headers=headers)
#print(res)
実行結果をAIで活用すればいい
実行すると、以下のようにファイル名と内容のダイジェストが出力されるので、この出力をAIなどで活用することが可能になる。
例えば、まだアイデアの段階だが、次のようなフローが考えられる。
- ChatGPTに自然言語の質問文からQsirch用のキーワードを3つ生成してもらう
- 生成したキーワードで上記のようにQsirchを実行して参考にする文書を3つピックアップ
- ピックアップした3つの文書のダイジェストを合成してコンテキストを生成
- コンテキストについて、1の質問文を再びChatGPTに問い合わせる
OpenAIのAPIやLangChainを利用して、検索結果のテキストを冒頭で紹介したようにコンテキストとして含めたプロンプトをテンプレートとして生成し、ChatGPTに問い合わせすれば、さほど手間なくできそうだが、上記はQsirchのダイジェストテキストを使っているため精度が低い。本格的に使うなら、ソースの文書から全ページの文章を取り出して使う必要がありそうだ。
もちろん、QNAPやSynology、もちろんバッファローやアイ・オー・データ機器など、NASベンダーが自社NAS用のChatGPTプラグインやNAS向けChatGPTアプリを作ってくれれば、もっと話は早い。いや、ぜひそうなってほしいので、この場で強く要望したいところだ。