1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Life is Tech ! MentorsAdvent Calendar 2024

Day 12

献立を考えるのがめんどくさい?シェフLLMと翻訳APIで解決してみた!

Last updated at Posted at 2024-12-12

はじめに...

⚠ ちゃんとした解説記事ではないので、おにぎり片手に読んでくださいな。

献立を考えるのって本当にめんどくさい!

毎日のご飯、どうしてますか?

僕はもう、考えるのがめんどくさすぎてつらいんですよね。

冷蔵庫を開けて、「これで何作れるんだっけ?」と悩む時間、無駄に感じませんか?

そんなとき、ある考えがひらめきました。

「これ、AIに丸投げできないかな?」と。

AIシェフ登場!

探してみたら、ありましたよ!

その名も シェフLLM(Chef Transformer(T5)[参考文献 : 2])。

冷蔵庫にある材料を入力すると、メニューとレシピを提案してくれる夢のようなAIです。

「これで献立から解放される~!」と期待に胸を膨らませながら使ってみたんですが...。

おい、英語しか対応してないやん!

なんと、シェフLLMは 英語専用。

私の冷蔵庫にいる「卵」「キャベツ」「豚肉」たちが、見事に「Egg」「Cabbage」「Pork」に変身しないとAIが理解してくれないんです。

スクリーンショット 2024-12-12 181445.png

材料とは関係ないレシピを提案してきた...

これ、ハードル高くないですか?

でもここで諦めたらダメだと思った僕、さらなる方法を模索します。

Google翻訳APIでパイプラインを作成!

「日本語で書いた材料を自動で英語に翻訳して、シェフLLMに投げたら良くない?」

というわけで、Google翻訳APIを導入 [参考文献 : 1]

これで冷蔵庫の材料を日本語で入力すると、自動的に英語に変換され、英語の材料データがシェフLLMに渡される仕組みを作りました!

📄 プログラムだよ

使用言語:Python
実行環境:Google Colaboratory
シェフ LLM:t5-recipe-generation
翻訳 API:Google 翻訳 API

⚙ セットアップ

1️⃣リクエスト送る用のモジュールのセットアップ

# リクエスト送る用のモジュールをインストールする
pip install requests

# リクエスト送る用のモジュールをインポートする
import requests

2️⃣レシピ作成LLMのセットアップ

t5-recipe-generation の「How To Use」のセットアップコードを実行してシェフLLMを準備する。

3️⃣ヘルパー関数を定義する

# 英語のレシピを辞書に変換するメソッド
# 引数:generated:生成された英語レシピ
# 戻り値:parsed_recipes:成形された英語レシピ
def convert_recipes_to_recipe_data(generated):

    parsed_recipes = []

    for text in generated:
        recipe = {}
        sections = text.split("\n")
        for section in sections:
            section = section.strip()
            if section.startswith("title:"):
                title = section.replace("title:", "").strip().capitalize()
                recipe["title"] = title
            elif section.startswith("ingredients:"):
                ingredients = section.replace("ingredients:", "").strip()
                recipe["ingredients"] = [ing.strip().capitalize() for ing in ingredients.split("--")]
            elif section.startswith("directions:"):
                directions = section.replace("directions:", "").strip()
                recipe["directions"] = [step.strip().capitalize() for step in directions.split("--")]

        if recipe:
            parsed_recipes.append(recipe)

    return parsed_recipes

# レシピデータを表示する関数
# 引数:recipes:成形したレシピデータ
# 出力:レシピ(料理区切り)
def show_recipe(recipes):

  for recipe in recipes:

    print("=" * 130)

    print("Title : {0}".format(recipe['title']))

    print("-" * 130)

    print("Ingredients : ")
    for ing in recipe['ingredients']:
      print(ing)
    print("-" * 130)

    print("Directions : ")
    for i, ing in enumerate(recipe['directions']):
      print(i+1, ':', ing)

    print("=" * 130)

# 翻訳関数

import json

# 引数:text:翻訳したい文章
# 引数:source_lang:翻訳前の言語
# 引数:target_lang:翻訳後の言語
# 戻り値:翻訳された文章
def translate(text, source_lang, target_lang):
      params = {'text': text, 'source': source_lang, 'target': target_lang}
      respons = requests.get('ここはGoogle翻訳APIのURLを入力してね', params=params)
      return json.loads(respons.text)['text']

# 日本語の材料データを英語の材料データに翻訳する
# 引数:text:翻訳したい文章
# 引数:source_lang:翻訳前の言語
# 引数:target_lang:翻訳後の言語
# 戻り値:翻訳された文章
def translate_ingredient_data(ingredient_data, source_lang="ja", target_lang="en"):

    translated_ingredients = []

    for ingredient_line in ingredients:
        # スペースで分割
        japanese_items = ingredient_line.split()

        # 各アイテムを英語に翻訳
        english_items = [translate(item, source_lang, target_lang) for item in japanese_items]

        # カンマ区切りで結合
        translated_ingredients.append(", ".join(english_items))

    return translated_ingredients

# 英語のレシピデータを日本語に変換する
# 引数:recipe_data:翻訳したいレシピデータ
# 引数:source_lang:翻訳前の言語
# 引数:target_lang:翻訳後の言語
# 戻り値:translated_recipes:翻訳されたレシピデータ
def translate_recipe_data(recipe_data, source_lang="en", target_lang="ja"):
    translated_recipes = []

    for recipe in recipe_data:
        translated_recipe = {}

        # タイトルの翻訳
        translated_recipe['title'] = translate(recipe['title'], source_lang, target_lang)

        # 材料の翻訳
        translated_recipe['ingredients'] = [
            translate(ingredient, source_lang, target_lang) for ingredient in recipe['ingredients']
        ]

        # 手順の翻訳
        translated_recipe['directions'] = [
            translate(direction, source_lang, target_lang) for direction in recipe['directions']
        ]

        translated_recipes.append(translated_recipe)

    return translated_recipes

🧑‍🍳アプリケーション側

1️⃣ 日本語で材料を入力する

# ※ 材料は半角スペース区切りで入力する
# ※ 材料は料理ごとに入力する
ingredients = [
    "マカロニ バター 塩 ベーコン 牛乳 小麦粉 コショウ クリームコーン",
    "プロヴォローネチーズ ベーコン パン 生姜"
]
print(ingredients) # 確認用

2️⃣ 材料を日本語から英語に翻訳する

translated_ingredients = translate_ingredient_data(ingredients, source_lang="ja", target_lang="en")
print(translated_ingredients)  # 確認用

3️⃣ 英語の材料から英語のレシピをシェフLLMに考えてもらう

generated_recipe = generation_function(translated_ingredients)
print(generated_recipe)  # 確認用

4️⃣ シェフLLMが考えた英語のレシピを英語のレシピデータに変換する

recipe_datas = convert_recipes_to_recipe_data(generated_recipe)
print(recipe_datas)  # 確認用

5️⃣ 英語のレシピデータを日本語のレシピデータに変換する

translated_recipes = translate_recipe_data(recipe_datas, "en", "ja")
print(translated_recipes)  # 確認用

6️⃣ 日本語のレシピデータをいい感じ(!?)に表示する

show_recipe(translated_recipes)

実際に使ってみたら... おお、これは便利!

「キャベツ, 卵, 豚肉, コショウ, ケチャップ, マヨネーズ, お米」を入力してみたら、出てきたメニューがこれ👇

スクリーンショット 2024-12-12 182300.png

しかも、ちゃんとしたレシピもセットで出てきます!

翻訳機を2個通しているから翻訳が微妙なところはあるけど...

手順ごとのレシピとか、ちゃんと実用的な内容。

これ、普通に使えるかも...?

終わりに

今回、献立をAIに考えさせる試みをやってみた結果、メニューを考えることに関してはめちゃくちゃ楽になりました。

しかも、翻訳APIを組み込むことで、AIシェフも多言語に対応!問題なく(笑) 使えるように。

「今日のご飯どうしよう...」と悩む時間を削減したい方、ぜひ試してみてください!

参考文献

  1. Google翻訳APIを無料で作る方法, さっと 様,
    Qiita, 投稿日:2019年07月27日
  2. t5-recipe-generation, Flax Community 様,
    Hugging Face, 公開日:2021年07月02日
  3. PythonのrequestsライブラリでHTTPリクエストを送信する方法, しゃちく 様,
    社内SE 〜しゃちくによる社内IT化計画〜, 公開日:2023年03月18日
  4. 【Python入門】splitlinesで文字列を改行で分割する方法, 侍テック編集部 様,
    SAMURAI ENGINEER Blog, 投稿日:2024年5月6日
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?