一旦行き詰ったのでここまでを記録として残しておきます。
行き詰った内容としてはローカルで実行できないこと、無料枠のcolabを利用してもダメだったことです。
今回実施した内容としては以下
ベクトルデータベースの完成
生成モデルを利用して質問+ファイルの内容を分割してプロンプトを投げる
‘paraphrase-multilingual-mpnet-base-v2’を利用したベクトルデータベースの作成が完了したのでGithubにあげようとしたのですが、jsonファイルは2GB以上、zip化しても500MB以上あったので断念しました。100MB未満なら簡単にあげられるのですが、それ以上はもう少し手順が必要みたいです。
このファイル作るのに1週間近くはかかるんだなと思いました。ファイル数が多かったのもあるかもしれませんが、こんなに大変なんだなと実感しました。この記事でベクトルデータベースの容量削減について書かれていますが、精度とかはまだ分かってないのでなるほどぐらいで終わりました。
生成モデルを利用したプロンプトの作成と推論コードはザックリと以下になります。
def load_or_download_genmodel(model_name: str, local_dir: str) -> tuple[PreTrainedTokenizer | PreTrainedTokenizerFast, PreTrainedModel|SentenceTransformer]: # ローカルディレクトリが存在しない場合は作成 if not os.path.exists(local_dir): os.makedirs(local_dir) # モデルがローカルに存在するかをチェック if not (os.path.exists(os.path.join(local_dir, 'config.json')) and os.path.exists(os.path.join(local_dir, 'tokenizer_config.json'))): # モデルが存在しない場合はダウンロードして保存 print(f"Model not found locally. Downloading {model_name}...") tokenizer = AutoTokenizer.from_pretrained(model_name, force_download=True) model = AutoModelForCausalLM.from_pretrained(model_name, force_download=True) print(f"Saving model and tokenizer to {local_dir}...") tokenizer.save_pretrained(local_dir) model.save_pretrained(local_dir) else: # モデルが存在する場合はローカルからロード print(f"Loading generative model and tokenizer from {local_dir}...") tokenizer = AutoTokenizer.from_pretrained(local_dir) model = AutoModelForCausalLM.from_pretrained(local_dir) return tokenizer, model def process_text_in_chunks(self, question, text, model, tokenizer): for chunk in chunks: prompt = f"{question}\n\n{chunk}" inputs = tokenizer(prompt, return_tensors="pt", max_length=50, truncation=True) input_ids = inputs["input_ids"] attention_mask = inputs["attention_mask"] output = self.generative_model.generate(input_ids=input_ids, attention_mask=attention_mask, max_new_tokens=100, num_beams=3) result_text = tokenizer.decode(output[0], skip_special_tokens=True) combined_result += result_text + "\n" return combined_result def main(self, question): # コサイン類推度から近いファイルを取得し、テキストを抽出→ここでは省く result = self.process_text_in_chunks(question, text, self.generative_model, self.tokenizer) return result if __name__ == '__main__': # 生成モデルをロードまたはダウンロード tokenizer, gen_model = load_or_download_genmodel(gen_model_name, gen_local_dir) cos_sim_calc = CosSimCalc(gen_model, tokenizer, emb_model) cos_sim_calc.main(question = '著作権について教えて下さい。') いろいろ試して見たんですがローカルだと動かないですし、高性能GCPを買うまではいかないので、クラウドで実行するかOpenAIなどのAPIに頼ることになりそうです。
...