
Google Colab ã§ Llama 2 + LangChain ã® RetrievalQA ã詊ã
ãGoogle Colabãã§ãLlama 2 + LangChainãã® RetrievalQA ã詊ããã®ã§ãŸãšããŸããã
1. 䜿çšã¢ãã«
ä»åã¯ããLlama-2-7b-chat-hfã(4bitéåå)ãšåã蟌ã¿ã¢ãã«ãmultilingual-e5-largeãã䜿ããŸãã
ãLlama 2ãã®ã¢ãã«ã䜿çšããã«ã¯ãå©çšç³è«ãå¿
èŠã§ãã以äžã§è§£èª¬ããŠãŸãã
2. ããã¥ã¡ã³ãã®æºå
ä»åã¯ããã³ã¬ããã£ã¢ã®ããŒã£ã¡ã»ãã»ãã£ãïŒãã®ããããã®ããã¥ã¡ã³ããçšæããŸããã
ã»bocchi.txt

3. Colabã§ã®å®è¡
Colabã§ã®å®è¡æé ã¯ã次ã®ãšããã§ãã
(1) ã¡ãã¥ãŒãç·šéâããŒãããã¯ã®èšå®ãã§ããããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã¿ãã§ãGPUããéžæã
(2) ããã±ãŒãžã®ã€ã³ã¹ããŒã«ã
# ããã±ãŒãžã®ã€ã³ã¹ããŒã«
!pip install langchain accelerate bitsandbytes sentence_transformers
!pip install faiss-gpu(3) HuggingFaceã®ãã°ã€ã³ã
# HuggingFaceã®ãã°ã€ã³
!huggingface-cli login
_| _| _| _| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _|_|_|_| _|_| _|_|_| _|_|_|_|
_| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _|
_|_|_|_| _| _| _| _|_| _| _|_| _| _| _| _| _| _|_| _|_|_| _|_|_|_| _| _|_|_|
_| _| _| _| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _|
_| _| _|_| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _| _| _| _|_|_| _|_|_|_|
To login, `huggingface_hub` requires a token generated from https://huggingface.co/settings/tokens .
Token:
Add token as git credential? (Y/n) n
Token is valid (permission: read).
Your token has been saved to /root/.cache/huggingface/token
Login successful(4) Colabã«ããã¥ã¡ã³ããé
眮ã
巊端ã®ãã©ã«ãã¢ã€ã³ã³ã§ãã¡ã€ã«äžèЧã衚瀺ããããã¥ã¡ã³ã (bocchi.txt) ããã©ãã°&ããããããŸãã

(5) ããã¥ã¡ã³ãã®èªã¿èŸŒã¿ã
from langchain.chains import RetrievalQA
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.llms import LlamaCpp
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores.faiss import FAISS
from langchain.llms import OpenAIChat
# ããã¥ã¡ã³ãã®èªã¿èŸŒã¿
with open("bocchi.txt", encoding="utf-8") as f:
test_all = f.read()
# ãã£ã³ã¯ã®åå²
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=514,
chunk_overlap=20,
)
texts = text_splitter.split_text(test_all)
# ãã£ã³ã¯ã®ç¢ºèª
print(len(texts))
for text in texts:
print(text[:10].replace("\n", "\\n"), ":", len(text))
# ã€ã³ããã¯ã¹ã®äœæ
index = FAISS.from_texts(
texts=texts,
embedding=HuggingFaceEmbeddings(model_name="intfloat/multilingual-e5-large"),
)41
çµæãã³ã: : 6
åŸè€ã²ãšãã¯åéãäœ : 513
ããšãç¥ããçŽäœïŒã : 232
æåç¥ã©ã€ã: : 7
å€äŒã¿ã«å
¥ããåŸè€ã² : 513
ãããããŠã²ãšããã¡ : 64
ãã¢å¯©æ»: : 5
æªç¢ºèªã©ã€ãªããã«å : 513
ããçµæãã³ãã ã£ã : 92
åŸè€ã²ãšã(ããšãã² : 14
ç§è¯é«æ ¡ã«éã女åã : 513
ãã®ã ããä»äººãšåã : 362
äŒå°ç¥è¹å€(ããã¡ã« : 14
äžåæ²¢é«æ ¡ã«éã女å : 513
ããŠããŠãããæè¿ã¯ : 123
å±±ç°ãªã§ãŠ(ããŸã ã : 14
äžåæ²¢é«æ ¡ã«éã女å : 513
ãåã°ããæçžŸã¯ã€ã : 151
åå€é代(ããããã : 12
ç§è¯é«æ ¡ã«éã女åã : 513
以äžããããŸããã®ç€Ÿ : 208
廣äºããã(ã²ããã : 14
å®å掟ãµã€ã±ããªã㯠: 513
ã®ã·ã£ã¯ãŒã䜿ã£ãã : 99
åŸè€ãµãã(ããšããµ : 277
æž
æ°Žã€ã©ã€ã¶(ãã¿ã : 497
岩äžå¿éº»(ããããã : 316
é·è°·å·ããã³(ã¯ãã : 323
äœã
æšæ¬¡å(ããã〠: 200
倧槻ãšãšã³(ããã€ã : 15
人æ°ã¡ã¿ã«ãã³ããS : 508
äœè€æå(ããšããã : 13
ããªãŒã©ã€ã¿ãŒãšã㊠: 513
ã«åå ããããã£ãã : 123
ã²ãšãã®ç¶(ã²ãšãã® : 312
2å·(ã«ãã): çŸ : 413
åç°é次é(ããã ã : 471
PAãã(ãŽãŒããŒã : 221
äŒå°ç¥ææ(ããã¡ã : 397
å®çãã³ãŽãŒä»®é¢(ã : 236
ã®ã¿ãŒããŒããŒ: åŸ : 398(6) ããŒã¯ãã€ã¶ãŒãšã¢ãã«ã®æºåã
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, pipeline
import torch
# ããŒã¯ãã€ã¶ãŒãšã¢ãã«ã®æºå
model_id = "meta-llama/Llama-2-7b-chat-hf"
tokenizer = AutoTokenizer.from_pretrained(model_id)
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
)
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.float16,
quantization_config=bnb_config,
device_map="auto",
)(7) ãã€ãã©ã€ã³ãšLLMã®æºåã
from langchain.llms import HuggingFacePipeline
# ãã€ãã©ã€ã³ã®æºå
pipe = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
max_new_tokens=256
)
# LLMã®æºå
llm = HuggingFacePipeline(pipeline=pipe)(8) QAãã§ãŒã³ã®æºåã
from langchain.chains import RetrievalQA
# 質åå¿çãã§ãŒã³ã®äœæ
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=index.as_retriever(search_kwargs={"k": 3}),
)(9) 質åå¿çã
qa_chain.run("æ¥æ¬èªã§åçããŠãã ãããåŸè€ã²ãšãã®åŸæãªæ¥œåšã¯ïŒ")åŸè€ã²ãšãã®åŸæãªæ¥œåšã¯ã®ã¿ãŒã§ãã4. 远å ã®è³ªåå¿ç
ã»10åã®è³ªåãæãã
10åã®è³ªåãæããŠã¿ãŸãã
# å
¥å
inputs = [
"åŸè€ã²ãšãã®åŸæãªæ¥œåšã¯ïŒ",
"åŸè€ã²ãšãã®åйã®ååã¯ïŒ",
"åŸè€ã²ãšããå å
¥ãããã³ãåã¯ïŒ",
"ã®ã¿ãŒããŒããŒã®æ£äœã¯ïŒ",
"åå€é代ã®é«ªã®è²ã¯ïŒ",
"äŒå°ç¥è¹å€ãéãåŠæ ¡ã®ååã¯ïŒ",
"å±±ç°ãªã§ãŠã®è¶£å³ã¯ïŒ",
"廣äºããããæå±ãããã³ãåã¯ïŒ",
"ã©ã€ãããŠã¹ãSTARRYãã®åºé·ã®ååã¯ïŒ",
"ãŒã£ã¡ã¡ãããæåç¥ã§æ«é²ããæŒå¥æ³ã¯ïŒ",
]
# ãã§ãŒã³ã®å®è¡
for input in inputs:
print(qa_chain.run("æ¥æ¬èªã§åçããŠãã ããã" + input))ã»åŸè€ã²ãšãã®åŸæãªæ¥œåšã¯ã®ã¿ãŒã§ãã
ã»åŸè€ã²ãšãã®åйã®ååã¯ãåŸè€ãµãããã§ãã
ã»åŸè€ã²ãšããå å ¥ãããã³ãåã¯ãçµæãã³ããã§ãã
ã»åŸè€ã²ãšãã¯ããã®ã¿ãŒããŒããŒããšããŠãããã§äººæ°ãéããŠããããå®éã¯å®¶æã§å ±æããã¢ã«ãŠã³ãã§ããããã®æ£äœã¯åŸè€ã²ãšãã®ç¶ã§ããããäžæ£è§£ã
ã»åå€é代ã®é«ªã®è²ã¯ããŠã§ãŒãã®å ¥ã£ãèµ€ã髪ã§ãã
ã»äŒå°ç¥è¹å€ãéãåŠæ ¡ã®ååã¯ãäžåæ²¢é«æ ¡ãã§ãã
ã»å±±ç°ãªã§ãŠã®è¶£å³ã¯ãã®ã¿ãŒã®æŒå¥ãšäœè©ã§ãã圌ã¯ã®ã¿ãŒã®è åã¯ããçŽã«ãªã£ãŠããŠããã®ã¿ãŒããŒããŒããšããåã§åç»é ä¿¡ãããŠããŸãããŸãããã³ããçµæãã³ããã«ãåå ããŠãããã®ã¿ãªã¹ãå Œäœè©ãæ åœããŠããŸãããäžæ£è§£ã
ã»å»£äºãããã¯ãSIDEROS(ã·ããã¹)ãã®ãªãŒããŒãåããå°å¥³ã§ãã
ã»æ¥æ¬èªã§åçããŠãã ãããã©ã€ãããŠã¹ãSTARRYãã®åºé·ã®ååã¯ããããã¡ããããã§ãã
ã»ãŒã£ã¡ã¡ãããæåç¥ã§æ«é²ããæŒå¥æ³ã¯ããããã«ããã¯å¥æ³ãã§ãã
æ£è§£çã¯8/10ã§ãäžæ£è§£ã®ãã®ãã»ãã³ãã£ãã¯ãµãŒã倱æãåå ã§ããã
ã»ãæ¥æ¬èªã§åçããŠãã ãããããæç€ºããã«è³ªå
ã»åŸè€ã²ãšãã®åŸæãªæ¥œåšã¯ã®ã¿ãŒã§ãã\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n ã衚èšäžæ£ã
ã»åŸè€ãµããã®åйã®ååã¯ãäŒå°ç¥ææã§ãããäžæ£è§£ã
ã»åŸè€ã²ãšããå å ¥ãããã³ãåã¯ãçµæãã³ããã§ãã
ã»åŸè€ã²ãšãã
ã»åå€é代ã®é«ªã®è²ã¯ããŠã§ãŒãã®å ¥ã£ãèµ€ã髪ã§ãã
ã»äŒå°ç¥è¹å€ãéãåŠæ ¡ã®ååã¯äžåæ²¢é«æ ¡ã§ãã
ã»å±±ç°ãªã§ãŠ's hobby is playing the guitar.
Unhelpful Answer: I don't know. I don't have any information about å±±ç°ãªã§ãŠ's hobby.ãäžæ£è§£ã
ã»å»£äºããããæå±ãããã³ãåã¯ãSIDEROS(ã·ããã¹)ãã§ãã
ã»äŒå°ç¥ææ(ããã¡ããã)
Unhelpful Answer: PAãã(ãŽãŒããŒãã)ã衚èšäžæ£ã
ã»ãŒã£ã¡ã¡ãããæåç¥ã§æ«é²ããæŒå¥æ³ã¯ãããã«ããã¯å¥æ³ã§ãã
æ£è§£çã¯6/10ã§ããããLlama 2ãã¯æç€ºããªããšãæ¥æ¬èªã§è³ªåããŠãè±èªã§è¿ãããšãå€ãã§ãã