Uploaded model
- Developed by: Rakushaking
- License: apache-2.0
- Finetuned from model : llm-jp/llm-jp-3-13b
This llama model was trained 2x faster with Unsloth and Huggingface's TRL library.
llm-jp-3-13bをインストラクションチューニングして作成した日本語対応モデルです。
Model Details
llm-jp-3-13b-it-d11_loraは、大規模言語モデルllm-jp-3-13bをベースに、指示応答タスク(Instruction Tuning)を通じて特定の日本語タスクに最適化したモデルです。
具体的には、以下の特徴を持っています: 応答の正確性向上: 日本語での指示に対する的確な応答 タスク指向の最適化: 特定のユースケースに対応
Model Sources
Repository: llm-jp-3-13b-it-d11_lora Base Model: llm-jp/llm-jp-3-13b
Direct Usecase
このモデルは、日本語における質問応答や、タスク指向のアシスタントとして使用できます。 主な用途: 教育分野での質問応答 企業内での業務サポート 日本語NLP研究への活用 Downstream Use 特定の日本語タスク(例: 意味分類、要約、対話生成)への活用が可能です。
Out-of-Scope Use
以下の用途には向いていません:
悪意ある利用(例: 偏見や差別を助長する応答生成) 正確性が求められるクリティカルな決定の支援 Bias, Risks, and Limitations
Limitations
日本語以外のタスクでは性能が劣る場合があります。 トレーニングデータ由来のバイアスが含まれている可能性があります。
Recommendations
利用者はモデルが完全に正確ではないことを理解し、応答内容の確認を推奨します。
How to Get Started with the Model
以下のコードでモデルをロードして使用できます。
推論手法①(LLM生成)
!pip install -U bitsandbytes
!pip install -U transformers
!pip install -U accelerate
!pip install -U datasets
#notebookでインタラクティブな表示を可能とする(ただし、うまく動かない場合あり)
!pip install ipywidgets --upgrade
#Hugging Faceで取得したTokenをこちらに貼る。
HF_TOKEN = <your key>
#モデルのID
model_name = "Rakushaking/llm-jp-3-13b-it-d11_lora"
#QLoRA config
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=False,
)
#Load model
model = AutoModelForCausalLM.from_pretrained(
model_name,
quantization_config=bnb_config,
device_map="auto",
token = HF_TOKEN
)
#Load tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True, token = HF_TOKEN)
prompt = f"""### 指示:<your question>
###回答:
"""
tokenized_input = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
tokenized_input,
max_new_tokens=512,
do_sample=False,
repetition_penalty=1.2
temprature = 0.1
)[0]
output = tokenizer.decode(outputs[tokenized_input.size(1):], skip_special_tokens=True)
print(output)
推論手法②(RAG拡張生成)
特定タスク性能が向上する可能性あり
アーキテクチャ
#自分の作成したモデルのIDをこちらに貼る。
model_name = "Rakushaking/llm-jp-3-13b-it-d11_lora"
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
BitsAndBytesConfig,
)
import torch
from tqdm import tqdm
import json
#QLoRA config
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=False,
)
#Load model
model = AutoModelForCausalLM.from_pretrained(
model_name,
quantization_config=bnb_config,
device_map="auto",
token = HF_TOKEN
)
#Load tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True, token = HF_TOKEN)
import langchain
from langchain.embeddings import HuggingFaceEmbeddings
from llama_index.core import ServiceContext, SQLDatabase, VectorStoreIndex
from typing import Any, List
#埋め込みクラスにqueryを付加
class HuggingFaceQueryEmbeddings(HuggingFaceEmbeddings):
def __init__(self, **kwargs: Any):
super().__init__(**kwargs)
def embed_documents(self, texts: List[str]) -> List[List[float]]:
return super().embed_documents(["query: " + text for text in texts])
def embed_query(self, text: str) -> List[float]:
return super().embed_query("query: " + text)
#ベクトル化する準備
embedding = langchain.embeddings.HuggingFaceEmbeddings(
model_name="intfloat/multilingual-e5-base",
#model_kwargs=model_kwargs,
#encode_kwargs=encode_kwargs
)
from transformers import pipeline
from langchain.llms import HuggingFacePipeline
#パイプラインの準備
pipe = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
max_new_tokens=512
)
from langchain_community.document_loaders import JSONLoader
loader = JSONLoader(
file_path="<YOUR DATABASE>",
jq_schema=".summary",
text_content=False,
json_lines=True, # JSONL形式でファイルを読み込む
)
docs = loader.load()
print(docs[0])
import langchain.text_splitter
#読込した内容を分割する
text_splitter = langchain.text_splitter.RecursiveCharacterTextSplitter(
chunk_size=1024,
chunk_overlap=0,
)
docs = text_splitter.split_documents(docs)
#FAISS indexの作成
from langchain.vectorstores import FAISS
vectorstore = FAISS.from_documents(docs, embedding)
retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 2})
from langchain.prompts import ChatPromptTemplate
from langchain_community.vectorstores import Chroma
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableLambda, RunnablePassthrough
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
#Modified chain definition:
chain = (
RunnableLambda(lambda x: {"context": format_docs(retriever.get_relevant_documents(x)), "query": x})
| prompt
| RunnableLambda(lambda x: x.to_string()) # Convert StringPromptValue to string
| pipe
| 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
| StrOutputParser()
)
#Invoke the chain with the question string directly, not a dictionary
res = chain.invoke(question)
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
def RAG(user_prompt):
#プロンプトを準備
template = """
<bos><start_of_turn>###指示
次の文脈を参考にして回答してください。
ただし、参考情報が質問に関係ない場合は、参考情報を無視して回答を生成してください。
また、回答の際は、同じ単語や話題を繰り返さないでください。
{context}
<end_of_turn><start_of_turn>###質問
{query}
<end_of_turn><start_of_turn>###回答
"""
prompt = langchain.prompts.PromptTemplate.from_template(template) # Corrected indentation
#Modified chain definition:
chain = (
RunnableLambda(lambda x: {"context": format_docs(retriever.get_relevant_documents(x)), "query": x})
| prompt
| RunnableLambda(lambda x: x.to_string()) # Convert StringPromptValue to string
| pipe
| 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
| StrOutputParser()
)
res = chain.invoke(user_prompt)
result = res.split("###回答")[-1].replace("\n", "")
return result
def llm(user_prompt):
prompt = f"""### 指示
{user_prompt}
#回答:
"""
tokenized_input = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
tokenized_input,
max_new_tokens=512,
do_sample=False,
use_cache = True,
repetition_penalty=1.2,
temperature=0.1,
pad_token_id=tokenizer.eos_token_id
)[0]
output = tokenizer.decode(outputs[tokenized_input.size(1):], skip_special_tokens=True)
return output
#results.append({"task_id": data["task_id"], "input": input, "output": output})
def judge_score_llm(user_prompt):
scores = [item[1] for item in vectorstore.similarity_search_with_score(user_prompt)]
max_score = max(scores)
if max_score < 0.20:
print("###RAG####")
return RAG(user_prompt),
else:
print("####LLMより回答生成")
return llm(user_prompt),
#return llm(user_prompt),print("####LLMより回答生成")
def judge_score_llm(user_prompt):
scores = [item[1] for item in vectorstore.similarity_search_with_score(user_prompt)]
avg_score = sum(scores) / len(scores) if scores else 0 # スコアの平均を計算
if avg_score < 0.25: # 平均スコアが 0.20 以下の場合
print("###RAG####")
return RAG(user_prompt)
else:
print("####LLMより回答生成")
return llm(user_prompt)
#テスト
input = "次の文章では、どこかの時点である記事から別の記事へと変わります。あなたのタスクはこの境界を推測し、別の記事に変わった最初の文を記述することです。\n\nイスラエルとレバノンの対立が激化する中、イランがイスラエルへの報復として200発近いミサイルを発射しました。サイレンが鳴り響くイスラエル・テルアビブの夜空に、突如現れた大量の光。日本時間の2日未明、イランがイスラエルへ過去最大のミサイル攻撃に踏み切った。ロイター通信は、イスラエル南部で小学校にミサイルが直撃したと伝えています。「重度訪問介護」のヘルパー不足が深刻化しています。高齢化社会の進展に伴い、重度障害を持つ利用者が増加したため、ヘルパーが足りない状況となっています。この問題は、介護労働者の処遇改善や若者への職業紹介など、多方面からの取り組みが求められています。"
judge_score_llm(input)
Inference Providers
NEW
This model isn't deployed by any Inference Provider.
🙋
Ask for provider support
HF Inference deployability: The model has no pipeline_tag.
Model tree for Rakushaking/llm-jp-3-13b-it-d11_lora
Base model
llm-jp/llm-jp-3-13b