almost weekly useful materials - 12/13 -
Opened this issue · 6 comments
ChatGPTに社内文書に基づいた回答を生成させる仕組みを構築しました
cognitive searchなどの外部サービス無しでRAGシステムを構築した事例の紹介
下図のように、検索indexを作成するバッチ処理と、作成した検索indexを用いて回答を行うコンポーネントに分けて処理を実施している。
コメント
回答を行う部分は一つのマシン上で実現できるという点が嬉しいが、外部サービスを使わないことで本当にコストメリットが出るのかどうかは要検証な気がする
llamaindexで作成したindexファイルがどんくらいのサイズになるのか、それを扱うためのVMにどれくらいのスペックが必要かなどが気になる
出典
検索性能を改善するハイブリッド検索で使えるランク融合アルゴリズム
複数のindexからの検索結果を統合するアルゴリズムを2017年の論文 Risk-Reward Trade-offs in Rank Fusionをベースに紹介している記事
以下紹介されている手法
CombSUM
Combination of multiple searchesで提案された、シンプルにスコアを合計して最終的なスコアとする手法
スコアの絶対値が異なるものをfusionすると、大きいものに引っ張られてしまう
CombMNZ
そのドキュメントが検索された回数も一緒に考慮する
Borda
ヒットした文書の中での順位を反転した値を加算することで最終的なスコアを生成する手法
RRF
ヒットした文書の順位の逆数を合算することで最終的なスコアを生成する手法
その他
個人的には ranx というPython製のランキング評価用ライブラリを使っています。ranx を使うと、たとえばキーワード検索とベクトル検索を一度だけしておいて、ランク融合アルゴリズムだけ変えたときの性能を測定できます。実装量の少なさや、検索器を何度も実行する必要がない点を気に入っています。また、ハイパーパラメーターの最適化機能もサポートしており、たとえば RRF における k をチューニングしたときの性能を測定することもできます。
ranxというハイブリッド検索の性能評価用のライブラリがあるらしい
コメント
RRFは知っていたがその他は知らないものだった。
2017年時点での手法のまとめなので最近はもっと良い手法が出てるかもしれない。
出典
大規模言語モデルに追加学習で専門知識を教える試み
事前学習済みLLMに新たな知識を教えるための方法をLlama-2で検証した記録の紹介
以下重要な点のみを抜粋
概要
背景
検証結果-1
Llama-2に架空の文章を追加学習させて内容の解答ができるか → 1件だけだとできない。元の文章を少し変えて複数件にすることで学習可能になる
検証結果-2
覚えさせたい事実と無関係なテキストを入れるとどうなるか? → 無関係なものが増えるほどスコアが下がる
検証結果-3
LoRAで追加学習するさいの設定はどうすればよいか?
- 関係ない文書は1000件まで
- rは100前後
- lrは学習させる文章数に応じて低めにする必要あり (1e-3 ~ 1e-4) ←もっと下げほうがいい気もするが..?
- LoRA target層適切に変える必要あり
- 学習する文章のスタイルはQA形式を入れるべき (評価方法もQAだからか?)
- 逆に教科書形式は文章が長すぎて不利に働く可能性あり
- 日本語のような英語と文体が違いすぎるものも不利に働く可能性あり
検証結果-4
7B以外より大きいモデルだとどうなるのか?
- LoRA層を制限すると70Bだとうまくいかない
- LoRAを全層に適用する場合は70Bでも、これまでの検証と類似の結果を得られる
その他の検証結果
公開論文に対する追加学習の検討
- 多言語翻訳によるデータ増強は効果あり
- 無関係な文章は減らしたほうが良い
- LoRAの適用層は70b以外5層の方が良い
コメント
めちゃ有益な実験結果である
出典
ハイブリッド検索で必ずしも検索性能が上がるわけではない
ベクトル検索と単語検索の併用であるハイブリット検索は検索精度向上のためによく利用されるが、徒に使ってもベクトル検索よりも悪化する場合があることを示している記事
利用したデータ
尼崎市のQAデータを使用します。このデータセットには、784の質問に対して対応する回答がAからCの3つのカテゴリでラベル付けされています。Aの場合は正しい情報を含み、Bであれば関連する情報を含み、Cであればトピックが同じであることを意味します。今回はこれらのカテゴリを関連文書として扱うことにします。
全文検索のチューニングや前処理を全くやらない場合、以下のようにベクトル検索よりも性能が悪化する
以下のチューニングや前処理を施すことで、ハイブリッド検索による精度向上を達成
- BM25Retriever → TFIDFRetriever
- 前処理 (sudachiを元に実施)
- 基本形への変換
- 品詞による単語の除去
- 全角と半角の変換
- ストップワードの除去
- 小文字化
- その他正規化
- nGram(1, 2)
- bge-reranker-largeによるリランキング
- RRFのハイパラチューニング: 10→60
コメント
単語ベースの検索を行う場合は前処理やチューニングが大事という教訓
出典
GPTsより精度の高いRAGシステムの構築
PDFからのRAGシステムの精度改善をどのように行なったかの紹介をしているスライド
以下ためになったところのみ
- https://github.com/Unstructured-IO/unstructured の strategy=“hi_res”によるデータ読み込みが他のライブラリよりも良いらしい
- Azure document intelligeceと同じくらいの性能
- chunk分け自体をgpt-4にやらせる
- 検索は小さいchunk単位で、gptに入れる時は小さいchunkを含むより大きいchunkを渡す
- システムの性能評価をgpt-4にやらせる
コメント
unstructuredというライブラリは知らなかったので今度使ってみたい
出典
LLMを用いたSNSのテーマ推薦と投稿文の自動生成
特定テーマに沿った投稿文をLLMで自動生成するための取り組み紹介。
ベースの手法
特定テーマを呟き続けるアカウントの投稿から特徴語を選出し、その特徴量語を用いた文章を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の文章を提携で入れる方法が取れるの初めて知った。
改善点
- キーワード抽出をTF-IDFからEmbedRankという手法に変える
この手法は文章全体のベクトルとキーワード候補のベクトルの類似度をもとにキーワードを選定していく手法で、これまで選出したキーワードとの類似度を鑑みて意味的に多様なキーワード抽出が可能なもの
-
投稿後のキーワード選出時に最も類似度の和が小さくなるようなペアを選出する
-
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時間)
結果
絵文字の差はあれど、そこそこ自然な感じになっている
定量評価では元の投稿文とのコサイン類似度を利用していたが、これだと文章の自然さをよく表現できないということで、言語モデルが出力する単語の予測確率によって文章の自然さを定量化するMLM-Scoringというものも利用している
コメント
キーワード選出手法のEmbedRankを思い出す良いきっかけになった。
7Bのモデルは学習もやりやすくサービングも楽なので色々応用できそうだ