🙆♀️
【openAI】ユーザーの嗜好に合わせて記事をスコアリング
内容は以下の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種類のいずれか。
- system :プロンプト。contentに何書けば良いかわからんかったら、「You are a helpful assistant」と書いとけば良い?
- user : ユーザーの入力
- assistant: AIの出力。contentには表形式で出力してなど(systemとの違いがよくわからない・・・)
- 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