AIアプリケーション開発のためのレシピブック
今日は「Haystack」という、AIの世界で最近話題の新しいカクテルを紹介させてください。これ、ただのAIじゃなくて、色々なAIの材料を組み合わせて、お客様の好みにぴったりの一杯を作り出すためのツールなんです。
ソフトウェアエンジニアの視点から言えば、Haystackは例えるなら「AIアプリケーション開発のためのシェイカーとレシピブック」です。
材料を自由に選べる Haystackを使えば、色々なAIモデル(OpenAI, Cohereなど)やデータベース(Pinecone, Weaviateなど)を、まるでバーの棚に並んだお酒のように自由に組み合わせて使うことができます。特定のベンダーに縛られないのがいいところです。
カクテル(アプリケーション)のレシピが豊富 Haystackは、RAG(Retrieval-Augmented Generation)という、外部の知識を元に回答を生成する手法に特に強いです。これは、あなたが知りたい情報(たとえば会社のドキュメント)を事前にHaystackに飲ませておけば、質問に対して正確な答えを返してくれる、賢いバーテンダーのようなものです。
複雑な手順もシンプルに たくさんの材料(コンポーネント)を混ぜ合わせる時、通常なら複雑なコードを書く必要がありますが、Haystackを使えば「パイプライン」として流れを定義するだけで、簡単にアプリケーションを構築できます。これは、複雑なカクテルを作る手順を、レシピ通りにステップ・バイ・ステップで進めるようなものです。
さあ、Haystackで一杯作ってみましょう。まずは材料を揃えるところからですね。
# Haystackの本体をインストール
pip install farm-haystack
# データベースやモデルなど、使いたい材料(コンポーネント)を追加でインストール
# 例:OpenAIとドキュメントを読み込むためのコンポーネント
pip install 'farm-haystack[all]'
これだけで準備完了です。あとは、Pythonのコードでレシピを組み立てていくだけです。
一番人気のあるカクテル、RAGの作り方を見てみましょう。このカクテルは、あなたの手元にある情報(ドキュメント)を元に、質問に答えてくれる優れものです。
import os
from haystack import Pipeline
from haystack.components.converters import TextFileToDocument
from haystack.components.embedders import SentenceTransformerDocumentEmbedder, SentenceTransformerTextEmbedder
from haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever
from haystack.components.builders.prompt_builder import PromptBuilder
from haystack.components.generators import OpenAIGenerator
from haystack.components.writers import DocumentWriter
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.utils import Secret
# 材料の準備
document_store = InMemoryDocumentStore() # ドキュメントを保存する場所
file_converter = TextFileToDocument()
document_embedder = SentenceTransformerDocumentEmbedder(model="sentence-transformers/all-MiniLM-L6-v2")
document_writer = DocumentWriter(document_store=document_store)
text_embedder = SentenceTransformerTextEmbedder(model="sentence-transformers/all-MiniLM-L6-v2")
retriever = InMemoryEmbeddingRetriever(document_store=document_store)
prompt_builder = PromptBuilder("{{documents}} \n\n Based on the context, answer the question: {{query}}")
llm = OpenAIGenerator(model="gpt-3.5-turbo", api_key=Secret.from_env_var("OPENAI_API_KEY"))
# レシピ(パイプライン)の定義
indexing_pipeline = Pipeline()
indexing_pipeline.add_component(instance=file_converter, name="converter")
indexing_pipeline.add_component(instance=document_embedder, name="document_embedder")
indexing_pipeline.add_component(instance=document_writer, name="writer")
indexing_pipeline.connect("converter.documents", "document_embedder.documents")
indexing_pipeline.connect("document_embedder.documents", "writer.documents")
query_pipeline = Pipeline()
query_pipeline.add_component(instance=text_embedder, name="text_embedder")
query_pipeline.add_component(instance=retriever, name="retriever")
query_pipeline.add_component(instance=prompt_builder, name="prompt_builder")
query_pipeline.add_component(instance=llm, name="llm")
query_pipeline.connect("text_embedder.embedding", "retriever.query_embedding")
query_pipeline.connect("retriever.documents", "prompt_builder.documents")
query_pipeline.connect("prompt_builder.prompt", "llm.prompt")
# 実際に一杯作る!
# 1. まず、ドキュメント(材料)を仕込む
indexing_pipeline.run(data={"converter": {"sources": ["sample.txt"]}})
# 2. 質問(お客様の注文)に答える
response = query_pipeline.run(data={"text_embedder": {"text": "what is this document about?"}})
print(response["llm"]["replies"][0])
このコードでは、まずindexing_pipelineでsample.txtというテキストファイルを読み込み、その内容を埋め込み(embed)して、データベース(document_store)に保存します。次に、query_pipelineで質問(what is this document about?)を同じように埋め込み、データベースから関連する情報を検索(retrieve)します。最後に、その情報と質問を組み合わせて、AIモデル(OpenAIGenerator)に渡して回答を生成してもらっています。
まるで、お客様の好み(質問)に合わせて、レシピ(パイプライン)通りに最高のカクテル(回答)を仕上げる、プロのバーテンダーの仕事そのものですね。