LLMを社内で活用する場合に必要な知識について【RAG】【オープンソースモデル】

# はじめに
今年はLLMが流行りましたね。このビッグウェーブに乗るしかないと、社内での活用を考えてる人も多いかと思います。今回の記事は、
- 社内にあるデータについてLLMに答えてもらいたいけど、どうすればいい？
- データの流出が怖いのだけど、安全にデータを扱えるの？
- お金がかかるって本当？

という方におすすめの記事となっております。上記の疑問に対する回答は、この記事の最後に記載しています。そもそもLLMがあんまりわからないという方は[5分でわかる](https://qiita.com/RisaM/items/8158e31572e09f1d637f)LLMという記事をご覧ください。

# LLMのチューニング方法
ChatGPTを使ったことがある人はわかるかもしれませんが、ChatGPTが知らない情報については答えてくれなかったり、嘘の情報を伝えてきますよね。LLMは学習データにない情報は答えることができません。なので、社内情報を答えてくれるLLMがほしいと思った場合にはLLMをチューニング(調整)する必要があるのです。

LLMのチューニング方法で代表的なものは、ファインチューニングとプロンプトエンジニアリングです。

### ファインチューニング
ファインチューニングとは、LLMに新しい追加のデータを学習させることです。社内情報を答えて欲しい場合には、学習済みのLLMに、さらに社内情報を学習させるイメージです。ファインチューニングにはいくつか問題点があります。
- ある程度のデータ量が必要になる
- ゼロから学習するほどではないが、コストがかかる
- そもそもファインチューニングは事実を教えるのに適していないという見解もある(https://www.anyscale.com/blog/fine-tuning-is-for-form-not-facts)

### プロンプトエンジニアリング
プロンプトとは、モデルに対する指示文のことです。ChatGPTを使う時にみなさんが入力する文章もプロンプトの一種です。プロンプトエンジニアリングは、プロンプトをうまく調整することで、欲しい回答を手に入れる技術を指します。ChatGPTがちゃんと答えてくれなくて、試行錯誤した経験がある人もいると思います。それもプロンプトエンジニアリングです。プロンプトエンジニアリングは方法論が研究されており、うまくいくやり方というのが存在します。方法論については、割愛させていただきます。

社内情報を答えて欲しい場合には、プロンプトに社内情報をいれこんでしまえばいいわけです。例えば、「⚪︎⚪︎マニュアル...　上記のマニュアルを参考に答えてください。」というように、マニュアル全体をプロンプトにいれてしまいます。そういった方法にも問題点があります。
- 入力可能な文章量に制限がある
- コストが文章量に比例して膨れていく

ただし、最近リリースされたGPT-4 turboでは改善されており、数十ページの入力が可能となっています。

# RAG(Retrieval Augmented Generation：検索拡張生成)
ファインチューニングやプロンプトエンジニアリングの問題点を解消する技術として注目されているのがRAGです。RAGの仕組みもかなりシンプルです。RAGを使う場合の質問応答の流れを説明します。
1. あらかじめ、外部データ(今回でいえば社内情報)をナレッジベース化します。つまり、検索かけやすい形にデータベース化します。
2. 質問が来たら、ナレッジベースで検索をかけて、質問と関連する情報を抽出します。
3. 抽出した情報をプロンプトに組み込んで、LLMに渡します。
4. 抽出した情報をもとにLLMが回答を生成します。

RAGの仕組みはLangChainやLlamaindexを使うことで比較的簡単に実装することができます。

# LLMのモデル
LLMのモデルは大きくOpenAIのモデルとOSS(Open Source Software)に分けられます。それぞれに、メリットデメリットがあります。

### OpenAIのモデル
ChatGPTを開発したのはOpenAIという会社です。OpenAI社はGPTというLLMをもともと開発しており、ChatGPTはGPTから誕生しました。GPTは、GPT-3、GPT-3.5、GPT-4というようにシリーズ化されており、GPT-4が最新モデルとなっています。OpenAI社はGPTのAPIを有料で提供しています。OpenAIのAPIを使うことで、容易に対話型AIを作ることが可能となっています。(AzureからもOpenAIのAPIを使用することが可能です。また、on your data機能を使うことで、社内データを回答する仕組みを構築できます。https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/use-your-data?tabs=ai-search)

### OpenAIのモデルを使うメリット
- 回答精度が高い
- 応答速度が速い
- モデルのアップデートにより、新機能が追加されたり、精度が改善されたりする

### OpenAIのモデルを使うデメリット
- モデルが勝手にアップデートされる
- インターフェースが勝手にアップデートされる
- 文章量に比例してコストがかかる(※)
- 情報を外部に送信する必要がある

※モデルによってコストは変わります(https://openai.com/pricing)

OpenAIのモデルはとても性能が高いですが、たくさんの文章を扱わせようとすると、コストがかかってしまいます。また、外部に情報を送信することになるので、顧客データなどを読み込ませる場合には注意が必要です。ChatGPT Enterpriseという企業向けのセキュアなプランもありますが、こちらも契約にお金がかかります。

### OSS(Open Source Software)タイプのモデル
OpenAIのAPIを使う方法以外にもオープンソースのモデルを呼び出す方法があります。オープンソースモデルで有名なのはMeta社が提供するLlama2です。日本語対応のオープンソースモデルもいくつか存在します。例えば、ELYZAというモデルは東京大学松尾研究室が提供するモデルで、Llama2をチューニングして作られています。(https://note.com/elyza/n/na405acaca130)

### OSSタイプのモデルのメリット
- 情報を外部に持ち出す必要がない
- 様々なモデルを選択可能
- ファインチューニング等のカスタマイズ可能

### OSSタイプのモデルのデメリット
- 回答精度がOpenAIと比較すると低い

応答速度とコストは環境やスペックに依存します。オープンソースモデルを使うことで、情報を外部に出さない仕組みを構築することが可能となっています。しかし、現時点では回答精度がOpenAIと比較すると低いという大きな問題点があります。ただし、性能に関しては、今後改善されていく可能性があります。

# まとめ
- 社内にあるデータについてLLMに答えてもらいたいけど、どうすればいい？
**【回答】現時点では、RAGを使うのをおすすめします。ただし、入力可能な文章量は今後増えていくと思われ、社内データをまるごとプロンプトに含められるかもしれません。**
- データの流出が怖いのだけど、安全にデータを扱えるの？
**【回答】ChatGPT Enterpriseなどの企業向けのプランに加入するのが簡単ですが、契約にお金がかかります。オープンソースモデルを使用すれば、外部に情報を出さない仕組みを構築可能です。**
- お金がかかるって本当？
**【回答】お金がかかります。OpenAIのAPIを使うと、文章量に応じてコストがかかります。オープンソースモデルを使用すれば、低コストで済む場合があります。**