Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

almost weekly useful materials - 12/13 - #141

Open
GENZITSU opened this issue Nov 28, 2023 · 6 comments
Open

almost weekly useful materials - 12/13 - #141

GENZITSU opened this issue Nov 28, 2023 · 6 comments

Comments

@GENZITSU
Copy link
Owner

No description provided.

@GENZITSU
Copy link
Owner Author

GENZITSU commented Nov 28, 2023

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

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

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

20231114121904

コメント

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

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

出典

@GENZITSU
Copy link
Owner Author

GENZITSU commented Dec 1, 2023

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

複数の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
Copy link
Owner Author

GENZITSU commented Dec 11, 2023

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

事前学習済み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で追加学習するさいの設定はどうすればよいか?

  • 関係ない文書は1000件まで
  • rは100前後
  • lrは学習させる文章数に応じて低めにする必要あり (1e-3 ~ 1e-4) ←もっと下げほうがいい気もするが..?
  • LoRA target層適切に変える必要あり
  • 学習する文章のスタイルはQA形式を入れるべき (評価方法もQAだからか?)
  • 逆に教科書形式は文章が長すぎて不利に働く可能性あり
  • 日本語のような英語と文体が違いすぎるものも不利に働く可能性あり

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

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

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

検証結果-4

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

  • LoRA層を制限すると70Bだとうまくいかない
  • LoRAを全層に適用する場合は70Bでも、これまでの検証と類似の結果を得られる

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

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

その他の検証結果

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

  • 多言語翻訳によるデータ増強は効果あり
  • 無関係な文章は減らしたほうが良い
  • LoRAの適用層は70b以外5層の方が良い

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

コメント

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

出典

@GENZITSU
Copy link
Owner Author

GENZITSU commented Dec 13, 2023

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

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

利用したデータ

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

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

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

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

  • BM25Retriever → TFIDFRetriever
  • 前処理 (sudachiを元に実施)
    • 基本形への変換
    • 品詞による単語の除去
    • 全角と半角の変換
    • ストップワードの除去
    • 小文字化
    • その他正規化
    • nGram(1, 2)
  • bge-reranker-largeによるリランキング
  • RRFのハイパラチューニング: 10→60
スクリーンショット 2023-12-13 17 45 27

コメント

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

出典

@GENZITSU
Copy link
Owner Author

GENZITSU commented Dec 20, 2023

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

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

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

コメント

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

出典

@GENZITSU
Copy link
Owner Author

GENZITSU commented Dec 27, 2023

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も用いて学習

学習時のパラメータ

  • 学習データ数: 16,000剣
  • 使用GPU:A100-40GB×1枚
  • 学習手法:LoRA
    • r : 32
    • lora_alpha : 64
    • lora_dropout : 0.05
    • lr:2e-4
    • epoch数:2(約6時間)

結果

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

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

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

コメント

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

出典

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant