LLM入門　コード１

## 文章がpositiveかnegativeか
```
from transformers import pipeline
text_classification_pipeline = pipeline(
    model = "llm-book/bert-base-japanese-v3-marc_ja"
)
positive_text="世界には言葉がわからなくても感動する音楽がある"
print(text_classification_pipeline(positive_text)[0])
negative_text="世界には言葉がでないほどひどい音楽がある。"
print(text_classification_pipeline(negative_text)[0])
```
## 二つの文が論理的に含意か矛盾か中立か
```
from transformers import pipeline
nli_pipleline=pipeline(model="llm-book/bert-base-japanese-v3-jnli")
text="二人の男性がジェット機を見ています"
entailment_text="ジェット機を見ている人が二人います"
print(nli_pipleline({"text":text,"text_pair":entailment_text}))
contradiction_text="二人の男性が飛んでいます"
print(nli_pipleline({"text":text,"text_pair":contradiction_text}))
neutral_text="２人の男性が、白い飛行機を眺めています"
print(nli_pipleline({"text":text,"text_pair":neutral_text}))

```
entailmentが含意
contradictionが矛盾
neutralが中立
## 意味的類似度計算（類似度をスコアとして表現）
```
text_sim_pipeline=pipeline(
    model="llm-book/bert-base-japanese-v3-jsts",
    function_to_apply="none",
)
text = "川べりでサーフボードを持った人達がいます"
sim_text="サーファーたちが川べりに立っています"
result=text_sim_pipeline({"text":text,"text_pair":sim_text})
print(result["score"])
dissim_text="トイレの壁に黒いタオルがかけられています"
result= text_sim_pipeline({"text":text,"text_pair":dissim_text})
print(result["score"])
```
似ていればスコアが高く、そうでなければ低い
```
from torch.nn.functional import cosine_similarity
sim_enc_pipeline=pipeline(
    model="llm-book/bert-base-japanese-v3-unsup-simcse-jawiki",
    task="feature-extraction",
)
text_emb=sim_enc_pipeline(text,return_tensors=True)[0][0]
sim_emb=sim_enc_pipeline(sim_text,return_tensors=True)[0][0]
sim_pair_score=cosine_similarity(text_emb,sim_emb,dim=0)
print(sim_pair_score.item())
```
コサイン類似度で評価する場合。-1~1の範囲で評価。上のコードも実行しないとエラーがでます。
ベクトル形式に変換したのち、コサイン類似度で評価。

## 固有値分解
```
from pprint import pprint

ner_pipeline = pipeline(
    model="llm-book/bert-base-japanese-v3-ner-wikipedia-dataset",
    aggregation_strategy="simple",
)
text = "齋藤飛鳥は東京出身のアイドル"
pprint(ner_pipeline(text))
```
## 要約生成
```
text2text_pipeline=pipeline(
    model="llm-book/t5-base-long-livedoor-news-corpus"
)
article = "ついに始まった３連休。テレビを見ながら過ごしている人も多いのではないだろうか？　今夜オススメなのは何と言っても、NHKスペシャル「世界を変えた男 スティーブ・ジョブズ」だ。実は知らない人も多いジョブズ氏の養子に出された生い立ちや、アップル社から一時追放されるなどの経験。そして、彼が追い求めた理想の未来とはなんだったのか、ファンならずとも気になる内容になっている。 今年、亡くなったジョブズ氏の伝記は日本でもベストセラーになっている。今後もアップル製品だけでなく、世界でのジョブズ氏の影響は大きいだろうと想像される。ジョブズ氏のことをあまり知らないという人もこの機会にぜひチェックしてみよう。 世界を変えた男　スティーブ・ジョブズ（NHKスペシャル）"
# articleの要約を生成
print(text2text_pipeline(article)[0]["generated_text"])
```
## トークンごとに区切る

```
from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("abeja/gpt2-large-japanese")
tokenizer.tokenize("今日は天気がいいので")
```

### トークン後の文章生成
```
from transformers import AutoModelForCausalLM

# 生成を行うモデルであるAutoModelForCausalLMを使ってモデルをロードする
model = AutoModelForCausalLM.from_pretrained(
    "abeja/gpt2-large-japanese"
)
# トークナイザを使ってモデルへの入力を作成する
inputs = tokenizer("今日は天気が良いので", return_tensors="pt")
# 後続のテキストを予測
outputs = model.generate(
    **inputs,
    max_length=15,  # 生成する最大トークン数を15に指定
    pad_token_id=tokenizer.pad_token_id  # パディングのトークンIDを指定
)
# generate関数の出力をテキストに変換する
generated_text = tokenizer.decode(
    outputs[0], skip_special_tokens=True
)
print(generated_text)
```

## 参考文献
このサンプルコードは書籍「大規模言語モデル入門」から書きました。
この投稿は自分用のメモのようなものです。
詳しいものは
https://github.com/ghmagazine/llm-book
公式を見てください