【Dify】質問分類器とRAGによる社内情報問い合わせシステムの構築練習

# はじめに

RAGを用いた社内情報問い合わせシステムの構築練習をしてみます。

## 環境
- 使用PC
ノートPC(Surface Go3 Laptop)
Windows11


- 使用ツール
Docker
Ollama
phi-3 mini(ローカル)
Dify(ローカル)

# 本文

## システムの構築
システムとしては、質問が本に関する質問か映画に関する質問かを分類する質問分類器を使って分岐を設けました。分岐先はオススメの本を紹介するLLMとオススメの映画を紹介するLLMになっています。
最終的な回答としてはオススメの本もしくは映画を紹介してくれるというシステムです。
なお、今回はphi3miniを使う都合上、プロンプトに英語を使用します。

![社内情報問い合わせ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838427/d2170a13-5eab-8a70-a93d-7bc2cbd63ebd.jpeg)

## なぜ質問分類器とRAGを組み合わせるのか
　RAGだけでも良いのでは？と思う方もいるかも知れませんが、社内情報を検索するにあたっては当然ハルシネーションを避けなくてはいけません。ハルシネーションを防ぐ・極力回避するためにはRAGでの高い検索精度が求められます。
 ではどのように検索精度を高めるか。いろいろな方法があると思いますが、まず考えられるのが参照する外部ファイルの文章は短ければ短いほど良いということです。
 
 文章が長いと、それだけ検索対象が大きくなるということになります。検索対象が大きいとどうなるでしょう。質問に対して似たような文章が複数見つかる可能性が高くなり、場合によっては誤った情報を検索結果として提示してしまうかもしれません。
 もちろんハイブリッド検索を使うなど検索方法を工夫するというやり方もありますが、それよりも簡単な方法としては「参照文章を短くする」だと思います。

 また、今回使用するPCの性能やLLMの性能が低いので、読み込み文章を短くして回答速度を速くしたいという側面(都合)もあります。

 この参照する文章を短くするための工夫が「質問分類器」です。
質問分類器で質問内容をある程度絞ることにより、RAGで検索すべき文章を切り替えることができます。

例：
質問分類器で「就業規則」、「社長方針」、「社是」のいずれかに分類できるとする。

質問：「始業時間を教えて」
質問分類器：「就業規則」
ナレッジ：「就業規則.pdfから始業時間を検索、LLMに渡す」
LLM：「ナレッジからの情報と質問を基に回答を生成」


こんな感じの動作をイメージしています。


### 事前準備：ナレッジ(参照文章)の設定
　まずはナレッジの設定です。
 
ChatGPTで架空の会社の「就業規則」、「社長方針」、「社是」を作り、PDF化します。
PDF化したデータをDifyのナレッジに登録すれば準備は完了です。
 
 ![ナレッジ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838427/d6d8af6e-7b5a-ae73-5d31-eeacb51c1490.jpeg)

このように3つの文章がナレッジとしてセットできました。

### 質問分類器ブロック

次に質問分類器の設定です。

![質問分類器.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838427/07e27654-de4f-dde4-0e3a-42f894190e75.jpeg)

質問を3パターンに分類するために、3つのクラスを用意しました。

~~~
クラス1： About Corpolate Philosophy question.(社是に関する質問)
クラス2： About President's Policy question.(社長方針に関する質問)
クラス3： About Employment Rules question.(就業規則に関する質問)
~~~


### 知識習得ブロック
 あらかじめセットしたナレッジを呼び出せるように、知識習得ブロックを設定します。

 ![知識習得.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838427/e6b23186-c5f5-a8b2-a836-171289e8c001.jpeg)

 
### LLM3:就業規則AI
 各分岐にLLMブロックを配置します。
 例として就業規則AIを載せます。

![LLM3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838427/27e79d1a-8ad0-a7f5-1657-04ab8831467e.jpeg)

~~~
コンテキスト
知識取得3:/result

システムプロンプト
You have to answer the question based on {{#context#}}.
Question from input.

input:/question
~~~


## 結果
構築したシステムを使ってみましょう。

### 入力
~~~
when they start working time?
(訳：仕事を開始する時間はいつですか？)
~~~

### 質問分類器
~~~
About Employment Rules question.
(クラス3に分類)
~~~

意図通り、就業規則に関する質問に分類してくれました。

### 知識習得

~~~
Sample Inc.

Chapter 1: General Provisions
Article 1 (Purpose)
These rules establish standards to enable employees of Future Drone Systems Inc.
(hereinafter referred to as \"the Company\") to perform their duties smoothly and
nefficiently, and aim to clarify employees' working conditions.
Article 2 (Scope of Application)
These rules apply to all full-time employees, contract employees, and part-time or 
temporary workers employed by the Company. However, if individual employment 
contracts specify different terms, those terms shall take precedence.
Chapter 2: Working Hours and Breaks
Article 3 (Working Hours)
1. Working hours are generally as follows: 
 Start time: 9:00 AM 
  End time: 6:00 PM 
  Break time: 12:00 PM to 1:00 PM 
2. For positions subject to discretionary working arrangements, 
 the terms shall be agreed upon in advance in individual contracts.

(訳：
サンプル株式会社就業規則

第1章 総則
第1条（目的）
この規則は、サンプル株式会社（以下「当社」という）の従業員が円滑かつ効率的に職務を遂行できるように基準を定め、従業員の労働条件を明確にすることを目的とする。
第2条（適用範囲）
この規則は、当社が雇用するすべての正社員、契約社員、パートタイムまたは臨時雇用者に適用する。ただし、個別の雇用契約で異なる条件が定められている場合は、その条件が優先する。
第2章 労働時間および休憩
第3条（労働時間）
1. 労働時間は、原則として次のとおりとする。
始業時刻：午前9時
終業時刻：午後6時
休憩時間：午後12時から午後1時
2. 裁量労働制の対象となる職種については、個別の契約であらかじめ条件を合意する。)
~~~

検索で就業時間に関する文章を取得できていそうですね。

### 出力
~~~
According to Chapter 2 of Sample Inc.'s employment rules 
on Working Hours and Breaks, the standard workday for most full-time employees 
begins at 9:00 AM with a one-hour lunch break from 12:00 PM to 1:00 PM. 
This schedule is designed to ensure that employees have adequate rest periods 
during their shifts while maintaining efficient operations within the company.

(訳：Sample Inc. の就業規則第 2 章「労働時間と休憩」によると、
ほとんどのフルタイム従業員の標準的な勤務時間は午前 9 時に始まり、
午後 12 時から午後 1 時まで 1 時間の昼休みがあります。
このスケジュールは、従業員がシフト中に十分な休憩時間を確保しながら、
社内の効率的な業務を維持できるように設計されています。)
~~~

若干余計な情報もありますが、就業時間が9時からということがわかりましたね。
まずまずではないでしょうか。


## まとめ
 質問分類器とRAGの組み合わせにより、性能の低いノートPCとローカルPCでも社内情報の検索システムを構築することができました。
 要した時間は大体こんな感じでした。
 - 質問分類器：2m30s
 - 知識習得：2m
 - LLM：2m
 
トータル6m30s。うーん、自分で元文章見て探した方が早そうですね。
実用化には程遠いですね。

ハイスペックなPCともう少し性能の良いLLMがあれば、実用化の目処が立つかもしれません。