RAGbits:生成AIアプリケーションを素早く開発するためのツールキット
RAGbits: これ一つでGenAIアプリ開発が劇的に加速
急速に進化する生成AIの世界では、開発者は常に、革新的なアプリケーションを具体化するための堅牢かつ効率的なツールを求めています。deepsense.aiが手がけたオープンソースフレームワーク「RAGbits」は、特にRetrieval-Augmented Generation (RAG) を活用した信頼性・拡張性の高いGenAIソリューションの開発を加速することを目的としています。
RAGbitsとは?
RAGbitsは、GenAIアプリケーション開発ライフサイクル全体を円滑に進めるために設計された、包括的な構成要素群です。モジュール化された柔軟なアーキテクチャにより、開発者は必要なコンポーネントのみを組み込むことができ、依存関係を減らし、パフォーマンスを最適化できます。このフレームワークは実用性に重点を置いており、大規模言語モデル (LLM) の管理、多様なデータタイプの取り扱い、高度なRAGパイプラインのデプロイを可能にする堅牢な機能を提供します。
RAGbitsの主な機能
RAGbitsは、開発者が洗練されたAIアプリケーションを簡単に構築できるよう、強力な機能セットで際立っています。
🔨 信頼性と拡張性の高いGenAIアプリを構築
柔軟なLLM統合:LiteLLMを介して100種類以上のLLMから自由に選択したり、ローカルモデルを統合したりと、比類のない柔軟性を提供します。 型安全なLLM呼び出し:Pythonのジェネリクスを使用し、モデルとのインタラクションにおいて厳格な型安全性を確保することで、堅牢性を高め、エラーを削減します。 既存のベクターストアの活用:Qdrant、PgVectorなどの人気のあるベクターストアと連携したり、カスタムソリューションを簡単に統合したりできます。 開発者ツールを完備:ターミナルから直接、ベクターストア管理、クエリパイプライン設定、プロンプトテストなどを行うためのコマンドラインツール一式を利用できます。 モジュール式のインストール:必要なコンポーネントのみをインストールし、プロジェクトのニーズに合わせてフレームワークをカスタマイズすることで、効率を向上させます。
📚 高速かつ柔軟なRAG処理
広範なデータ取り込み:PDF、HTML、スプレッドシート、プレゼンテーションなど、20種類以上のデータフォーマットを処理できます。DoclingやUnstructuredといった強力なパーサーを活用したり、カスタムパーサーを実装したりすることも可能です。 複雑なデータ処理:内蔵のビジュアル言語モデル (VLM) サポートにより、構造化コンテンツ、テーブル、画像を抽出できます。 あらゆるデータソースへの接続:S3、GCS、Azureなどのクラウドストレージサービス用の既存コネクタを利用したり、独自のコネクタを開発したりできます。 スケーラブルな取り込み:Rayベースの並列処理を使用して大規模なデータセットを効率的に処理し、迅速なデータオンボーディングを実現します。
🚀 安心してデプロイと監視が可能
リアルタイムの可観測性:OpenTelemetryと包括的なCLI分析を用いて、アプリケーションのパフォーマンスを追跡し、洞察を得られます。
テスト機能を内蔵:アプリケーションをデプロイする前に、統合されたpromptfoo
テストでプロンプトを検証・改善できます。
自動最適化:システム的なプロセスを通じて、継続的にモデルのパフォーマンスを評価し、最適化します。
チャットUI:API、データ永続化、ユーザーフィードバックメカニズムを備えた、すぐに使えるチャットボットインターフェースをデプロイできます。
RAGbitsを使ってみる
インストールは簡単です。pip
コマンド一つで素早く始められます。
pip install ragbits
このコマンドは、RAGbitsのスターターバンドルをインストールします。これには、ragbits-core
(基本ツール)、ragbits-agents
(エージェントシステム用)、ragbits-document-search
(情報検索と取り込み)、ragbits-evaluate
(統合評価)、ragbits-chat
(対話型AI)、ragbits-cli
(コマンドラインインターフェース)が含まれます。もちろん、必要に応じて個々のコンポーネントをインストールすることもできます。
実践的な例:
RAGbitsのドキュメントには、一般的なユースケースを示す明確なクイックスタートガイドが用意されています。そのシンプルさは以下の例からも垣間見えます。
LLMプロンプトの定義と実行:型安全なプロンプトを簡単に定義し、選択したLLMから応答を生成できます。
# LLMプロンプト生成の例
import asyncio
from pydantic import BaseModel
from ragbits.core.llms import LiteLLM
from ragbits.core.prompt import Prompt
class QuestionAnswerPromptInput(BaseModel):
question: str
class QuestionAnswerPromptOutput(BaseModel):
answer: str
class QuestionAnswerPrompt(Prompt[QuestionAnswerPromptInput, QuestionAnswerPromptOutput]):
system_prompt = """
あなたは質疑応答エージェントです。質問に最善を尽くしてお答えください。
"""
user_prompt = """
質問: {{ question }}
"""
llm = LiteLLM(model_name="gpt-4.1-nano", use_structured_output=True)
async def main() -> None:
prompt = QuestionAnswerPrompt(QuestionAnswerPromptInput(question="Linuxにおけるハイメモリとローメモリとは何ですか?"))
response = await llm.generate(prompt)
print(response.answer)
if __name__ == "__main__":
asyncio.run(main())
ベクターストアインデックスの構築:ドキュメントを取り込み、独自の知識ベースを検索できます。
# ドキュメント検索の例
import asyncio
from ragbits.core.embeddings import LiteLLMEmbedder
from ragbits.core.vector_stores import InMemoryVectorStore
from ragbits.document_search import DocumentSearch
embedder = LiteLLMEmbedder(model_name="text-embedding-3-small")
vector_store = InMemoryVectorStore(embedder=embedder)
document_search = DocumentSearch(vector_store=vector_store)
async def run() -> None:
await document_search.ingest("web://https://arxiv.org/pdf/1706.03762")
result = await document_search.search("この論文で提示されている主要な発見は何ですか?")
print(result)
if __name__ == "__main__":
asyncio.run(run())
RAGパイプラインの構築:LLMと取得したコンテキストを組み合わせることで、正確で関連性の高い応答を実現します。
# RAGパイプラインの例
import asyncio
from pydantic import BaseModel
from ragbits.core.embeddings import LiteLLMEmbedder
from ragbits.core.llms import LiteLLM
from ragbits.core.prompt import Prompt
from ragbits.core.vector_stores import InMemoryVectorStore
from ragbits.document_search import DocumentSearch
class QuestionAnswerPromptInput(BaseModel):
question: str
context: list[str]
class QuestionAnswerPromptOutput(BaseModel):
answer: str
class QuestionAnswerPrompt(Prompt[QuestionAnswerPromptInput, QuestionAnswerPromptOutput]):
system_prompt = """
あなたは質疑応答エージェントです。提供される文脈を使って質問に答えてください。
与えられた文脈に十分な情報がない場合は、回答を拒否してください。
"""
user_prompt = """
質問: {{ question }}
コンテキスト: {% for item in context %}
{{ item }}
{%- endfor %}
"""
embedder = LiteLLMEmbedder(model_name="text-embedding-3-small")
vector_store = InMemoryVectorStore(embedder=embedder)
document_search = DocumentSearch(vector_store=vector_store)
llm = LiteLLM(model_name="gpt-4.1-nano", use_structured_output=True)
async def run() -> None:
question = "この論文で提示されている主要な発見は何ですか?"
await document_search.ingest("web://https://arxiv.org/pdf/1706.03762")
result = await document_search.search(question)
prompt = QuestionAnswerPrompt(
QuestionAnswerPromptInput(
question=question