hiroki-rad's picture
how to use create
231f85a verified
metadata
library_name: transformers
datasets:
  - elyza/ELYZA-tasks-100
language:
  - ja
base_model:
  - llm-jp/llm-jp-3-13b
pipeline_tag: text-generation

How to Uses

# ライブラリのインストール
!pip install -U langchain-community langchain-huggingface vllm triton fugashi unidic-lite
# インストール
import json
import pandas as pd
from tqdm import tqdm
from transformers import pipeline
from langchain_community.llms import VLLM
from langchain.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain.schema.output_parser import StrOutputParser


# GitHub repositoryのclone
!git clone https://github.com/y-hiroki-radiotech/llm-final-task.git
%cd llm-final-task

# タスク別に設定したプロンプトを使うために、PromptStockクラスをインスタンス化
from prompt import PromptStock
prompt_stock = PromptStock()

# データのpandas形式で準備する
file_path = 'elyza-tasks-100-TV_0.jsonl' # ここにjsonlを指定する
data = pd.read_json(file_path, lines=True)

# データのinputに対して、タスクラベルを与える。タスクを8分類してある。
model_name = "hiroki-rad/bert-base-classification-ft"
classify_pipe = pipeline(model=model_name, device="cuda:0")

results: list[dict[str, float | str]] = []
for example in data.itertuples():
    # モデルの予測結果を取得
    model_prediction = classify_pipe(example.input)[0]
    # 正解のラベルIDをラベル名に変換
    results.append( model_prediction["label"])

data["label"] = results

# タスク回答のためのモデルをvLLMを使ってインストール
model_name = "hiroki-rad/llm-jp-llm-jp-3-13b-16-ft"

llm = VLLM(model=model_name,
           quantization="awq")

# テンプレートの作成
template = """
ユーザー: 質問を良く読んで、適切な回答をしてください。
{context}
質問:{input}
回答:"""

prompt = PromptTemplate(
    template=template,
    input_variables=["context", "input"],
    template_format="f-string"
)
# chainの作成
vllm_chain = prompt | llm

chain = (
    RunnablePassthrough()
    | vllm_chain
    | StrOutputParser()
)

outputs = []
total_rows = len(data)
with tqdm(total=total_rows,
          desc="Processing rows",
          position=0,
          leave=True
         ) as pbar:
    for row in data.itertuples():
        prompt_string = prompt_stock.get_prompt(row.label)

        input_dict = {
            "context": prompt_string,
            "input": row.input
        }

        output = chain.invoke(input_dict)
        outputs.append(output)

        pbar.update(1)

# 出力
jsonl_data = []

for i in range(len(data)):
    task_id = data.iloc[i]["task_id"]
    output = outputs[i]

    jsonl_object = {
        "task_id": task_id,
        "output": output
    }
    jsonl_data.append(jsonl_object)

with open("output.jsonl", "w") as outfile:
  for entry in jsonl_data:
    entry["task_id"] = int(entry["task_id"])
    json.dump(entry, outfile)
    outfile.write('\n')