5.3K Views
November 10, 23
スライド概要
2023年11月に行われたCGWORLD 2023 CREATIVE CONFERENCE の講演資料です。
日時:11月10日(金)18:30–19:30
タイトル:テキスト生成AI活用術 ~Mayaで動くサポートエージェントを作ってみよう!~
※※※ 以下、内容に関して補足になります ※※※
・本講演は2023/11/10に放送されましたが、収録は10月末時点でのものです。11/6の OpenAI DevDayで発表された内容(gpt-4-1106-previewなど)は反映されていません。
・p12:学習能力も備わっていないとエージェントとは呼ばない考え方もあるみたいです。本セッションの例は「ツールAI」と呼んだ方が正しいかもしれません。
・p23:11/6にオープンベータを終えてv1.1.0がリリースされました。
・p87:よく考えたらファイルアップロードすれば出来ちゃいますね。さらに今は入力コンテキスト長も増えたので直に貼ることも出来そうです。
・p94:11/6にGPT-4VのAPI来ました。そもそも来ていなくてもBLIPなどを使えば視覚を与えることができたかもしれません。また、コストも下がりました。
・p95:本講演の例はユーザーの命令をトリガーに動き出すので「半自律」と呼ぶ方が相応しいかと思います。本当の意味での「自律型エージェント」はもっと先にあるなんかすごいヤツかと!
Jet Studio Inc.という3DCGの会社で雑用やってます。
まずは動画をご覧ください © 2023 Jet Studio Inc.
Case.1『マニュアル渡すからよく読んで完成してるモーションだけFBX書き出し しといて。』 twitter.com/akasaki1211/status/1716746810403029290 Case.2『シーン内のモデルをカテゴリごとにgroup化しといて。変な名前あった らついでに直しといて。』 twitter.com/akasaki1211/status/1716746814265929847 Case.3『キャラの最新モデルシーンにmGearのガイド読み込んでビルドしといて。 ガイドのファイルは探して。終わったらExportして。』 twitter.com/akasaki1211/status/1716746817214554429 © 2023 Jet Studio Inc.
このセッションで何が得られるか ● 最新LLM(大規模言語モデル)で何が出来るか ○ ○ 今後何がAI化されていきそうか はたしてCG屋に関係はあるのか ● 実装例 ○ ○ Maya上で動作 Powered by GPT-4 ※現時点でいきなり実用的に動かせるほどではないです。期待しすぎないでください! あくまで「LLMのポテンシャルを探る」という観点でお願いします。 © 2023 Jet Studio Inc.
● スライドは後日公開します ● コードはGitHubで公開します ● 動画アーカイブもあるみたいです © 2023 Jet Studio Inc.
自己紹介 ● ● ● ● 赤崎 弘幸 (Hiroyuki Akasaki) 株式会社ジェットスタジオ (2010~現在) チーフディレクター 普段の業務 ○ ○ ○ アセット (主にキャラモデル+リグ) 系の案件ディレクション多め。 CG制作現場全体の管理。技術サポート。社内ツール開発。R&D。 その他雑用。 ● X (旧Twitter) : @akasaki1211 © 2023 Jet Studio Inc.
前置き © 2023 Jet Studio Inc.
LLM(大規模言語モデル)とは © 2023 Jet Studio Inc.
LLM(大規模言語モデル)とは © 2023 Jet Studio Inc.
LLM(大規模言語モデル)とは 【CEDEC2023】AIはゲームをどのように変えるのか ● 最近のAIトレンド ● 3つの要素 ○ ○ ○ 大規模言語モデル [11:55~] 拡散モデル ニューラル場 ● ゲームへの影響 これらが分かりやすく解説されてるので要チェック!! © 2023 Jet Studio Inc.
LLM(大規模言語モデル)とは ● ● ● ● ● GPT-4 [OpenAI] LLaMA2 [Meta] PaLM2 [Google] StableLM [StabilityAI] Claude2 [Anthropic] ● ● ● ● ● HyperCLOVA [LINE] LLM-jp-13B [LLM-jp] rinna gpt-neox [rinna] OpenCALM [CyberAgent] Weblab-10B [松尾研] …他多数 © 2023 Jet Studio Inc.
エージェントとは © 2023 Jet Studio Inc.
エージェントとは © 2023 Jet Studio Inc.
エージェントとは 要は、 『外部環境から情報を取得し目的達成のために自律的に行動を繰り返すヤツ』 © 2023 Jet Studio Inc.
© 2023 Jet Studio Inc.
LLMベースのエージェント関連論文 LLM駆動のエージェントがHOT🔥 GitHub - WooooDyy/LLM-Agent-Paper-List: The paper list of the 86-page paper "The Rise and Potential of Large Language Model Based Agents: A Survey" by Zhiheng Xi et al. ● ● ● ● ReAct: Synergizing Reasoning and Acting in Language Models Generative Agents: Interactive Simulacra of Human Behavior Voyager: An Open-Ended Embodied Agent with Large Language Models etc… © 2023 Jet Studio Inc.
open-interpreter GitHub - KillianLucas/open-interpreter ● なんか巷で話題🚀 ● 与えられた目的に対し、自動でプログラミングして実行してくれる。 ● 例えば『最新データをネットから引っ張ってきてグラフにプロットして』 とかが全自動。 ● GPT-4にexecute関数(引数は言語とコードの2つ)を与え、Function calling で関数呼び出しが無くなるまで無限ループ。 ○ © 2023 Jet Studio Inc. ※あと、最初にRAGでシステムプロンプトに追加情報付け足してる。
MayaもほとんどPythonコードで操作できるんだから 同じようなことできるのでは…? © 2023 Jet Studio Inc.
実装編① ~ Function Calling ~ © 2023 Jet Studio Inc.
環境 ● ● ● ● ● ● Windows 10 Autodesk Maya 2024 (Python 3.10.8) Visual Studio Code openai 0.28.1 python 3.10.11 (必須ではない) git (必須ではない) python -m venv venv venv¥scripts¥activate pip install -U openai[datalib] cd C:¥Program Files¥Autodesk¥Maya2024¥bin mayapy -m pip install -U openai[datalib] -t C:¥Users¥<USERNAME>¥Documents¥maya¥2024¥scripts¥site-packages © 2023 Jet Studio Inc.
OpenAI API Key ● API keys - OpenAI APIからAPI key (sk-から始まる文字列) を作成 ○ OpenAIアカウントが無ければ作ってから ● 環境変数OPENAI_API_KEYに設定 © 2023 Jet Studio Inc.
まずはここから... © 2023 Jet Studio Inc.
その前に軽くAPIの使い方 Chat Completion ● APIリファレンス : Create chat completion | API Reference - OpenAI API ● Cookbook : How to format inputs to ChatGPT models | OpenAI Cookbook ● Pythonライブラリ : The official Python library for the OpenAI API ※本スライドで扱うのはv0.28.1時点での書き方です。v1.x (現在ベータ) で仕様が変わります。 詳細はこちら:v1.0.0 Beta · openai openai-python · Discussion #631 · GitHub © 2023 Jet Studio Inc.
基本形 :
● openai.ChatCompletion.create()にメッセージ配列やその他オプションを渡す
import openai
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "語尾に「にゃ」を付けて答えてください"},
{"role": "user", "content": "Mayaとはどんなソフトですか?"}
]
)
import json
print(json.dumps(response, indent=4, ensure_ascii=False))
© 2023 Jet Studio Inc.
● 返答文とその他追加情報が返ってくる
{
"id": "chatcmpl-8DYnnkLjtwVeQpQcPP5R2QS8IxWJ4",
"object": "chat.completion",
"created": 1698242735,
"model": "gpt-3.5-turbo-0613",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Mayaにゃんとは、3Dコンピューターグラフィックスソフトウェアにゃ!"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 44,
"completion_tokens": 35,
"total_tokens": 79
}
}
© 2023 Jet Studio Inc.
● messagesに会話履歴を足していく(足すのはこっちでやる)
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "語尾に「にゃ」を付けて答えてください"},
{"role": "user", "content": "Mayaとはどんなソフトですか?"},
response["choices"][0]["message"],
{"role": "user", "content": "他にはどんなソフトがある?"},
]
)
{
## (中略) ##
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "たくさんの3Dソフトがにゃ!例えば、3ds MaxにゃんやBlenderにゃん、Cinema 4Dにゃんなどがあるにゃ!"
},
"finish_reason": "stop"
}
],
## (中略) ##
}
© 2023 Jet Studio Inc.
© 2023 Jet Studio Inc.
基本構成 © 2023 Jet Studio Inc.
Function calling ● Function calling | GPT - OpenAI API ● How to call functions with chat models | OpenAI Cookbook © 2023 Jet Studio Inc.
● openai.ChatCompletion.create()に関数情報を渡す
import openai
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=[{"role": "user", "content": "今日の東京の天気は?"}],
functions=[
{
"name": "get_current_weather", # 関数名
"description": "指定した場所の現在の天気を取得する", # 説明
"parameters": { # 引数
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "場所。例:東京, 大阪, 福岡, など",
},
},
"required": ["location"],
},
}
]
)
© 2023 Jet Studio Inc.
● (GPTが関数を使いたい場合は)使いたい関数名と引数が返ってくる { ## (中略) ## "choices": [ { "index": 0, "message": { "role": "assistant", "content": null, "function_call": { "name": "get_current_weather", "arguments": "{¥n ¥"location¥": ¥"東京¥"¥n}" } }, "finish_reason": "function_call" } ], ## (中略) ## } © 2023 Jet Studio Inc.
# 天気を返す関数(仮)。実際はここで外部APIなどに問い合わせする。
def get_current_weather(location):
例:
weather_info = {
"location": location,
"temperature": "24度",
"forecast": "晴れ",
}
return json.dumps(weather_info, ensure_ascii=False)
# 関数を動的に取得するための辞書
available_functions = {
"get_current_weather": get_current_weather,
}
# 関数リスト
functions = [
{
"name": "get_current_weather", # 関数名
"description": "指定した場所の現在の天気を取得する", # 関数の説明
"parameters": { # 関数の引数。JSON Schemaで記述。https://json-schema.org/understanding-json-schema/
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "場所。例:東京, 大阪, 福岡, など",
},
},
"required": ["location"],
},
}
]
© 2023 Jet Studio Inc.
def run(prompt:str):
# 会話履歴(messages)の準備
messages = [{"role": "user", "content": prompt}]
while True:
# APIリクエスト
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=messages,
functions=functions,
function_call="auto"
)
finish_reason = response.choices[0]["finish_reason"]
response_message = response.choices[0]["message"]
# 返答をmessagesに追加
messages.append(response_message)
# 関数を使いたいかどうか確認
if finish_reason == "function_call":
# 使いたい場合、関数名と引数を取得して実行
function_name = response_message["function_call"]["name"]
function_args = json.loads(response_message["function_call"]["arguments"])
function_output = available_functions[function_name](**function_args)
# 関数の結果をmessagesに追加
messages.append({"role": "function", "name": function_name, "content": function_output})
else:
# 使いたくない場合は終了
break
return messages
© 2023 Jet Studio Inc.
messages = run("今日の東京の天気は?") print(json.dumps(messages, indent=4, ensure_ascii=False)) [ { "role": "user", "content": "今日の東京の天気は?" }, { "role": "assistant", "content": null, "function_call": { "name": "get_current_weather", "arguments": "{¥n¥"location¥": ¥"東京¥"¥n}" } }, { "role": "function", "name": "get_current_weather", "content": "{¥"location¥": ¥"東京¥", ¥"temperature¥": ¥"24度¥", ¥"forecast¥": ¥"晴れ¥"}" }, { "role": "assistant", "content": "今日の東京の天気は晴れで、気温は24度です。" } ] © 2023 Jet Studio Inc.
基本が分かったので... © 2023 Jet Studio Inc.
天気じゃなくてコード実行関数に置き換える。 関数はコード(コード内にprint書かせる)を受け取り、実行して標準出力を返す。 ### 選択したオブジェクトの位置をy方向に+5するスクリプト ### import maya.cmds as cmds selected_objects = cmds.ls(selection=True) for obj in selected_objects: current_position = cmds.getAttr(obj + ".translateY") new_position = current_position + 5 cmds.setAttr(obj + ".translateY", new_position) print(f"{obj} のY位置が {current_position} から {new_position} に変更されました。") © 2023 Jet Studio Inc.
主要クラス ● FunctionSet ○ 関数の説明リストと関数本体をまとめたクラス ● Agent ○ ○ ○ ○ © 2023 Jet Studio Inc. コンストラクタで関数セット受け取って保持 ユーザー入力を受け取ったらAPIコールと関数の実行をループ 関数呼び出しが無くなったらループ終了 タスク完了までメッセージ配列を保持
コード実行関数 (FunctionSet内) def exec_code(python_code:str) ● 今回のコア部分 ● コード文字列を受け取りexec()で実行する ○ Mayaで実行される ● 実行中の標準出力をキャプチャしてreturnする ○ 大事な箇所にはprint文を書かせておく ● エラーが出たらエラー文をreturnする © 2023 Jet Studio Inc.
書き方が分からなければ なんでもGPT-4先生に聞く © 2023 Jet Studio Inc.
© 2023 Jet Studio Inc.
タスク実行部分 (Agent内) ● messages初期化 ● ユーザーメッセージに起動中のMayaバージョンやPythonバージョン情報を 付け足しておく ● 以下ループ ○ ○ ○ ○ ○ © 2023 Jet Studio Inc. ChatCompletion 返答をmessagesに追加 関数名と引数取得/関数呼び出しが無ければbreak 関数実行 関数の戻り値をmessagesに追加
実行 こんな感じで使いたい... import mayaagent mayaagent.run(“タスクの説明”) def run(task:str) ● FunctionSetのインスタンス作成 ● Agentのインスタンス作成 ● Agent(task) © 2023 Jet Studio Inc.
動作確認 シーンにあるポリゴン板の頂点を上下にランダム 移動してボコボコにしてほしい。 © 2023 Jet Studio Inc.
1. 2. 3. 4. 5. 6. 7. 8. 👦: シーンにあるポリゴン板の頂点を上下にランダム移動してボコボコにしてほしい。 🤖: まず、シーン内のポリゴン板を特定し、その頂点を取得する必要があります。その後、各頂点をランダムに上 下に移動します。 💻: exec_code -> result : ['pCubeShape1', 'pPlaneShape1', 'pSphereShape1'] 🤖: シーン内には 'pCubeShape1', 'pPlaneShape1', 'pSphereShape1' の3つのポリゴンオブジェクトが存在します。 ポリゴン板は 'pPlaneShape1' と推測します。ポリゴンオブジェクトの頂点を取得します。 💻: exec_code -> ['pPlane1.vtx[0]', 'pPlane1.vtx[1]', 'pPlane1.vtx[2]', 'pPlane1.vtx[3]', ... 🤖: ポリゴンオブジェクトの頂点を取得しました。'pPlaneShape1' の各頂点を上下にランダムに移動します。 💻: exec_code -> Vertices have been moved randomly. 🤖: 'pPlaneShape1' の各頂点を上下にランダムに移動しました。以上でタスクを完了します。 © 2023 Jet Studio Inc.
仕組みが分かったので、冒頭デモ3本のログを追ってみる © 2023 Jet Studio Inc.
Case.1『マニュアル渡すからよく読んで完成してるモーションだけFBX書き出し しといて。』 ● ログはマークダウン形式でファイル出力したものを表示しています。 ● 緑色の枠が入力プロンプト、赤色の枠がエージェントの発言、青色の枠が実行した関数の出力です。 © 2023 Jet Studio Inc.
© 2023 Jet Studio Inc.
© 2023 Jet Studio Inc.
Case.2『シーン内のモデルをカテゴリごとにgroup化しといて。変な名前あった らついでに直しといて。』 © 2023 Jet Studio Inc.
© 2023 Jet Studio Inc.
Case.3『キャラの最新モデルシーンにmGearのガイド読み込んでビルドしといて。 ガイドのファイルは探して。終わったらExportして。』 © 2023 Jet Studio Inc.
© 2023 Jet Studio Inc.
© 2023 Jet Studio Inc.
© 2023 Jet Studio Inc.
いったんまとめ ● コード実行関数と思考ループだけで冒頭3種のデモのようなものは動く。 ○ ○ ○ +トークン制限対策でメッセージ配列削ったり +エラー処理したり +ダイアログ出したり ● 長期記憶は未実装。タスクが長引くとこれまでの経緯忘れちゃう。 ● 与えた外部ファイルが長すぎると詰む。(→RAG) © 2023 Jet Studio Inc.
実装編② ~ RAG ~ © 2023 Jet Studio Inc.
RAG (Retrieval-Augmented Generation) Retrieval-Augmented Generation(RAG)とは? | IBM ソリューション ブログ シンプルなQ&Aチャットボットの例: © 2023 Jet Studio Inc.
今回は検索関数としてLLMに使わせる ※検索の仕方はいろいろあります。 embeddingは一例です。 © 2023 Jet Studio Inc.
Embedding © 2023 Jet Studio Inc.
● 意味の近いものは似たベクトルになるよう空間内にマッピングされる。 ○ ※実際は2次元ではなくもっと高次元 ● ユークリッド距離やコサイン類似度で近いものを探せる。 © 2023 Jet Studio Inc.
Embeddings ● Embeddings - OpenAI API ● Embeddings | API Reference - OpenAI API ● Question answering using embeddings-based search | OpenAI Cookbook © 2023 Jet Studio Inc.
基本形 : ● openai.Embedding.create()にテキストを渡す import openai text = "猫" response = openai.Embedding.create( input=[text], model="text-embedding-ada-002" ) import json print(json.dumps(response, indent=4, ensure_ascii=False)) © 2023 Jet Studio Inc.
● embedding(1536次元のベクトル)とその他追加情報が返ってくる
{
"object": "list",
"data": [
{
"object": "embedding",
"index": 0,
"embedding": [
-0.007977989502251148,
-0.009937843307852745,
-0.010597726330161095,
## (中略) ##
-0.003461088053882122,
-0.02760951966047287
]
}
],
"model": "text-embedding-ada-002-v2",
"usage": {
"prompt_tokens": 3,
"total_tokens": 3
}
}
© 2023 Jet Studio Inc.
import numpy as np
import openai
def get_embedding(text:str, engine="text-embedding-ada-002", **kwargs):
""" 与えられたテキストの埋め込みベクトルを取得する """
return openai.Embedding.create(input=[text], engine=engine, **kwargs)["data"][0]["embedding"]
def cosine_similarity(a, b):
""" 2つのベクトル間のコサイン類似度を計算する """
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# テキストのリスト
texts = ["動物","植物","乗り物","建物"]
# 各テキストの埋め込みベクトルを取得し、辞書のリストとして保存する
embeddings = [{"text": t, "embedding": get_embedding(t)} for t in texts]
for s in sorted_scores:
print(s)
# クエリの埋め込みベクトルを取得する
query_embedding = get_embedding("猫")
# 出力:
('動物', 0.8673454180180918)
# クエリの埋め込みベクトルと各テキストの埋め込みベクトルとのコサイン類似度を計算する
('植物', 0.8389430771237997)
scores = [(data["text"], cosine_similarity(query_embedding, data["embedding"])) for data in embeddings]
('建物', 0.8142869467061629)
('乗り物', 0.7896206872541609)
# 類似度の高い順にソートする
sorted_scores = sorted(scores, key=lambda x: x[1], reverse=True)
© 2023 Jet Studio Inc.
事前処理 1. 文書を分割する。 2. 分割したテキストをembeddingにして、元のテキストとペアにする 3. JSON等で保存(=ベクトルストア) © 2023 Jet Studio Inc.
推論時 1. 検索語句をembeddingにしてベクトルストアのアイテムに対してコサイン類 似度を測る。 2. 上位k件を取り出してペアになってるテキストを得る。 3. テキストをプロンプトに含める。 © 2023 Jet Studio Inc.
主要クラス ● VectorStore ○ ○ ベクトルストア(JSON)をロードして保持 検索語句を受け取ってベクトルストア内を近傍探索し結果を返す機能 ● FunctionSetWithVectorSearch ○ ○ FunctionSetを継承して検索関数の機能を追加 コンストラクタでVectorStoreを受け取って保持 これでエージェントは「コード実行」に加え「文書検索」の能力を得る © 2023 Jet Studio Inc.
動作確認 AI×CG実験室 第4回で作成したmGearリグの取説を渡して実行してみる 腕の伸びが1.5倍くらいでストップしちゃうんだけ ど、無限に伸びるようにできん? © 2023 Jet Studio Inc.
1.
2.
3.
4.
5.
6.
7.
8.
👦: 腕の伸びが1.5倍くらいでストップしちゃうんだけど、無限に伸びるようにできん?
🤖: まず、リグのコントローラー名とその機能を調べるために、リグ操作マニュアルを検索します。
💻: search_manual -> result : armUI_R0_ctlのarm_maxstretchアトリビュートで右腕の最大伸縮率を指定できます。
1.0で腕が伸びなくなります。同じくarmUI_L0_ctlのarm_maxstretchアトリビュートで…
🤖: リグ操作マニュアルから得られた情報によると、腕の伸びを制御するには`armUI_R0_ctl`の`arm_maxstretch`ア
トリビュート(右腕)と`armUI_L0_ctl`の`arm_maxstretch`アトリビュート(左腕)を使用します。これらのアトリ
ビュートを無限大に設定してみましょう。
💻: exec_code -> RuntimeError: File "<string>", line 4, in <module>: setAttr: Cannot set the attribute
'armUI_R0_ctl.arm_maxstretch' past its maximum value of 99.
🤖: エラーメッセージによると、'armUI_R0_ctl.arm_maxstretch'と'armUI_L0_ctl.arm_maxstretch'のアトリビュート
は最大値99までしか設定できないようです。これらのアトリビュートを最大値99に設定してみましょう。
💻: exec_code -> Right arm max stretch: 99.0 Left arm max stretch: 99.0
🤖: 右腕と左腕の最大伸縮率がそれぞれ99.0に設定されました。
© 2023 Jet Studio Inc.
いったんまとめ ● “事前に”必要なものをembeddingにして用意しておかないと意味がない。 ● たくさん渡しすぎると検索精度が落ちる。 ● 行動の結果を逐次要約し、embeddingにしてストックしていくというアプロ ーチもある(長期記憶)が、かなり丁寧に記憶データを整理しないとゴミだ らけになる。 ● 沼。 © 2023 Jet Studio Inc.
本セッションの実装コード github.com/akasaki1211/maya_agent/tree/cc2023 ● ここまでの実装(+α)をGitHubに置いておきます。 ● README.mdの手順でそのまま動くと思います。 ● 講演時点で以下が追加されてます。 ○ ○ markdown形式でログ出力する機能 autoモードのオンオフ:オフにすると関数実行前に毎回確認ダイアログが出る ● 本セッションの補足資料としてcc2023ブランチはあまり変えずに止めておき ます。mainブランチはいろいろ変えるかもです。 © 2023 Jet Studio Inc.
ところで... © 2023 Jet Studio Inc.
『そこまでしなくてもブラウザのChatGPTに指示したら一 撃でスクリプトくれるんじゃない…?』 © 2023 Jet Studio Inc.
やってみましょう… © 2023 Jet Studio Inc.
Case.1『マニュアル渡すからよく読んで完成してるモーションだけFBX書き出し しといて。』 © 2023 Jet Studio Inc.
Case.1『マニュアル渡すからよく読んで完成してるモーションだけFBX書き出し しといて。』 © 2023 Jet Studio Inc.
Case.1『マニュアル渡すからよく読んで完成してるモーションだけFBX書き出し しといて。』 © 2023 Jet Studio Inc.
Case.1『マニュアル渡すからよく読んで完成してるモーションだけFBX書き出し しといて。』 ● マニュアルやリストをすべて貼り付ける手間はあるが、ほぼ一撃。 ● エラーが出たら、渡して、修正コードを自分で反映させていく。 © 2023 Jet Studio Inc.
Case.2『シーン内のモデルをカテゴリごとにgroup化しといて。変な名前あった らついでに直しといて。』 © 2023 Jet Studio Inc.
Case.2『シーン内のモデルをカテゴリごとにgroup化しといて。変な名前あった らついでに直しといて。』 © 2023 Jet Studio Inc.
Case.2『シーン内のモデルをカテゴリごとにgroup化しといて。変な名前あった らついでに直しといて。』 © 2023 Jet Studio Inc.
Case.2『シーン内のモデルをカテゴリごとにgroup化しといて。変な名前あった らついでに直しといて。』 ● ルールのはっきりしない分類タスクは機械学習ならではなのでスクリプト一 撃はそもそも無理。 ● 「ノード名取得」「分類&グループ化」の2タスクで分けたらすんなり。 © 2023 Jet Studio Inc.
Case.3『キャラの最新モデルシーンにmGearのガイド読み込んでビルドしといて。 ガイドのファイルは探して。終わったらExportして。』 © 2023 Jet Studio Inc.
Case.3『キャラの最新モデルシーンにmGearのガイド読み込んでビルドしといて。 ガイドのファイルは探して。終わったらExportして。』 © 2023 Jet Studio Inc.
Case.3『キャラの最新モデルシーンにmGearのガイド読み込んでビルドしといて。 ガイドのファイルは探して。終わったらExportして。』 © 2023 Jet Studio Inc.
Case.3『キャラの最新モデルシーンにmGearのガイド読み込んでビルドしといて。 ガイドのファイルは探して。終わったらExportして。』 ● 一見複雑なようだが、順番に処理を指示すればほぼ一撃。 ● エラーが出たら、渡して、修正コードを自分で反映させていく。 © 2023 Jet Studio Inc.
Case.4『腕の伸びが1.5倍くらいでストップしちゃうんだけど、無限に伸びるよ うにできん?』 ● これは無理(多分) ● LLMにない知識を質問している&マニュアル文書が貼り付けられる文字数じ ゃない © 2023 Jet Studio Inc.
こんな具合で... ● 対話しながら詰めて行ってスクリプト作ってもらってもだいたい出来ると言 えば出来る。 ● エージェントの面白いところはフルオートでタスク完遂まで自走し続けると ころなので別と言えば別。 © 2023 Jet Studio Inc.
まとめ(総評) © 2023 Jet Studio Inc.
思考のシミュレーションにも使えるLLM ● できるのは会話(チャット)だけではない! ● 脳内で独り言(?)を繰り返し思考(のようなもの)が出来る。 © 2023 Jet Studio Inc.
知識や記憶は外部ファイルで拡張する ● ● ● ● ● RAG Embeddingで意味的検索 事前に独自の文書をDB化しておく 推論結果を記憶として逐次保存しておく etc... © 2023 Jet Studio Inc.
精度 ● GPT-4パワーをもってしても、今のところはLLMに1人で考えさせ続けるより 人間が所々誘導したほうが結果が良い。 ● ブラウザ版(対話形式)はそういう意味で操作感も良く結果が得やすい。 ● 途中で人間が口出しできるようにするとか...(※次ページ参照) ● タスク遂行エージェントとは別で俯瞰で監視する評価エージェントを用意す るとか... © 2023 Jet Studio Inc.
途中で人間が助言した場合 👦: シーンにあるポリゴン板の頂点を上下にランダム移動してボコボコにしてほしい。 🤖: まず、シーン内のポリゴン板を特定し、その頂点を取得する必要があります。その後、各頂点を上下にランダ ムに移動します。 3. 💻: exec_code -> result : ['pCubeShape1', 'pPlaneShape1', 'pSphereShape1'] 4. 🤖: シーン内には 'pCubeShape1', 'pPlaneShape1', 'pSphereShape1' の3つのポリゴンオブジェクトが存在します。 次に、これらのオブジェクトからポリゴン板を特定します。ポリゴン板は、面が1つだけのオブジェクトとして定義 します。それでは、ステップ2に進みましょう。 5. 👦: いや、名前で判定すればいいと思うよ。 6. 🤖: 了解しました。シーン内のオブジェクト名を使用してポリゴン板を特定します。ポリゴン板の名前には一般的 に 'plane' が含まれています。それでは、そのように特定してみましょう。 7. 💻: exec_code -> ['pPlaneShape1'] 8. 🤖: シーン内のポリゴン板 'pPlaneShape1' を特定しました。このポリゴン板の頂点を取得します。 9. 💻: exec_code -> ['pPlane1.vtx[0]', 'pPlane1.vtx[1]', 'pPlane1.vtx[2]', 'pPlane1.vtx[3]', ... 10. 🤖: 次に、これらの頂点を上下にランダムに移動します。 11. 💻: exec_code -> Vertices have been moved. 12. 🤖: ポリゴン板 'pPlaneShape1' の頂点を上下にランダムに移動しました。これでタスクは完了です。 1. 2. © 2023 Jet Studio Inc.
注意 ● 今のところ視覚はない ○ GPT-4VのAPI来たら話は変わる ● 長期記憶は課題 ● 推論コストヤバい ○ ○ © 2023 Jet Studio Inc. API料金 ローカルLLMの場合はGPU
『それLLMじゃなくてよくね?』は大事 ● ● ● ● タスク次第ではぶっちゃけ普通にスクリプト書いた方が精度高いし早い。 絶対にミスできないタスクはそもそも人間でもAIでもなく機械化すべき。 ユーザーがスクリプトを一切見ないままタスクが完了する点は面白い。 単純に“自律型エージェント”というだけでロマンはある。 © 2023 Jet Studio Inc.
今後 ● LLMで何がAI化されていきそうか ○ ○ ○ 指示通りに淡々と行う単純作業は得意 自然言語の手順書やリストを読み取って作業できる タスクごとにツール・スクリプトを用意する必要がなくなる? ● LLMはCG界隈に影響はあるのか ○ ○ © 2023 Jet Studio Inc. ある(というかPC使う領域の人は皆あると思う) クリエイティブな領域には今のところあまり影響無い(と思う)
そういえば... Maya Assist(2023.3.29公式発表)はどんなものになるんでしょうか...? AI搭載システム「Maya Assist」プライベートベータ開始! 最新機能の開発に関 われるチャンス © 2023 Jet Studio Inc.
最後に 就職活動中の方 ● ㈱ジェットスタジオは通年エントリーを受け付けております。 ● 詳しくは弊社HP(jetstudio.jp)のリクルートページをご覧ください。 お仕事のご依頼 ● お仕事のご依頼もお気軽にお問い合わせください。 ● お問い合わせは弊社HP(jetstudio.jp)のお問い合わせフォームより! © 2023 Jet Studio Inc.
ご清聴ありがとうございました © 2023 Jet Studio Inc.