Gen AI in Action : 初めてのLLMアプリ作成 ＆ LLMアプリの本番稼働を加速

先日、こちらのウェビナーの講師を務めさせていただきました。

https://events.databricks.com/japan-data-ai-professional-workshop

**Gen AI in Action : 初めてのLLMアプリ作成 ＆ LLMアプリの本番稼働を加速**

> このバーチャル・ワークショップに参加し、LLMのアイデアを構築し、反復し、磨き上げて、本番で使えるソリューションに仕上げる方法を学びましょう。
>
> このバーチャル・ワークショップは、様々なユースケースにLLMを使用しようとしているデータ実務家に適しています。Gen AIを初めて学ぶ方にも、スキルを磨きたい方にも最適なイベントです。（本セッションは2時間を予定しています）
> - パート1：最初のLLMアプリを作る
>    - LLMテクノロジー入門： LLMがどのように機能し、どのような用途に使われる可能性があるのかを概観します。
>    - LLMの使い方
>    - 最初のRAG（Retrieval Augmented Generation）アプリの構築 
> - パート2：LLMアプリを本番環境に加速する
>    - 評価の構築
>    - アプリのプロダクション化

後日オンデマンド視聴できるようになりますが、こちらに簡単にダイジェストをまとめます。

# セッションで使用したノートブック

関連ノートブック含め、[こちらのリポジトリ](https://github.com/taka-yayoi/public_repo_2/tree/master/Gen_AI_in_action)に格納しています。

- Part 1: 初めてのLLMアプリ開発
    - [環境のセットアップ](https://github.com/taka-yayoi/public_repo_2/blob/master/Gen_AI_in_action/Part1/0.%20(instructor_only)%20-%20Lab%20Setup.py)
    - [Lab 1: プロンプト](https://github.com/taka-yayoi/public_repo_2/blob/master/Gen_AI_in_action/Part1/1.%20Prompt%20Engineering.py)
    - Lab 2: VectorDBの操作
        - [ベクトルストアのセットアップ](https://github.com/taka-yayoi/public_repo_2/blob/master/Gen_AI_in_action/Part1/2a%20-%20(instructor_demo)%20-%20Ingesting%20to%20Vector%20Search.py)
        - [ベクトルストアの操作](https://github.com/taka-yayoi/public_repo_2/blob/master/Gen_AI_in_action/Part1/2.%20Vector%20Search.py)
    - [Lab 3: 全てを組み立てる](https://github.com/taka-yayoi/public_repo_2/blob/master/Gen_AI_in_action/Part1/3.%20Building%20your%20first%20RAG.py)
- Part 2:  LLMアプリの本番稼働を加速
    - [環境のセットアップ](https://github.com/taka-yayoi/public_repo_2/blob/master/Gen_AI_in_action/Part2/0.1_lab_setup(instructor_only).py)
    - [クイックデモ - Notebook 1.1](https://github.com/taka-yayoi/public_repo_2/blob/master/Gen_AI_in_action/Part2/1.1_Evaluations.py)
    - [クイックデモ - Notebook 1.2](https://github.com/taka-yayoi/public_repo_2/blob/master/Gen_AI_in_action/Part2/1.2_Advanced_Chunking.py)
    - [高度なロジックのウォークスルー - Notebook 1.4](https://github.com/taka-yayoi/public_repo_2/blob/master/Gen_AI_in_action/Part2/1.4_Advanced_RAG_Bot.py)

# Part 1: 初めてのLLMアプリ開発

Databricksでは、生成AIを含むデータサイエンスやAIのための機能セットである[**Mosaic AI**](https://www.databricks.com/jp/product/machine-learning)を提供しています。

![Screenshot 2024-09-28 at 12.58.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a574b7b3-c4a0-24f3-d052-51da2e4d440f.png)

生成AIとは、コンテンツの**生成**にフォーカスしたAIのサブ領域です。
![Screenshot 2024-09-28 at 12.58.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3a0f6665-4798-43f9-5d40-6ea684f5c41c.png)

生成AIは、世界に存在する様々なメディアをベクトルに変換して取り扱います。

![Screenshot 2024-09-28 at 12.59.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/69b383d3-0a02-1650-03de-5ce6ec8b914b.png)

テキストの場合、英語や日本語をトークンに、そして、ベクトルに変換します。

![Screenshot 2024-09-28 at 13.00.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e84f0d4d-a351-25cf-8749-75de0271ea08.png)

このような生成AIを活用したLLMアプリケーションで活用が進んでいるのは、RAG(Retrieval Augumented Generation)です。以下のRAGの構成要素を見ていきましょう。

- モデル
- ベクトルストア
- オーケストレーター

![Screenshot 2024-09-28 at 13.01.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/53a48c6e-7c3e-085c-f95f-639297dcaa9e.png)

ここで、[Lab 1: プロンプト](https://github.com/taka-yayoi/public_repo_2/blob/master/Gen_AI_in_action/Part1/1.%20Prompt%20Engineering.py)のデモを行いました。

詳細はこちらをご覧ください。

https://qiita.com/taka_yayoi/items/b3e7b5f609ddd8a94e9d

## LLMの選択

LLMにはオープンソースのものとプロプライエタリのものが存在しますが、それぞれの長所短所があります。要件に応じて適材適所で選択することが重要です。

![Screenshot 2024-09-28 at 13.04.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a9904626-6a01-1d29-7523-5fc1fac96dee.png)

## モデルに知識を追加

事前学習済みモデルは一般的な知識を豊富に有していますが、例えばあなたのビジネスの詳細を理解しているわけではありません。自分でファインチューニングや事前トレーニングを行うことも可能ですが、膨大なコストや専門知識が必要となります。プロンプトエンジニアリングで工夫しようとしても、プロンプト長の制限に直面することになります。結果として、手軽に専門知識をLLMに埋め込むことができる、ベクトルストアを用いたRAGが人気を得ることになりました。

![Screenshot 2024-09-28 at 13.10.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/799ce9bb-aa12-1808-9d56-e36156934aa1.png)

ベクトルストアに文書を取り込む際には、生のテキストからチャンク(塊)の作成(チャンキング)、エンべディングの生成、検索インデックスの作成という手順を踏みます。

![Screenshot 2024-09-28 at 13.11.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1a34c5cf-c560-cb3d-7e88-f6f309a447af.png)

ここで、以下のノートブックを通じて、[Mosaic AI Vector Search](https://docs.databricks.com/ja/generative-ai/vector-search.html)のデモを行いました。

 - [ベクトルストアのセットアップ](https://github.com/taka-yayoi/public_repo_2/blob/master/Gen_AI_in_action/Part1/2a%20-%20(instructor_demo)%20-%20Ingesting%20to%20Vector%20Search.py)
- [ベクトルストアの操作](https://github.com/taka-yayoi/public_repo_2/blob/master/Gen_AI_in_action/Part1/2.%20Vector%20Search.py)

## まとめましょう

モデル、ベクトルストアと連携した一連のRAGの流れをまとめ上げるのがオーケストレーター/チェーンです。

![Screenshot 2024-09-28 at 13.13.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b75dc65a-2833-d1cd-a417-59ef20ac323c.png)

こちらで、[Lab 3: 全てを組み立てる](https://github.com/taka-yayoi/public_repo_2/blob/master/Gen_AI_in_action/Part1/3.%20Building%20your%20first%20RAG.py)を用いて基本的なRAGのデモを行いました。

## どのようにアプリを評価するのか？ - モデル

現時点ではモデルの評価手法は、[こちら](https://www.llama.com/)にあるように主観的なものが多数を占めています。ご自身のユースケースに適した指標による評価を行うべきです。

![Screenshot 2024-09-28 at 13.15.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/352b877b-6061-d2e3-f145-115ff88a755f.png)

## どのようにアプリを評価するのか？ - 完全なRAG

RAGのプロセス全体に対する評価が必要です。

![Screenshot 2024-09-28 at 13.24.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f555efbf-6b0f-e041-f2cd-9726463ae447.png)

代表的な質問を手動あるいは自動で準備し、RAGを困らせるような質問も含めるべきです。パワーユーザーを巻き込みましょう。

![Screenshot 2024-09-28 at 13.24.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9d9298fe-a192-1246-14ce-981a62d1931c.png)

## ファインチューニングは？

良し悪しがありますので、ここでも適材適所の考え方が重要です。また、排他的なものではないので組み合わせることも視野に入れましょう。

![Screenshot 2024-09-28 at 13.25.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/17956c57-0984-cea2-ac83-2a71e198f046.png)

# Part 2: LLMアプリの本番稼働を加速

## DBRX

DatabricksのLLM、[DBRX](https://www.databricks.com/jp/blog/announcing-dbrx-new-standard-efficient-open-source-customizable-llms)のご紹介をさせていただきました。

## 評価のディープダイブ

RAGの構成要素それぞれに対して評価を行います。

![Screenshot 2024-09-28 at 13.27.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ca81c453-7bb0-57fa-044b-b6702d3c2976.png)

### どのように質問を準備したらいいのか？

[こちらの論文](https://arxiv.org/pdf/2212.09689)で説明されている手法をご紹介しました。質問の生成もLLMにやってもらいます。

![Screenshot 2024-09-28 at 13.29.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/02b56972-141c-2277-e83b-b9c32d4f4ca8.png)

### RAGアーキテクチャの評価方法

[Ragasアプローチ](https://github.com/explodinggradients/ragas)を紹介させていただきました。

![Screenshot 2024-09-28 at 13.30.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d63d9549-ea0f-883a-e5d6-7e95385c75a7.png)

### 適切性や解答の正しさの判定方法

LLM-as-a-Judgeを説明させていただきました。

![Screenshot 2024-09-28 at 13.31.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1234ace6-78f1-7c35-7c09-a8f6b2a86776.png)

ここで、[クイックデモ - Notebook 1.1](https://github.com/taka-yayoi/public_repo_2/blob/master/Gen_AI_in_action/Part2/1.1_Evaluations.py)を用いてLLM-as-a-Judgeのデモを行いました。

## 高度なチャンキング

テキストのチャンキングのアプローチは複数存在します。素朴なものはセクションや文字数による分割、高度なものではチャンキングにレイアウトモデルを活用します。

![Screenshot 2024-09-28 at 13.36.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2dca057a-09e4-8193-04c6-0ce01660ea94.png)

ここで、[クイックデモ - Notebook 1.2](https://github.com/taka-yayoi/public_repo_2/blob/master/Gen_AI_in_action/Part2/1.2_Advanced_Chunking.py)を用いたチャンキングのデモを行いました。

## 高度な収集

ベクトルデータベース以外にも、グラフ検索やハイブリッド検索を用いるアプローチが存在しています。

![Screenshot 2024-09-28 at 13.39.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e1301c20-51ac-e124-476c-0bb5367a0490.png)

ベクトルの類似検索の結果をビジネスロジックに基づいて並び替えるリランクの活用も進んでいます。

![Screenshot 2024-09-28 at 13.39.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3fa61267-1918-d69a-3462-45021e498393.png)

## オーケストレーターの構築

RAGに続いて、モデルに様々なツールを使用させるエージェントの活用も増えてきています。

![Screenshot 2024-09-28 at 13.40.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b2883c91-bc64-51db-09b0-4c95522b8a18.png)

ここで、[高度なロジックのウォークスルー - Notebook 1.4](https://github.com/taka-yayoi/public_repo_2/blob/master/Gen_AI_in_action/Part2/1.4_Advanced_RAG_Bot.py)を用いて、リランクやチャット履歴を活用したRAGをウォークスルーしました。

## モデルの不具合

このように、生成AIモデルが様々なアプリケーションでどんどん活用されるようになってきていますが、モデルに不具合が起きたらどうすればいいのでしょうか？

幻覚(ハルシネーション)を含む、モデルの問題のある挙動を説明させていただき、対策法も触れさせていただきました。

![Screenshot 2024-09-28 at 13.43.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/42892dec-c7f3-97df-cfe9-2f3653bc9500.png)

![Screenshot 2024-09-28 at 13.44.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/11ac23ea-a444-49af-7be0-6c5fa1baf79c.png)

![Screenshot 2024-09-28 at 13.45.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d812a0a0-95ae-eeee-c11e-1fe54bbf40a6.png)

![Screenshot 2024-09-28 at 13.45.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e1322ffd-7dcb-e4c5-178f-d50eea9c7236.png)


### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)