はじめに
ども!9月も終わり今年度の半分が終了しそうで、ひやひやしている龍ちゃんです。9月はデモを大量に作成していた月でした。内容として新しいことに結構取り組んでいたので、10月はブログで報告を重ねていきたいと思います。最近はおしゃれなサムネイルを目指して作成しています。
内容としては、「OSC 2024広島」で展示した内容となっています。プロトタイプ第一号だったので、会場で不思議な挙動をしていたのですがバージョンアップの内容を詰めるいい機会だと思って大量に改修案が出てましたw
それでは中身に入っていこうと思います。
コンセプト
コンセプトとしては「ロボット×生成AI」というテーマがスタートになります。生成AIの出力のカタチとして「画像」や「テキスト」が真っ先に挙がってくるかと思います。出力の表現としてロボットを置くことで表現の幅が広がりました。
今回は、チャットボットなどの表現から、一歩進んだ「エージェント」という考え方をロボットで如何に表現するのかという挑戦でもありました。その辺をさっくりと解説してみますね。
AIエージェントとは
ここでは、今回のデモで根幹にかかわる「AIエージェント」という考え方について解説しておきます。チャットボットと比較した図を作ったので記載しておきます。
チャットボットは、ユーザーの入力から返答を生成します。返答作成にはLLM(大規模言語モデル)を使用しています。
LLMは与えられた文章から、最も可能性の高い続きの文章を生成している。
課題としては、LLM内に無い情報には対応することができません。LLM内に含まれない最新の情報などは解答することができません。LLMに追加の情報を与える手法としては、RAG(Retrieval-augmented generation)などがあります。こちらは、弊社のエンジニアがしっかりガイドまで作っているのでこちらを参照してみてください。
エージェントでは、自作の動きをLLMにツールとして渡すことができます。もしここに情報を取得するツールを渡していれば、最新の情報を取得するエージェントになります。エージェントでは、事前にAIができることを知っているので、対応できない問題が来ても、対応するツールがあれば、そちらを用いて処理を実行します。
もっと具体的な話をすると、チャットボットではロボットの操作を行うことはできません。
「左を向いて、一歩歩いて、万歳して」という動作指示に従うと、次のような動きになります。
- 左を向く:体を左方向に90度回転させる。
- 一歩歩く:一歩前進する。左を向いているため、左に向かって一歩進むことになる。
- 万歳する:両手を頭の上に挙げ、喜びや祝福のポーズを取る。
この一連の動作は、リズムをつけて楽しく行うことができそうですね!
エージェントではロボットの動作をツールとして渡してあげることでロボットの操作を可能にします。
このことを踏まえて作成したものについて解説をしていきたいと思います。
設計
詳細な実装については、長くなってしまうので別記事で紹介していきます。今回使用したQumcumロボットの制約に併せて、細やかなコードと時には力技で解決したので、結構重厚な内容になりましたね。
Qumcum
さて、ロボットと話をしていましたが、今回使用したロボットの情報を書いておこうと思います。公式のサイトはこちらになります。
バージョンも3つほどあって拡張性もしっかりあるので、結構楽しめる高級なおもちゃですね。小さいころに持っていたら、もっと早くプログラミングに興味を持っていたかなって思います。
こちらの挙動に関しては、また別のブログでソースコードと一緒に乗せておこうと思います。
エージェント
エージェントの実装には以下のユースケースのような構成になっています。
使用技術としては、以下のようになっています。
技術 | 説明 |
---|---|
Streamlit | フロント画面:PythonでリッチなGUIを作成することができる。 |
LangChain | AI周りの処理:エージェントの実装はライブラリのおかげでとてもすっきりしています。 |
Azure OpenAI Service | AIサービス:Azure上でお金はかかるけど一番慣れているので… |
Qumcum API | PythonからQumcumを操作するためのライブラリ |
ライブラリを使用することでさっくりと実装できました。
実装
ソースコードを乗っけると膨大になるので、分割しておきます。ここでは、処理の流れと実際の画面を載せておきます。構築のための技術はシリーズでブログとしてまとめていきます。
処理の流れ
処理としてはとても単純です。
- ユーザーによるチャット
- LangChainを用いてAI agentにアクセス
- QumcumAPIを経由してQumcumに処理を送信
フロント画面
画面としては、シンプルなチャット画面になっています。実装に関しては、こちらのブログでしっかりと解説をしているので気になる方はコピペして試してみてください。
解説はしないですが、以下のコード量ぐらいでチャットが実装できるのは最高に素晴らしいです。
# chatbot.py
import streamlit as st
from langchain.schema import HumanMessage, AIMessage
import utils.aiagent_emotions as agent
# ページの設定
st.set_page_config(page_title="感情によって返答する", page_icon="😆")
st.header("感情によって返答する")
# チャット履歴の初期化
if "messages" not in st.session_state:
st.session_state.messages = []
# ユーザーの入力を監視
if user_input := st.chat_input("聞きたいことを入力してね!"):
st.session_state.messages.append(HumanMessage(content=user_input))
with st.spinner("GPT is typing ..."):
response = agent.agent_executor.invoke(
{"input": user_input, "chat_history": []}
)
output = response["output"]
st.session_state.messages.append(AIMessage(content=output))
# チャット履歴の表示
messages = st.session_state.get("messages", [])
for message in messages:
if isinstance(message, AIMessage):
with st.chat_message("assistant"):
st.markdown(message.content)
elif isinstance(message, HumanMessage):
with st.chat_message("user"):
st.markdown(message.content)
デモ
今回作成した内容のデモ動画になります。
実装関連ブログ
執筆が完了次第追記していきます!
おわり
いや~これで9月のすべてのお仕事が終わりました。ちょっと足が出てしまいましたが…
9月は、別件でもデモを作っていたので最高に忙しかったです。あまりブログを生成できませんでしたが、同僚の皆様がゴリゴリと執筆されているので負けないように頑張って執筆していかないといけませんね。
今年度も10月で折り返しなので、今年度の積み残しが出ないように頑張っていきましょう!
次はStreamlit周りかフロント周りの記事を書こうかと思います。ではまた~