File size: 3,034 Bytes
6b8cfab
 
231f85a
 
 
 
 
 
 
6b8cfab
 
 
231f85a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
---
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
```python
# ライブラリのインストール
!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')