見出し画像

完全ローカルで仕事自動化、自律型AIエージェントCrewAI × LM Studioを動かす!(基礎編・自動AI画像生成)

相変わらず基本はNo課金、AIという最新の時代の流れに乗っているのか遅れているのか分かりませんが、殆どローカルでAIを動かす umanikomi です。
今回、ちょっと流行り?の自律型AIエージェント(自分で考えてPCの作業をしてくれる)がローカルでも動くだろうと思い、CrewAI を試してみました。

以下はシンプルなAIエージェント1人の例ですが。複数人(複数機能)のAIエージェントを用意して、それぞれが働き、目的へ向けてAIの共同作業が出来るようにできます。

あくまでも画像生成をやらせているのはサンプルのお題としての作業であって、他の作業でもOKです💦

画像
画像
作成された画像例
※ポジティブプロンプト、ネガティブプロンプトなどの一部は固定で入れてます

ちなみに、CrewAI は、どうやらゴリゴリのpythonになってしまうようでpythonのプログラムなどに抵抗がある人には、ちょっと難易度のハードルがある記事内容かもしれません。
※LM StudioはGUI、インターフェースの画面アリです


自律型AIエージェントシステムの選定

ちなみに、ローカルAIエージェントはいろいろ出て来ているようですが、最も人気があるようなので、CrewAIに決めました。
AgenticSeekも、良いかもしれません。

画像

今回は試しませんが、AgenticSeekは参考として、以下に日本語のreadmeがありました。


意地でも無課金でやり遂げるためにローカルLLMを起動させる

まず、ローカルでChatGPTのようなLLM(大規模言語モデル)を動かすために神のLLM管理ツール、LM StudioでLLMを使えるようにします。
「わしゃ金払ってChatGPTに課金しておりますがな」って人は、一気に読み飛ばしてCrewAIの起動のところまで飛ばしてくださいw

また「LM Studioとか知らんがな」って人は、過去記事の、下記の記事を参考にしてみてください。学習量の大きさを欲張ると重いですが。。。ローカルなプライベートな環境で対話式AIなどが使えるようになります。

※重い、そして、AIの賢さがあなたのGPUスペックに比例するので、もしChatGPTに課金しているなら「APIリクエストは別途料金がかかりますが」ChatGPTのほうが全然良いです💦
ある程度、ローカルLLMで作ってからChatGPTに切り替えてもいいかもしれないですね。

CrewAIと連携、及び、RTX 3060 Ti(4GB VRAM)の私の場合は、ChatGPTにMistral-7B をお勧めされました。
ここで動作しなかったりして少し悩んだのですが、どうやらCrewAIで利用するには、そのままのモデルはインターフェースが対応していないらしいです。
結果、Mistral_7B_CrewAI という mistralAIをラップしたカスタムラッパーのAIを利用しました(何かマニアックになってきたような)
※恐らくMistral系以外の他のモデルでもcrewAIにインターフェースがカスタムされたモデルじゃないと動かないケースがあると思われます。

LM Studioの以下のメニューから「探索」
検索欄に、上記の「Mistral Crewai」と入れます。

画像

一番上位に最も人気なカスタムラッパーのモデルが出ます。他のでも良いのですが、普通に人気があるモデルにしてみます。
ちなみに7Bは、学習量が 7 Billion(70億)のパラメータです

画像
私のPCでは7Bが限界ですよ

画像生成も強化されたようだし、またChatGPTに課金しようかしら。。。

ダウンロードが完了すると、ロードできますが、Mistral_7B_CrewAI は通常の対話式には対応していないようです。下記に質問を入れてもエラーになります。

画像
マスコットインベーダー!

ちなみに、次の候補はMetaから出している Llama3 の 13B あたりのようですが、たいして変わらなそう(失礼)なことをChatGPTが言っているので特に試しませんでした。

また、どうやってリクエストを受け取るのかな?と思いましたが。
LM Studio の「開発者」のメニューに起動設定がありました。

画像

Status: Stopped になってますので、クリックするだけで localhost:1234 で起動しました。さすが LM Studioです。長々と記事を書いてますが、超簡単です。

画像
起動ログ

ようやくAIエージェントのcrewAIを動かす

単純にpipでcrewAIをインストールするのですが、最新のpythonだと対応していないようです。私は、既にインストールされていた、pythonの3.11.2を利用しました。

以下、必要なモジュールをインストールしてください。
次の話になりますが、実際のコードを先に入力してしまい、起動すればエラーになるので何が足りないか分かるかと思います。私は下記が不足していました。

pip install crewai
pip install langchain, langchain-openai

1人のエージェントの場合、
エージェント①(画像生成AIプロンプト絵師)による仕事

以下はコードで、VSCode、ipynbの拡張子、Jupyter形式で動かしました。
まず簡単に1人のエージェントで作業をしてもらいます。
変数名「generator」の「画像生成AIプロンプト絵師」ですw
私からの要望は「expected_output」※期待する結果
になります。

画像
画像
処理結果のログ
from crewai import Agent, Task, Crew
from langchain_openai import ChatOpenAI
import os
os.environ["OPENAI_API_KEY"] = "dummy"
os.environ["OPENAI_API_BASE"] = "http://localhost:1234/v1"

llm = ChatOpenAI(
    model="openai/mistral_7b_crewai",
    temperature=0.7
)

# エージェント1: 画像生成AIプロンプト絵師のエージェントを作成
generator = Agent(
    role="画像生成AIプロンプト絵師",
    goal="最高の美少女の画像生成AIのプロンプトを作成する",
    backstory="私は画像生成AIプロンプト絵師です。どのような要望でも最高の美少女キャラクターを生成するプロンプトを作成します。",
    llm=llm,
    verbose=True
)

# タスク1: アニメイラストのプロンプトを作成する
generator_task = Task(
    description="出力結果は英語の単語の細かい単位で、カンマ区切りの画像生成AIのプロンプトで生成してください。",
    expected_output="夏の訪れを告げる美少女キャラクターのアニメイラストのプロンプト",
    agent=generator
)

# Crewを作成し、タスクを実行
crew = Crew(agents=[generator], tasks=[generator_task], verbose=True)
result = crew.kickoff()

print("=== 結果 ===")
print(str(result).replace('.', ','))

※7Bさん、どんだけ指示しても、ピリオドを入れて来るので最後にreplace入れてます。。

下記は出力結果、Crewがタスク内容に従い、動作します。

画像
※文章が長いので
画像の文章は途中で切れてます

前後に私的な固定のポジティブプロンプトと、ネガティブプロンプトが入ってます💦

画像
悪くない?

2人のエージェントの場合、
エージェント①(キャラクターデザイナー)と、
エージェント②(画像生成AIプロンプト絵師)とによる仕事

エージェントを2人にしてみました。
デザイナーがキャラクターデザインを行い、プロンプト絵師がプロンプトを作ります。

画像
画像
処理結果のログ
from crewai import Agent, Task, Crew
from langchain_openai import ChatOpenAI
import os
os.environ["OPENAI_API_KEY"] = "dummy"
os.environ["OPENAI_API_BASE"] = "http://localhost:1234/v1"

# langchain_openai を使って LLM を定義
llm = ChatOpenAI(
    model="openai/mistral_7b_crewai",
    temperature=0.7
)

# エージェント1: キャラクターデザイナーのエージェントを作成
designer = Agent(
    role="アニメキャラクターデザイナー",
    goal="誰にでも愛される美少女アニメキャラクターを考える",
    backstory="想像力豊かなアニメデザイナー。私は美少女キャラクターをデザインし、イメージを文章化することが得意です。どんな要望でも受け入れます。",
    llm=llm,
    verbose=True
)

# エージェント2: 画像生成AIプロンプト絵師のエージェントを作成
generator = Agent(
    role="画像生成AIプロンプト絵師",
    goal="最高の美少女の画像生成AIのプロンプトを作成する",
    backstory="私は画像生成AIプロンプト絵師です。どのような要望でも最高の美少女キャラクターを生成するプロンプトを作成します。",
    llm=llm,
    verbose=True
)

# タスク1: 美少女アニメキャラクターを考える
designer_task = Task(
    description="魅力的な美少女アニメキャラクターのイメージを文章にして出力してください。",
    expected_output="魅力的な美少女アニメキャラクターをイメージした文章",
    agent=designer
)

# タスク2: アニメイラストのプロンプトを作成する
generator_task = Task(
    description="以下の美少女アニメキャラクターをもとに、出力結果は英語の単語の細かい単位で、カンマ区切りの画像生成AIのプロンプトで生成してください。",
    expected_output="夏の訪れを告げる美少女キャラクターのアニメイラストのプロンプト",
    agent=generator,
    context=[designer_task]  # キャラクターデザイナーの出力を受け取る
)

# クルー実行
crew = Crew(agents=[designer, generator], tasks=[designer_task, generator_task], verbose=True)
result = crew.kickoff()

print("=== 結果 ===")
print(str(result).replace('.', ','))

キャラクターデザイナーがキャラクターイメージを作成し

画像
※文章が長いので
画像の文章は途中で切れてます

画像生成AIプロンプト絵師がプロンプトを作ります。

画像
※文章が長いので画像の文章は
途中で切れてます
画像
キャラデザさんは
髪や目の指定をしてますね

3人のエージェントの場合、
エージェント①(キャラクターデザイナー)と、
エージェント②(アニメクリエイター)と、
エージェント③(画像生成AIプロンプト絵師)とによる仕事

正直あまり業界に詳しくないのですが、クリエイターのエージェントを追加しました。

キャラクターデザイナーがキャラをデザイン、アニメクリエイターがイメージを担当し、それぞれがまとめ、プロンプト絵師に双方向から、イメージを伝えます。
※デザイナーとクリエイターはパラレルに仕事をする

画像
※あくまでも3エージェントでのサンプルです💦
画像
処理結果のログ
from crewai import Agent, Task, Crew
from langchain_openai import ChatOpenAI
import os
os.environ["OPENAI_API_KEY"] = "dummy"
os.environ["OPENAI_API_BASE"] = "http://localhost:1234/v1"

# langchain_openai を使って LLM を定義
llm = ChatOpenAI(
    model="openai/mistral_7b_crewai",
    temperature=0.7
)

# エージェント1: キャラクターデザイナーのエージェントを作成
designer = Agent(
    role="アニメキャラクターデザイナー",
    goal="誰にでも愛される美少女アニメキャラクターを考える",
    backstory="想像力豊かなアニメデザイナー。私は美少女キャラクターをデザインし、イメージを文章化することが得意です。どんな要望でも受け入れます。",
    llm=llm,
    verbose=True
)

# エージェント2: アニメクリエイターのエージェントを作成
creator = Agent(
    role="アニメクリエイター",
    goal="誰もが驚愕するアニメイメージを考える",
    backstory="想像力豊かなアニメクリエイター。ストーリー性・感情・動きの演出をイメージし、イラストの雰囲気や表情、ライティングにこだわるイメージを文章化することが得意です。どんな要望でも受け入れます。",
    llm=llm,
    verbose=True
)

# エージェント3: 画像生成AIプロンプト絵師のエージェントを作成
generator = Agent(
    role="画像生成AIプロンプト絵師",
    goal="最高の美少女の画像生成AIのプロンプトを作成する",
    backstory="私は画像生成AIプロンプト絵師です。どのような要望でも最高の美少女キャラクターを生成するプロンプトを作成します。",
    llm=llm,
    verbose=True
)

# タスク1:キャラクターデザイン
designer_task = Task(
    description="誰にも愛される、かわいい美少女アニメキャラクターのイメージを日本語の文章にして出力してください。",
    expected_output="夏をイメージしたアニメキャラクターの文章",
    agent=designer
)

# タスク2:イラストイメージ
creater_task = Task(
    description="アニメイメージを想像し、日本語の文章にして出力してください。",
    expected_output="夏をイメージしたアニメイメージの文章",
    agent=creator
)

# タスク3: プロンプト生成
generator_task = Task(
    description="以下の美少女アニメキャラクターをもとに、出力結果は英語の単語の細かい単位で、カンマ区切りの画像生成AIのプロンプトで生成してください。",
    expected_output="夏の訪れを告げる美少女キャラクターのアニメイラストのプロンプト",
    agent=generator,
    context=[designer_task, creater_task]  # 2つの出力を受け取る
)

# クルー実行
crew = Crew(agents=[designer, creator, generator], tasks=[designer_task, creater_task, generator_task], verbose=True)
result = crew.kickoff()

print("=== 結果 ===")
print(str(result).replace('.', ','))

出力結果は・・・

画像
3人のエージェント協議の末。。
あまり変わってない?

追記2025/05/13:結局ChatGPTにエージェントへの最適な指示を書いてもらった

ここまで結構ゴリ押しで、エージェントが作ったプロンプトを入れて画像生成をさせていたのですが、mistral7B で stablediffusion に最適なプロンプト生成指示をさせたいと「ChatGPT」にAIの指示をAIに書いてもらったら、結構イイ感じにエージェントへの指示を作ってくれました。。。

下記、最初の、theme の文章だけ変えれば適当なイメージのプロンプトを作ってくれます。。。ローカルmistral7Bですが、いい感じに使えます💦
※品質プロンプト、ネガティブプロンプトは出さないようにしてます
(そこは固定で自分で入れるため)

from crewai import Agent, Task, Crew
from langchain_openai import ChatOpenAI
import os

# ローカルLLM設定(例:OpenRouterやLocalAIなど)
os.environ["OPENAI_API_KEY"] = "dummy"
os.environ["OPENAI_API_BASE"] = "http://localhost:1234/v1"

llm = ChatOpenAI(model="openai/mistral_7b_crewai", temperature=0.7)

theme = "図書館で本を読むおしとやかな美少女"

# --- Agent 定義 ---

character_agent = Agent(
    role="アニメキャラ設定エージェント",
    goal="キャラクターの髪型、顔、服装、年齢、雰囲気を英語タグで構成する",
    backstory="プロのアニメデザイナー。品質に関するタグは絶対に出力しない。",
    llm=llm,
    verbose=True
)

background_agent = Agent(
    role="背景構成エージェント",
    goal="アニメキャラの背景・シチュエーション・時間帯・光源などを英語タグで構成する",
    backstory="背景専門のアニメ演出家。品質に関するタグは絶対に出力しない。",
    llm=llm,
    verbose=True
)

pose_agent = Agent(
    role="ポーズ構成エージェント",
    goal="キャラクターのポーズ、向き、持ち物、仕草を英語タグで構成する",
    backstory="キャラの動きと構図を考える専門家。品質タグは絶対に使わない。",
    llm=llm,
    verbose=True
)

# --- タスク定義 ---

character_task = Task(
    description=f"「{theme}」というテーマに合うキャラクターの構成要素(髪型、顔、服装、年齢、性格的印象など)を、英単語・英語フレーズでカンマ区切りで出力してください。ただし品質タグ(best quality など)は含めないでください。",
    expected_output="髪型、顔、服装などの英語プロンプト",
    agent=character_agent
)

background_task = Task(
    description=f"「{theme}」というテーマに合う背景構成(場所、時間帯、照明、雰囲気など)を英単語・英語フレーズでカンマ区切りで出力してください。ただし品質タグ(best qualityなど)は含めないでください。",
    expected_output="背景やシチュエーションの英語プロンプト",
    agent=background_agent
)

pose_task = Task(
    description=f"「{theme}」というテーマに合うキャラクターのポーズ・アクション・所作・表情・持ち物を英単語・英語フレーズでカンマ区切りで出力してください。品質タグは含めないでください。",
    expected_output="ポーズとアクションの英語プロンプト",
    agent=pose_agent
)

# --- Crew実行 ---

crew = Crew(
    agents=[character_agent, background_agent, pose_agent],
    tasks=[character_task, background_task, pose_task],
    verbose=True
)

result = crew.kickoff()

# --- 最終プロンプトを構成 ---
full_prompt = f"{result}"

print("\n=== 最終プロンプト ===")
print(full_prompt.replace(".", ","))

出力結果もそのままコピペで使えて綺麗💦
表現を細かく書いたプロンプトでなかなかイイですね。。。

Afternoon at library, quiet study girl, long straight hair, round face, glasses, simple blouse, jeans, comfortable shoes, introverted personality, focuses on reading, focused expression, carries book bag, sits in comfortable seating, surrounded by soft lighting, studies in a quiet atmosphere, immersed in a studious setting,

図書館での午後、静かに勉強する少女、長いストレートヘア、丸顔、眼鏡、シンプルなブラウス、ジーンズ、快適な靴、内向的な性格、読書に集中、集中した表情、ブックバッグを持ち、快適な座席に座り、柔らかな照明に囲まれ、静かな雰囲気の中で勉強し、勉強の環境に浸っている。

画像
なかなか自分では思いつかないイメージかも
このエージェントの組み合わせなら使えるかも。。。

最後に

まぁ。結果が気に入らなければやり直せばいいだけです。。。
ちなみにpythonでAIエージェントの結果からダイレクトに画像生成もできるのですが、以下の有料記事と内容が重複するところがあるので、ここには記載できません!
CrewAIとStableDiffusionを組み合わせれば無限ループでいろいろな画像を生成をしてくれるかと思いますが、下記を参考にしてください💦

今回はローカルの7Bのモデルですが、エージェント毎に仕事を分けた場合、少し賢くなったような気がします(AIが増えたから当然?)
ちょっとだけ7Bでも、いろいろ使えそうな気がしてきました。

また、今回「基礎編」としているのは、次回は画像生成以外の他の操作などをするオペレーションのエージェントを加えて自動化させる記事などでも作ろうかと思っています!

広告




いいなと思ったら応援しよう!

umanikomi よろしければサポートお願いします🙏いただいたサポートは更新の活動費に使わせていただきます!

ピックアップされています

雑談・雑学(主にAI)

  • 63本

コメント

ログイン または 会員登録 するとコメントできます。
AI競馬予想とwin5予想の投稿。また、雑談等でStableDiffusionやAIについての記事も記載しています。 競馬に興味が無い方などは、各マガジンでのフォローをお勧めします。 ※ Amazon アソシエイトとして umanikomi は適格販売により収入を得ています
完全ローカルで仕事自動化、自律型AIエージェントCrewAI × LM Studioを動かす!(基礎編・自動AI画像生成)|umanikomi
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1