🙆‍♀️

【openAI】ユーザーの嗜好に合わせて記事をスコアリング

2024/06/08に公開

内容は以下のtext-generationをかいつまんでいます。
https://platform.openai.com/docs/guides/text-generation

簡単な書き方

記事はYahooニュースから引っ張ってきました。

    "「Hey! Say! JUMP」の有岡大貴(33)と女優の松岡茉優(29)が7日、結婚を発表した。",
    "俳優の石原さとみ(37)が6日、都内で行われた映画『ミッシング』に出席し、号泣したことを明かした。",
    "自民党派閥の政治資金規正法違反事件などを受けて、国民の政治不信が強まっている。"

政治家の記事を読んでも腹立つだけなので、松岡茉優の結婚の方が興味あるところですが、
今回は「政治には興味あって芸能には興味のないユーザー」としてスコアリングを行います。

from openai import OpenAI

client = OpenAI(api_key="***")

completion = client.chat.completions.create(
  model="gpt-3.5-turbo", #gpt-3.5-turbo or gpt-4o
  messages=[
    {
      "role": "system",
      "content": """
                あなたはユーザーの嗜好に応じて、記事のスコアリングを行うAIです。
                ユーザーの嗜好には、政治問題に興味がありますが、芸能記事には興味がありません。
                ユーザーが渡す記事について、ユーザーの嗜好にどの程度合っているかを0から100のスケールで評価してください。
                """
    },
    {
        "role": "assistant",
        "content": "①記事の番号、②スコア、③記事のキーワードをテーブル形式で出力してください。"
    },
    {
        "role":"user",
        "content":"「Hey! Say! JUMP」の有岡大貴(33)と女優の松岡茉優(29)が7日、結婚を発表した。"
    },
    {
        "role":"user",
        "content":"俳優の石原さとみ(37)が6日、都内で行われた映画『ミッシング』に出席し、号泣したことを明かした。"
    },
    {
        "role":"user",
        "content":"自民党派閥の政治資金規正法違反事件などを受けて、国民の政治不信が強まっている。"
    }
  ],
  temperature=0.7, # 0から1の間の値で、1に近いほどランダム性が高くなる
  max_tokens=64, # 生成されるトークンの最大数
  top_p=1 # 0から1の間の値で、1に近いほどトークンの選択確率が高くなる
)

print(completion.choices[0].message.content)

実行すると以下のようにスコアリングされました。
(modelによって少し結果が異なります)

model="gpt-3.5-turbo"

| 記事の番号 | スコア | 記事のキーワード                    |
|----------|-------|--------------------------------|
| 1        | 10    | 有岡大貴, 松岡茉優, 結婚           |
| 2        | 10    | 石原さとみ, 映画, ミッシング, 号泣    |
| 3        | 90    | 自民党, 政治資金規正法違反, 政治不信 |

model="gpt-4o"

| 記事番号 | スコア | 記事のキーワード |
|-------|------|--------------|
| 1     | 0    | Hey! Say! JUMP, 有岡大貴, 松岡茉優, 結婚 |
| 2     | 0    | 石原さとみ, 映画, ミッシング, 号泣 |
| 3     | 100  | 自民党派閥, 政治資金規正法違反, 政治不信 |

roleとcontentについて

roleは以下の4種類のいずれか。

  1. system :プロンプト。contentに何書けば良いかわからんかったら、「You are a helpful assistant」と書いとけば良い?
  2. user : ユーザーの入力
  3. assistant: AIの出力。contentには表形式で出力してなど(systemとの違いがよくわからない・・・)
  4. tool:エージェントツールを書く?

少し改修

上記の書き方を、記事が増えた時にも対応できるよう改修しました

user_preference = """
                 あなたはユーザーの嗜好に応じて、記事のスコアリングを行うAIです。
                 ユーザーの嗜好には、政治問題に興味がありますが、芸能記事には興味がありません。
                 ユーザーが渡す記事について、ユーザーの嗜好にどの程度合っているかを0から100のスケールで評価してください。
                 """

articles = [
    "「Hey! Say! JUMP」の有岡大貴(33)と女優の松岡茉優(29)が7日、結婚を発表した。",
    "俳優の石原さとみ(37)が6日、都内で行われた映画『ミッシング』に出席し、号泣したことを明かした。",
    "自民党派閥の政治資金規正法違反事件などを受けて、国民の政治不信が強まっている。"
]

def score_articles(preference, articles):
    messages = [
        {"role": "system", "content": preference},
        {"role": "assistant", "content": "①記事の番号、②スコア、③記事のキーワードをテーブル形式で出力してください。"}
    ]

    for i, article in enumerate(articles, 1):
        messages.append({"role": "user", "content": f"{i}. {article}"})

    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=messages,
        temperature=0.7,
        max_tokens=150
    )

    return response.choices[0].message.content


print(score_articles(user_preference, articles))

ユーザーの嗜好の変化に合わせる

冒頭で話したように、松岡茉優には興味があったとしましょう。

その場合は、以下のようにuser_preferenceを都度作成するような書き方にするとユーザーの嗜好の変化を加えて、出力結果を変えることができます。

user_preference = """
興味あり: 政治問題、松岡茉優
興味なし: 芸能記事
                 """

def create_prompt_template(preference):
    return f"""
    あなたはユーザーの嗜好に応じて、記事のスコアリングを行うAIです。
    ユーザーの嗜好には、{preference}。
    ユーザーが渡す記事について、ユーザーの嗜好にどの程度合っているかを0から100のスケールで評価してください。
    """

user_preference = create_prompt_template(user_preference)

articles = [
    "「Hey! Say! JUMP」の有岡大貴(33)と女優の松岡茉優(29)が7日、結婚を発表した。",
    "俳優の石原さとみ(37)が6日、都内で行われた映画『ミッシング』に出席し、号泣したことを明かした。",
    "自民党派閥の政治資金規正法違反事件などを受けて、国民の政治不信が強まっている。"
]

def score_articles(preference, articles):
    messages = [
        {"role": "system", "content": preference},
        {"role": "assistant", "content": "①記事の番号、②スコア、③記事のキーワードをテーブル形式で出力してください。"}
    ]

    for i, article in enumerate(articles, 1):
        messages.append({"role": "user", "content": f"{i}. {article}"})

    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=messages,
        temperature=0.7,
        max_tokens=150
    )

    return response.choices[0].message.content


print(score_articles(user_preference, articles))

実用では、ユーザーの興味に応じて記事を仕分けし、興味のある記事に含まれているキーワードをuser_preferenceに追加していくようにすれば良いのではないでしょうか

Discussion