QEUR23_LMABYS17: 閑話休題~[応用例]PDF文書を読み込み、その内容を要約するプログラムを作る
~ こんなコードの事例はWebに山ほどありますよ ~
D先生 : “前回でLangChainに関する、当初の開発目標が完了しました。Fine-tuneとLangChainを併用することで、LLMの実力を120%発揮できることが大体わかりました。さて、今回は閑話休題ですが・・・。”
QEU:FOUNDER : “誰にでも使える、とても簡単で実用的なPythonプログラムを作りました。PDFファイルの要約です。この手のプログラムは今では、Web上で簡単に見つかりますよ。我々は、少しだけ手を入れていますが・・・。”
D先生 : “ああ・・・。あの有名な論文(Textbooks are all you need)を要約するわけですね。それで、今回のプログラムに工夫が?”
QEU:FOUNDER : “・・・いや、別に大したことないです。我々としては・・・。GPTQのモデルを使用しています。普通のLLMモデルを使うとメモリがたくさんいりますから・・・。それでは、プログラムをドン!”
# PDF Analyzer
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline, logging
from langchain.document_loaders import PyPDFLoader
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.llms.huggingface_pipeline import HuggingFacePipeline
from langchain import PromptTemplate
######
#####
loader = PyPDFLoader('/content/drive/MyDrive/LCdocs/textbook_is_all_you_need.pdf')
documents = loader.load()
# 言語情報をChunk分割する
splitter = RecursiveCharacterTextSplitter(chunk_size=256, chunk_overlap=32, separators=["\n\n", "\n", "。", ","],)
texts = splitter.split_documents(documents)
len(texts)
# -----
print(texts[30].page_content)
#####
#####
# -----
# モデル名
model_name_or_path = "TheBloke/Llama-2-13B-chat-GPTQ"
use_triton = False
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, use_fast=True)
model = AutoGPTQForCausalLM.from_quantized(model_name_or_path,
use_safetensors=True,
trust_remote_code=False,
device="cuda:0",
use_triton=use_triton,
quantize_config=None)
#####
######
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
db = FAISS.from_documents(texts, embeddings)
retriever = db.as_retriever(search_kwargs={"k": 3})
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, max_new_tokens=512,
torch_dtype=torch.float16,repetition_penalty=1.15) #model_kwargs={"load_in_8bit": True}
# -----
template = """
以下の英文の内容(context)をよく読み、ユーザーからの質問(question)に日本語で答えてください。
{context}
Question: {question}
Answer:"""
PROMPT = PromptTem-plate(template=template,input_variables=["question","context"],template_format="f-string")
chain_type_kwargs = {"prompt": PROMPT}
qa = RetrievalQA.from_chain_type(
llm=HuggingFacePipeline(pipeline=pipe),
retriever=retriever,
chain_type="stuff",
return_source_documents=False,
chain_type_kwargs=chain_type_kwargs)
result = qa.run("この論文の成果を箇条書きで要約しなさい。")
print(result)
QEU:FOUNDER : “それでは、要約の結果もドン!!ただし、今回は質問にあるように、「成果の要約」ですからね。質問内容を少し変えれば、他の有用な情報も抽出、解析ができるようになります。”
D先生 : “日本語で出してほしいと指示したのですが、LLMさんは出してくれませんでしたか・・・(笑)。”
QEU:FOUNDER : “現時点(日本語出力用のfine-tuneなし)のLLMの実力ではしようがないです。ちなみに、今回の出力を無理やり翻訳ソフトで日本語にしてみました。”
もちろん!論文「Wizardcoder」と「Codegeex」の主な調査結果の要約を紹介しよう:
- 両論文は、コードと自然言語データを組み合わせて、コーディングタスクのための大規模言語モデルを学習する新しいアプローチを提案している。
- 著者らは、様々なソースからのコードとテキストデータを組み合わせた、CodeTextbookと呼ばれる新しいデータセット構成を紹介している。
- この新しいデータセット構成を用いて、著者らはWizardcoderとCodegeexという2つのモデルを学習し、いくつかのベンチマークタスクでその性能を評価する。
- 結果は、両モデルがこれらのタスクにおいて最先端の性能を達成し、既存のコード生成モデルを凌駕することを示している。
- 著者らはまた、モデルのさまざまなコンポーネントの寄与を分析するためにアブレーション研究を行い、首尾一貫した、よく構造化されたコードを生成する能力が成功の鍵であることを発見した。
QEU:FOUNDER : “この要約の内容が、我々が今回やってきた一連の開発内容に通じるんです。LLMの性能を上げるのは、別にプログラムを改造したり数学上より高度な手法を採用する必要はないんです。LLMに供給するデータを工夫することで、LLMの性能改善はできるんです。”
D先生 : “あっ・・・、そういえば今回はChunkデータベースの検索のためにFAISSをつかっていますね。”
QEU:FOUNDER : “我々が開発用に使用したシステムより、FAISSの方が性能いいはずです。ご興味があれば、皆さまプログラムを変えて遊んでみてください。”
D先生 : “・・・では、次はいよいよFINE-TUNINGですね。”
QEU:FOUNDER : “さてと・・・、コンピューティング・パワー(RAM,GPU)をどうやって確保しようか・・・。”
~ まとめ ~
QEU:FOUNDER : “BRICS会議がとうとう始まりました!”
C部長 : “今回の会議が時代の大きな節目になるんじゃないですか・・・。”
QEU:FOUNDER : “何かが変わると思うが、どれだけかわるのかなぁ・・・。”
C部長 : “だけど、ドキドキ・・・。”
コメント
コメントを投稿