Last active
March 19, 2024 04:44
-
-
Save alfredplpl/57a6338bce8a00de9c9d95bbf1a6d06d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# MIT License | |
# This code will run on VRAM 12GB+ GPU such as T4, RTX 3060 | |
import torch | |
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline | |
from langchain.text_splitter import RecursiveCharacterTextSplitter | |
from langchain.document_loaders import PyPDFLoader | |
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 | |
model_id = "elyza/ELYZA-japanese-Llama-2-7b-instruct" | |
tokenizer = AutoTokenizer.from_pretrained(model_id) | |
B_INST, E_INST = "[INST]", "[/INST]" | |
B_SYS, E_SYS = "<<SYS>>\n", "\n<</SYS>>\n\n" | |
DEFAULT_SYSTEM_PROMPT = "あなたはプロの研究者です。あなたが得意な専門分野に関する文章を正確に理解し、答えることに努めてください。" | |
text = "これから与えられる英文で記述された論文の一部をよく読み、ユーザーからの質問に日本語で答えてください。まず、ユーザからの質問はこちらです。\n{question}\n英文で記述された論文の一部はこちらです。\n\n{context}\n\n次のユーザからの質問に日本語で答えてください。{question}" | |
template = "{bos_token}{b_inst} {system}{prompt} {e_inst} ".format( | |
bos_token=tokenizer.bos_token, | |
b_inst=B_INST, | |
system=f"{B_SYS}{DEFAULT_SYSTEM_PROMPT}{E_SYS}", | |
prompt=text, | |
e_inst=E_INST, | |
) | |
loader = PyPDFLoader("/path/to/pdf") | |
documents = loader.load() | |
print(len(documents)) | |
document="" | |
for doc in documents: | |
document+=doc.page_content | |
text=document.replace("\n","") | |
custom_text_splitter = RecursiveCharacterTextSplitter( | |
chunk_size = 300, | |
chunk_overlap = 30, | |
length_function = len, | |
separators = ['.'] | |
) | |
texts=custom_text_splitter.split_text(text) | |
texts= custom_text_splitter.create_documents(texts) | |
print(len(texts)) | |
embeddings = HuggingFaceEmbeddings(model_name="intfloat/multilingual-e5-large") | |
db = FAISS.from_documents(texts, embeddings) | |
retriever = db.as_retriever(search_kwargs={"k": 3}) | |
model = AutoModelForCausalLM.from_pretrained(model_id,load_in_8bit=True) | |
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, max_new_tokens=512) | |
PROMPT = PromptTemplate(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) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
検索が正常にできていなかったため、修正したところ正常に動きました。
"あなたはプロの研究者です。あなたが得意な専門分野に関する文章を正確に理解し、答えることに努めてください。
これから与えられる英文で記述された論文の一部をよく読み、ユーザーからの質問に日本語で答えてください。まず、ユーザからの質問はこちらです。
この論文の学術的貢献を要約しなさい。
英文で記述された論文の一部はこちらです。
....
次のユーザからの質問に日本語で答えてください。この論文の学術的貢献を要約しなさい。
与えられた英文で記述された論文の一部をよく読み、ユーザーからの質問に回答いたします。
論文の学術的貢献を要約すると以下の通りです。
この論文では、深層学習の新しいアーキテクチャーであるTransformerを提案しました。Transformerは、従来のRNNやCNNと比較してパラメーター数が少なく、トレーニング時間が短いという特徴があります。このアーキテクチャーは、自然言語処理の他、画像や音声の処理にも応用することができます。
また、この論文では、Transformerのパラメーターを最適化するための新しいアルゴリズムを提案しています。このアルゴリズムは、トレーニング時間と正確性のバランスを取ることができるようになっています。"
https://arxiv.org/abs/2212.04089