Views
No views yet
1以下のコードでモデルをロードして使用できます。
2
3!pip install -U bitsandbytes
4!pip install -U transformers
5!pip install -U accelerate
6!pip install -U datasets
7# notebookでインタラクティブな表示を可能とする(ただし、うまく動かない場合あり)
8!pip install ipywidgets --upgrade
9
10# Hugging Faceで取得したTokenをこちらに貼る。
11HF_TOKEN = <your key>
12
13# モデルのID
14model_name = "Rakushaking/llm-jp-3-13b-finetune-it"
15
16# QLoRA config
17bnb_config = BitsAndBytesConfig(
18 load_in_4bit=True,
19 bnb_4bit_quant_type="nf4",
20 bnb_4bit_compute_dtype=torch.bfloat16,
21 bnb_4bit_use_double_quant=False,
22)
23
24# Load model
25model = AutoModelForCausalLM.from_pretrained(
26 model_name,
27 quantization_config=bnb_config,
28 device_map="auto",
29 token = HF_TOKEN
30)
31
32# Load tokenizer
33tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True, token = HF_TOKEN)
34
35prompt = f"""### 指示:<your question>
36### 回答:
37
38tokenized_input = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
39with torch.no_grad():
40 outputs = model.generate(
41 tokenized_input,
42 max_new_tokens=100,
43 do_sample=False,
44 repetition_penalty=1.2
45 )[0]
46output = tokenizer.decode(outputs[tokenized_input.size(1):], skip_special_tokens=True)
47
48print(output)
1#自分の作成したモデルのIDをこちらに貼る。
2model_name = "Rakushaking/llm-jp-3-13b-it"
3
4from transformers import (
5 AutoModelForCausalLM,
6 AutoTokenizer,
7 BitsAndBytesConfig,
8)
9import torch
10from tqdm import tqdm
11import json
12
13#QLoRA config
14bnb_config = BitsAndBytesConfig(
15 load_in_4bit=True,
16 bnb_4bit_quant_type="nf4",
17 bnb_4bit_compute_dtype=torch.bfloat16,
18 bnb_4bit_use_double_quant=False,
19)
20
21#Load model
22model = AutoModelForCausalLM.from_pretrained(
23 model_name,
24 quantization_config=bnb_config,
25 device_map="auto",
26 token = HF_TOKEN
27)
28
29#Load tokenizer
30tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True, token = HF_TOKEN)
31
32import langchain
33from langchain.embeddings import HuggingFaceEmbeddings
34from llama_index.core import ServiceContext, SQLDatabase, VectorStoreIndex
35from typing import Any, List
36
37#埋め込みクラスにqueryを付加
38class HuggingFaceQueryEmbeddings(HuggingFaceEmbeddings):
39 def __init__(self, **kwargs: Any):
40 super().__init__(**kwargs)
41
42 def embed_documents(self, texts: List[str]) -> List[List[float]]:
43 return super().embed_documents(["query: " + text for text in texts])
44
45 def embed_query(self, text: str) -> List[float]:
46 return super().embed_query("query: " + text)
47
48#ベクトル化する準備
49embedding = langchain.embeddings.HuggingFaceEmbeddings(
50 model_name="intfloat/multilingual-e5-base",
51 #model_kwargs=model_kwargs,
52 #encode_kwargs=encode_kwargs
53)
54
55from transformers import pipeline
56from langchain.llms import HuggingFacePipeline
57
58#パイプラインの準備
59pipe = pipeline(
60 "text-generation",
61 model=model,
62 tokenizer=tokenizer,
63 max_new_tokens=512
64)
65
66from langchain_community.document_loaders import JSONLoader
67
68loader = JSONLoader(
69 file_path="<YOUR DATABASE>",
70 jq_schema=".summary",
71 text_content=False,
72 json_lines=True, # JSONL形式でファイルを読み込む
73)
74
75docs = loader.load()
76print(docs[0])
77
78import langchain.text_splitter
79
80#読込した内容を分割する
81text_splitter = langchain.text_splitter.RecursiveCharacterTextSplitter(
82 chunk_size=1024,
83 chunk_overlap=0,
84)
85docs = text_splitter.split_documents(docs)
86
87#FAISS indexの作成
88from langchain.vectorstores import FAISS
89vectorstore = FAISS.from_documents(docs, embedding)
90
91
92retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 2})
93
94from langchain.prompts import ChatPromptTemplate
95from langchain_community.vectorstores import Chroma
96from langchain_core.output_parsers import StrOutputParser
97from langchain_core.runnables import RunnableLambda, RunnablePassthrough
98
99def format_docs(docs):
100 return "\n\n".join(doc.page_content for doc in docs)
101
102#Modified chain definition:
103chain = (
104 RunnableLambda(lambda x: {"context": format_docs(retriever.get_relevant_documents(x)), "query": x})
105 | prompt
106 | RunnableLambda(lambda x: x.to_string()) # Convert StringPromptValue to string
107 | pipe
108 | RunnableLambda(lambda x: x[0]["generated_text"] if isinstance(x, list) and x else x["generated_text"]) # Extract generated text from the output of the pipe
109 | StrOutputParser()
110)
111
112#Invoke the chain with the question string directly, not a dictionary
113res = chain.invoke(question)
114
115def format_docs(docs):
116 return "\n\n".join(doc.page_content for doc in docs)
117
118def RAG(user_prompt):
119 #プロンプトを準備
120 template = """
121 <bos><start_of_turn>###指示
122 次の文脈を参考にして回答してください。
123 ただし、参考情報が質問に関係ない場合は、参考情報を無視して回答を生成してください。
124 また、回答の際は、同じ単語や話題を繰り返さないでください。
125 {context}
126 <end_of_turn><start_of_turn>###質問
127 {query}
128 <end_of_turn><start_of_turn>###回答
129 """
130 prompt = langchain.prompts.PromptTemplate.from_template(template) # Corrected indentation
131
132 #Modified chain definition:
133 chain = (
134 RunnableLambda(lambda x: {"context": format_docs(retriever.get_relevant_documents(x)), "query": x})
135 | prompt
136 | RunnableLambda(lambda x: x.to_string()) # Convert StringPromptValue to string
137 | pipe
138 | RunnableLambda(lambda x: x[0]["generated_text"] if isinstance(x, list) and x else x["generated_text"]) # Extract generated text from the output of the pipe
139 | StrOutputParser()
140 )
141
142 res = chain.invoke(user_prompt)
143 result = res.split("###回答")[-1].replace("\n", "")
144 return result
145
146
147 def llm(user_prompt):
148
149 prompt = f"""### 指示
150 {user_prompt}
151 #回答:
152 """
153
154 tokenized_input = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
155 with torch.no_grad():
156 outputs = model.generate(
157 tokenized_input,
158 max_new_tokens=512,
159 do_sample=False,
160 use_cache = True,
161 repetition_penalty=1.2,
162 temperature=0.1,
163 pad_token_id=tokenizer.eos_token_id
164 )[0]
165 output = tokenizer.decode(outputs[tokenized_input.size(1):], skip_special_tokens=True)
166 return output
167
168 #results.append({"task_id": data["task_id"], "input": input, "output": output})
169
170def judge_score_llm(user_prompt):
171 scores = [item[1] for item in vectorstore.similarity_search_with_score(user_prompt)]
172 max_score = max(scores)
173
174 if max_score < 0.20:
175 print("###RAG####")
176 return RAG(user_prompt),
177
178 else:
179 print("####LLMより回答生成")
180 return llm(user_prompt),
181 #return llm(user_prompt),print("####LLMより回答生成")
182
183def judge_score_llm(user_prompt):
184 scores = [item[1] for item in vectorstore.similarity_search_with_score(user_prompt)]
185 avg_score = sum(scores) / len(scores) if scores else 0 # スコアの平均を計算
186
187 if avg_score < 0.25: # 平均スコアが 0.20 以下の場合
188 print("###RAG####")
189 return RAG(user_prompt)
190 else:
191 print("####LLMより回答生成")
192 return llm(user_prompt)
193
194#データセットの読み込み。
195
196datasets = []
197with open("./elyza-tasks-100-TV_0.jsonl", "r") as f:
198 item = ""
199 for line in f:
200 line = line.strip()
201 item += line
202 if item.endswith("}"):
203 datasets.append(json.loads(item))
204 item = ""
205
206”””python
207
208
209
210
211
212
213