私はECサイトのAIカスタマーサービスを開発していたとき、「商品の写真を見て質問に直接答えるAIチャットボット」を求められていました。テキストだけでは商品の状態や色を正確に判断できませんが、画像を組み合わせることで顧客満足度が劇的に向上しました。本稿では、HolySheep AIを活用したLangChain多模态Chain开发の実践的な統合方案を解説します。
なぜ今、多模态AI集成が必要なのか
ECのAIカスタマーサービスにおいて、ユーザーは「白いワンピースで袖が долгий(長い)ものを探しています」のようなテキストと画像の両方を使った問い合わせを行います。従来のテキストオンリーLLMでは対応困難ですが、多模态Chainを活用することで以下が可能になります:
- 商品画像とテキストの説明を同時に理解
- 視覚的な特徴とテキストクエリの関連付け
- 画像内オブジェクトの検出と分類
HolySheep AIの多模态対応モデル
HolySheep AIでは、複数の多模态対応モデルを危険なほど低価格で提供しており、レートは¥1=$1(公式¥7.3=$1比85%節約)となっています。
| モデル | タイプ | 入力 | 2026出力価格(/MTok) | レイテンシ | おすすめ用途 |
|---|---|---|---|---|---|
| GPT-4.1 | 多模态 | テキスト+画像 | $8.00 | <100ms | 高精度な画像分析 |
| Claude Sonnet 4.5 | 多模态 | テキスト+画像 | $15.00 | <80ms | 長文画像説明 |
| Gemini 2.5 Flash | 多模态 | テキスト+画像 | $2.50 | <50ms | 高速画像処理 |
| DeepSeek V3.2 | 多模态 | テキスト+画像 | $0.42 | <40ms | コスト重視の処理 |
LangChain多模态Chainの実装
1. 環境セットアップ
# 必要なパッケージのインストール
pip install langchain langchain-openai langchain-core python-dotenv Pillow
環境変数の設定
import os
os.environ["HOLYSHEEP_API_KEY"] = "YOUR_HOLYSHEEP_API_KEY"
os.environ["HOLYSHEEP_API_BASE"] = "https://api.holysheep.ai/v1"
2. 基本的多模态Chain実装
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage
from langchain.prompts import ChatPromptTemplate
from PIL import Image
import base64
import io
HolySheep AI用のChatOpenAIクライアント設定
llm = ChatOpenAI(
model="gpt-4o", # または "claude-sonnet-4-5", "gemini-2.0-flash-exp"
api_key="YOUR_HOLYSHEEP_API_KEY",
base_url="https://api.holysheep.ai/v1"
)
def encode_image_to_base64(image_path: str) -> str:
"""画像をBase64エンコードに変換"""
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode("utf-8")
def create_multimodal_message(text: str, image_path: str):
"""テキストと画像を含む多模态メッセージを生成"""
image_base64 = encode_image_to_base64(image_path)
return HumanMessage(
content=[
{"type": "text", "text": text},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{image_base64}"
}
}
]
)
EC商品画像を使ったカスタマーサービスチェーン
def product_inquiry_chain(user_query: str, product_image_path: str):
"""商品画像とテキストクエリから回答を生成"""
prompt = ChatPromptTemplate.from_messages([
("system", """あなたはECサイトのAIカスタマーアシスタントです。
商品画像と顧客からの質問を分析し、准确な回答を提供してください。
商品の特徴、色、状態などを詳細に説明してください。"""),
("human", [user_query])
])
message = create_multimodal_message(user_query, product_image_path)
chain = prompt | llm
return chain.invoke(message)
使用例
if __name__ == "__main__":
result = product_inquiry_chain(
user_query="この商品の素材を教えてください。また、洗濯方法和も教えていただけますか?",
product_image_path="product_image.jpg"
)
print(result.content)
3. RAGシステムとの統合
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.schema import Document
HolySheep Embeddings設定
embeddings = OpenAIEmbeddings(
api_key="YOUR_HOLYSHEEP_API_KEY",
base_url="https://api.holysheep.ai/v1"
)
class MultimodalRAGChain:
"""画像とテキストの両方を含むRAGチェーン"""
def __init__(self, llm, embeddings):
self.llm = llm
self.embeddings = embeddings
self.vectorstore = None
self.retriever = None
def index_product_catalog(self, products: list):
"""商品カタログのインデックス作成"""
documents = []
for product in products:
doc = Document(
page_content=f"商品ID: {product['id']}\n"
f"商品名: {product['name']}\n"
f"説明: {product['description']}\n"
f"価格: {product['price']}",
metadata={"image_path": product["image_path"]}
)
documents.append(doc)
self.vectorstore = FAISS.from_documents(documents, self.embeddings)
self.retriever = self.vectorstore.as_retriever()
def retrieve_with_image(self, query: str, top_k: int = 3):
"""画像を含む関連ドキュメントを取得"""
docs = self.retriever.invoke(query)
return docs[:top_k]
def generate_response(self, user_query: str, image_path: str):
"""画像とRAG検索結果を統合して回答生成"""
# 1. 商品データベースから関連商品を検索
relevant_products = self.retrieve_with_image(user_query)
# 2. 画像と検索結果を組み合わせたプロンプト生成
context = "\n".join([doc.page_content for doc in relevant_products])
message = HumanMessage(
content=[
{"type": "text", "text": f"""
.Context from product database:
{context}
User query: {user_query}
Please answer based on both the retrieved product information and the uploaded image.
"""},
{
"type": "image_url",
"image_url": {"url": f"data:image/jpeg;base64,{encode_image_to_base64(image_path)}"}
}
]
)
return self.llm.invoke([message])
使用例
rag_chain = MultimodalRAGChain(llm, embeddings)
商品カタログのインデックス作成
products = [
{
"id": "PRD001",
"name": "プレミアム cotton Tシャツ",
"description": "100%オーガニック cotton使用。環境に優しい素材",
"price": "¥3,980",
"image_path": "tshirt.jpg"