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拡張生成)

特定タスク性能が向上する可能性あり

アーキテクチャ

image/png

#自分の作成したモデルの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)
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for Rakushaking/llm-jp-3-13b-it-d11_lora

Finetuned
(1117)
this model