GENZITSU / UsefulMaterials

34 stars 0 forks source link

almost weekly useful materials - 12/13 - #141

Open GENZITSU opened 11 months ago

GENZITSU commented 11 months ago

ChatGPTに社内文書に基づいた回答を生成させる仕組みを構築しました

cognitive searchなどの外部サービス無しでRAGシステムを構築した事例の紹介

下図のように、検索indexを作成するバッチ処理と、作成した検索indexを用いて回答を行うコンポーネントに分けて処理を実施している。

20231114121904

コメント

回答を行う部分は一つのマシン上で実現できるという点が嬉しいが、外部サービスを使わないことで本当にコストメリットが出るのかどうかは要検証な気がする

llamaindexで作成したindexファイルがどんくらいのサイズになるのか、それを扱うためのVMにどれくらいのスペックが必要かなどが気になる

出典

GENZITSU commented 11 months ago

検索性能を改善するハイブリッド検索で使えるランク融合アルゴリズム

複数のindexからの検索結果を統合するアルゴリズムを2017年の論文 Risk-Reward Trade-offs in Rank Fusionをベースに紹介している記事

以下紹介されている手法

CombSUM

Combination of multiple searchesで提案された、シンプルにスコアを合計して最終的なスコアとする手法

スクリーンショット 2023-12-01 13 01 00

スコアの絶対値が異なるものをfusionすると、大きいものに引っ張られてしまう

CombMNZ

そのドキュメントが検索された回数も一緒に考慮する

スクリーンショット 2023-12-01 13 01 22

Borda

ヒットした文書の中での順位を反転した値を加算することで最終的なスコアを生成する手法

スクリーンショット 2023-12-01 14 11 01

RRF

ヒットした文書の順位の逆数を合算することで最終的なスコアを生成する手法

スクリーンショット 2023-12-01 14 12 50 スクリーンショット 2023-12-01 14 13 04

その他

個人的には ranx というPython製のランキング評価用ライブラリを使っています。ranx を使うと、たとえばキーワード検索とベクトル検索を一度だけしておいて、ランク融合アルゴリズムだけ変えたときの性能を測定できます。実装量の少なさや、検索器を何度も実行する必要がない点を気に入っています。また、ハイパーパラメーターの最適化機能もサポートしており、たとえば RRF における k をチューニングしたときの性能を測定することもできます。

ranxというハイブリッド検索の性能評価用のライブラリがあるらしい

コメント

RRFは知っていたがその他は知らないものだった。 2017年時点での手法のまとめなので最近はもっと良い手法が出てるかもしれない。

出典

GENZITSU commented 11 months ago

大規模言語モデルに追加学習で専門知識を教える試み

事前学習済みLLMに新たな知識を教えるための方法をLlama-2で検証した記録の紹介

以下重要な点のみを抜粋

概要

スクリーンショット 2023-12-11 14 11 07

背景

スクリーンショット 2023-12-11 14 13 24

スクリーンショット 2023-12-11 14 13 34

検証結果-1

Llama-2に架空の文章を追加学習させて内容の解答ができるか → 1件だけだとできない。元の文章を少し変えて複数件にすることで学習可能になる

スクリーンショット 2023-12-11 14 15 07

スクリーンショット 2023-12-11 14 16 47

スクリーンショット 2023-12-11 14 16 58

検証結果-2

覚えさせたい事実と無関係なテキストを入れるとどうなるか? → 無関係なものが増えるほどスコアが下がる

スクリーンショット 2023-12-11 14 18 15

スクリーンショット 2023-12-11 14 18 23

スクリーンショット 2023-12-11 14 19 15

検証結果-3

LoRAで追加学習するさいの設定はどうすればよいか?

スクリーンショット 2023-12-11 14 25 29

スクリーンショット 2023-12-11 14 25 41

スクリーンショット 2023-12-11 14 27 40

検証結果-4

7B以外より大きいモデルだとどうなるのか?

スクリーンショット 2023-12-11 14 31 26

スクリーンショット 2023-12-11 14 31 35

その他の検証結果

公開論文に対する追加学習の検討

スクリーンショット 2023-12-11 14 34 00

コメント

めちゃ有益な実験結果である

出典

GENZITSU commented 11 months ago

ハイブリッド検索で必ずしも検索性能が上がるわけではない

ベクトル検索と単語検索の併用であるハイブリット検索は検索精度向上のためによく利用されるが、徒に使ってもベクトル検索よりも悪化する場合があることを示している記事

利用したデータ

尼崎市のQAデータを使用します。このデータセットには、784の質問に対して対応する回答がAからCの3つのカテゴリでラベル付けされています。Aの場合は正しい情報を含み、Bであれば関連する情報を含み、Cであればトピックが同じであることを意味します。今回はこれらのカテゴリを関連文書として扱うことにします。

全文検索のチューニングや前処理を全くやらない場合、以下のようにベクトル検索よりも性能が悪化する

スクリーンショット 2023-12-13 17 40 40

以下のチューニングや前処理を施すことで、ハイブリッド検索による精度向上を達成

スクリーンショット 2023-12-13 17 45 27

コメント

単語ベースの検索を行う場合は前処理やチューニングが大事という教訓

出典

GENZITSU commented 11 months ago

GPTsより精度の高いRAGシステムの構築

PDFからのRAGシステムの精度改善をどのように行なったかの紹介をしているスライド

以下ためになったところのみ

コメント

unstructuredというライブラリは知らなかったので今度使ってみたい

出典

GENZITSU commented 10 months ago

LLMを用いたSNSのテーマ推薦と投稿文の自動生成

特定テーマに沿った投稿文をLLMで自動生成するための取り組み紹介。

ベースの手法

baseline

特定テーマを呟き続けるアカウントの投稿から特徴語を選出し、その特徴量語を用いた文章をLLMで生成させる。

ChatGPTに依頼する形式

messages = [
        {"role": "system", "content": "You are a very helpful assistant."},
        {"role": "user", "content": f"美容・健康に興味がある女性に対してTwitterでアプローチしたいです。"},
        {"role": "assistant", "content": "わかりました。可能であれば参考になる投稿を教えて下さい。"},
        {
            "role": "user",
            "content": f"""{過去の投稿文}""",
        },
        {"role": "assistant", "content": "ありがとうございます。具体的にどのキーワードでツイートがほしいですか?"},
        {
            "role": "user",
            "content": f'''keyword = {今回生成に使用するキーワード} でお願いします。''',
        },
]

こうやってassistantの文章を提携で入れる方法が取れるの初めて知った。

改善点

  1. キーワード抽出をTF-IDFからEmbedRankという手法に変える

この手法は文章全体のベクトルとキーワード候補のベクトルの類似度をもとにキーワードを選定していく手法で、これまで選出したキーワードとの類似度を鑑みて意味的に多様なキーワード抽出が可能なもの

スクリーンショット 2023-12-28 11 22 30

  1. 投稿後のキーワード選出時に最も類似度の和が小さくなるようなペアを選出する

  2. OSSのLLMによる文章生成

A100 1枚で学習可能なstabilityai/japanese-stablelm-base-alpha-7bを元もに以下のようなinstruction形式で学習

{
    "instruction": "美容・健康に興味がある女性に対して訴求するTwitterの投稿文をキーワードから生成してください",
    "input":[EmbedRankで抽出したキーワード],
    "output":[実際の投稿文]
}

加えて、「kunishou/databricks-dolly-15k-ja」のinstruction dataも用いて学習

学習時のパラメータ

結果

絵文字の差はあれど、そこそこ自然な感じになっている

スクリーンショット 2023-12-28 11 27 35

定量評価では元の投稿文とのコサイン類似度を利用していたが、これだと文章の自然さをよく表現できないということで、言語モデルが出力する単語の予測確率によって文章の自然さを定量化するMLM-Scoringというものも利用している

コメント

キーワード選出手法のEmbedRankを思い出す良いきっかけになった。 7Bのモデルは学習もやりやすくサービングも楽なので色々応用できそうだ

出典