
読み取り時間:〜10分
Pulsejet Github Repoを使用した建物アールデコぼろきれチャットボット:https://github.com/jet-engine/art-deco-chatbot
このブログ投稿は、次のリンクから読むことができます。
大規模な言語モデル(LLM)は大幅に進歩しており、幅広い質問に答える能力を向上させています。しかし、彼らは依然として、特に具体的または最近の情報で課題に遭遇し、しばしば不正確さや「幻覚」をもたらします。これらの問題に対処するために、検索拡張生成(RAG)アプローチは、ドキュメント取得ステップを応答生成プロセスに統合します。このアプローチはドキュメントのコーパスを使用し、ベクトルデータベースを使用して効率的な検索に使用し、3つの重要なステップを介してLLM応答の精度と信頼性を高めます。
ベクトルデータベースは、迅速な類似性検索と効率的なデータ管理を促進し、LLM機能を強化するための強力なソリューションになります。
1920年代から1940年代にかけてのアールデコ時代は、建築にまばゆいばかりの遺産を残しました。 Metaのllama3.1のようなモデルの機能にもかかわらず、特にアールデコに固有の微妙なクエリまたは詳細なクエリに対して、それらの応答は信頼できない場合があります。アールデコのチャットボットでの私たちの目標は、RAGを使用してアールデコアーキテクチャに関する応答の品質を向上させ、これらを品質と時間の効率の両方で従来のLLMによって生成されたものと比較することです。
アールデコのチャットボットを設計することにより、複雑なRAGシステムをどのように構築できるかを示すことも目指しています。 Art Deco Chatbot Githubリポジトリの完全なコードにアクセスできます。コードを調べてこのreadmeを読むことにより、次のことを学びます。
Ollamaは、ローカルマシンでLLMモデルの実行を簡単に促進するプログラムです。
ollama pull llama3.1 (ぼろきらに使用されるLLM)ollama pull nomic-embed-text (ぼろきらに使用される埋め込みモデル)このプロジェクトでは、RAGの実行方法を示すためのコードを作成することを目指しているだけでなく、RAGの結果を異なるLLMのクエリと比較およびベンチマークすることも目指しています。これらのLLMの一部はローカルで( GPT-4oなど)実行できませんが、他のLLMはコンピューティングが多いため、クラウドサービス(GROQでLlama3.1:70bなど)で実行されます。
Litellmは、異なるLLMをクエリするための統一されたインターフェイスを提供し、コードをクリーンにし、より読みやすくします。 Litellm Pythonライブラリをチェックアウトすることをお勧めしますが、このプロジェクトには必要ありません。
OpenaiとGROQからAPIキーを入手して、プロジェクトで使用します。これらのサービスを使用して請求される可能性があることに注意してください。 Groq API執筆時点で無料で使用できますが、 OpenAI API無料ではありません。
PulseJetは、ドキュメント埋め込みの効率的なストレージと取得を可能にする高性能ベクトルデータベースです。 PulseJetをセットアップするには:
pip install pulsejetdocker run --name pulsejet_container -p 47044-47045:47044-47045 jetngine/pulsejetを使用してDockerコンテナを作成します注:PulseJetはrequirements.txtファイルに既に含まれているため、最初のステップをスキップできます。
PulseJet Docker画像の実行とVectorデータベース操作のためにPulseJet Pythonライブラリを使用する詳細については、PulseJetドキュメントを確認してください。
実行して、必要なすべての依存関係をインストールします。
pip install -r requirements.txt
このプロジェクトは、
Python 3.11を搭載したconda環境を使用して開発されました。
さまざまな環境でプロジェクトをテストしていないため、最適なパフォーマンスと互換性のためにこの構成を順守することをお勧めします。
Art Deco Chatbotは、構成に2つのYAMLファイルを使用しています: config.template.yamlおよびsecrets.yaml 。各セクションの詳細な内訳は次のとおりです。
APIキーを使用してsecrets.yamlファイルを作成します。
# api_keys:
openai_key : " your_openai_key_here "
groq_key : " your_groq_key_here " # models:
main_model : " llama3.1 "
embed_model : " nomic-embed-text "
# vector_db:
vector_db : " pulsejet "
# pulsejet:
pulsejet_location : " remote "
pulsejet_collection_name : " art-deco "
# paths:
rag_files_path : " rag_files/ "
questions_file_path : " evaluation/questions.csv "
evaluation_path : " evaluation/ "
rag_prompt_path : " evaluation/rag_prompt.txt "
metrics_file_path : " evaluation/metrics.json "
# embeddings:
embeddings_file_path : " embeddings_data/all_embeddings_HSNW.h5 "
use_precalculated_embeddings : true
# llm_models:
all_models :
gpt-4o : " gpt-4o "
groq-llama3.1-8b : " groq/llama-3.1-8b-instant "
groq-llama3.1-70b : " groq/llama-3.1-70b-versatile "
ollama-llama3.1 : " ollama/llama3.1 "
ollama-llama3.1-70b : " ollama/llama3.1:70b "
selected_models :
- " gpt-4o "
- " groq-llama3.1-70b "
- " ollama-llama3.1 "
# rag_parameters:
sentences_per_chunk : 10
chunk_overlap : 2
file_extension : " .txt "各セクションの詳細な説明は次のとおりです。
trueに設定すると、システムは指定されたファイルから埋め込みをロードします。 falseの場合、新しい埋め込みを生成し、このファイルに保存します。 プロジェクトを実行する前に、特定の設定でこれらの構成ファイルを更新してください。 RAGパラメーターを調整すると、RAGシステムのパフォーマンスと精度に大きな影響を与える可能性があります。特定のユースケースとドキュメントセットの最適な構成を見つけるには、異なる値を使用した実験が必要になる場合があります。
wiki-bot.pyでスクレーパーを実行しますwikipediaのすべての削られた記事のコンテンツファイルはhttps://huggingface.co/datasets/jetengine/art_deco_usa_dsで入手できるため、このステップはオプションです。
このデータセットをダウンロードして、そこからすべてのテキストファイルをrag_filesディレクトリにコピーできます。次のセクションで説明する事前に計算された埋め込みを使用する予定がある場合は、実際にこのデータセットをダウンロードする必要はありません。
スクレイピングプロセスを繰り返す必要はありません。データスクレイピングプロセスに興味がない場合は、このセクションの残りの部分を読み取ることができます。
最初のステップでは、アートデコアーキテクチャに関する知識を収集することです。私たちは、アートデコ運動における卓越性を考えると、米国の構造に焦点を当てています。 Wiki-Bot.pyスクリプトは、関連するWikipediaの記事のコレクションを自動化し、アクセスを容易にするために構造化されたディレクトリに整理します。
使用してボットを実行します。
python wiki-bot.py
空のrag_filesディレクトリを使用してwiki-bot.pyを実行すると、rag_filesの下にあるtextという名前のサブフォルダーの削り式ウィキペディア記事の内容を保存します。また、ボットは、記事のURL、参照などのさまざまな種類のデータを整理するためのさまざまなサブフォルダーを作成します。現在の焦点はウィキペディアの記事の内容のみに焦点を当てているため、クラッターを減らすために、 textサブフォルダーからHGデータセットにコンテンツを転送し、他のすべてのサブフォールダーを削除しました。
したがって、スクレイプされたドキュメントがすでに顔を抱きしめているのでオプションであるボットを自分で実行したい場合は、テキストサブフォルダーからrag_filesディレクトリにすべてのファイルをコピーして、 rag_files内のすべてのサブフォルダーを削除するか、 rag_files/textのrag_files_pathをconfig.yamlする必要があります。
indexing.pyのインデックスドキュメント実行してドキュメントにインデックスを作成します。
python indexing.py
このスクリプトは、ドキュメントを処理し、埋め込みを生成し、pulsejetに保存します。埋め込みを生成するために時間を失いたくない場合は、https://huggingface.co/jetengine/rag_art_deco_embeddingsから事前に計算された埋め込みをダウンロードし、 use_precalculated_embeddings: true設定できます。
セットアップでは、埋め込みの生成が約15分かかり、ベクターをPulseJetに挿入して約4秒かかります。
スクリプトは次のようにタイミング情報を出力します:
chat.pyで推論を実行します構成が正しいことを確認してから、実行してください。
python chat.py
このスクリプトは、異なるLLMとRAGシステムをクエリし、結果を出力して、比較のためにHTML、JSON、およびCSV形式を出力します。
このプロジェクトでは、効率的なベクトルストレージと検索のためにPulseJetが使用されています。 PulseJetがArt Deco Chatbotプロジェクトに統合されている方法の詳細な概要を以下に示します。
PulseJetクライアントの初期化:
client = pj . PulsejetClient ( location = config [ 'pulsejet_location' ])これにより、PulseJetクライアントが作成されます。私たちのプロジェクトでは、リモートPulseJetインスタンスを使用しているため、 location 「リモート」に設定されています。これは、Dockerコンテナで実行されているPulseJetサーバーに接続します。
コレクションの作成:
client . create_collection ( collection_name , vector_config )これにより、Pulsejetに新しいコレクションが作成され、ドキュメントの埋め込みが保存されます。 vector_configパラメーターは、ベクトルサイズやインデックスタイプなどのベクトルストレージの構成を指定します(たとえば、効率的な類似性検索のHNSW)。
ベクターの挿入:私たちのプロジェクトでは、ベクターを挿入するために次のパターンを使用します。
collection [ 0 ]. insert_single ( collection [ 1 ], embed , meta )これは最初は混乱しているように見えるかもしれませんが、ここにそれが意味するものがあります:
collection[0]は、実際にはPulseJetクライアントインスタンスです。collection[1]は、私たちが挿入しているコレクションの名前です。embedのは、私たちが挿入しているベクトルです。meta 、ベクトルに関連する追加のメタデータです。これは呼び出しに相当します。
client . insert_single ( collection_name , vector , meta )バルク挿入には、以下を使用します。
client . insert_multi ( collection_name , embeds )これにより、複数の埋め込みが一度に挿入されます。これは、大きなデータセットでより効率的です。
ベクターの検索:
results = client [ 'db' ]. search_single ( collection , query_embed , limit = 5 , filter = None )これにより、指定されたPulseJetコレクションで類似性検索を実行して、特定のクエリベクトルに最も関連するドキュメントを見つけます。 limitパラメーターは、返される結果の最大数を指定します。
私たちのプロジェクトでは、 client['db']を使用して、PulseJetクライアントのデータベースメソッドにアクセスします。これは、クライアントを直接使用することと同等です。
results = client . search_single ( collection_name , query_vector , limit = 5 , filter = None )接続を閉じる:
client . close ()これにより、不要になったときにPulseJetデータベースへの接続が閉じられます。
PulsejetRagClientクラスは、 pulsejet_rag_client.pyで定義されており、RAGシステムのコンテキストでPulseJetと対話するための高レベルのインターフェイスを提供します。主要なコンポーネントの内訳は次のとおりです。
初期化:
class PulsejetRagClient :
def __init__ ( self , config ):
self . config = config
self . collection_name = config [ 'pulsejet_collection_name' ]
self . main_model = config [ 'main_model' ]
self . embed_model = config [ 'embed_model' ]
self . client = pj . PulsejetClient ( location = config [ 'pulsejet_location' ])クライアントは、構成パラメーターで初期化され、PulseJetクライアントを設定し、関連する構成値を保存します。
コレクションの作成:
def create_collection ( self ):
vector_size = get_vector_size ( self . config [ 'embed_model' ])
vector_params = pj . VectorParams ( size = vector_size , index_type = pj . IndexType . HNSW )
try :
self . client . create_collection ( self . collection_name , vector_params )
logger . info ( f"Created new collection: { self . collection_name } " )
except Exception as e :
logger . info ( f"Collection ' { self . collection_name } ' already exists or error occurred: { str ( e ) } " )この方法は、指定されたパラメーターを使用してPulseJetに新しいコレクションを作成します。 get_vector_size関数を使用して、埋め込みに適したベクトルサイズを決定します。
ベクターの挿入:
def insert_vector ( self , vector , metadata = None ):
try :
self . client . insert_single ( self . collection_name , vector , metadata )
logger . debug ( f"Inserted vector with metadata: { metadata } " )
except Exception as e :
logger . error ( f"Error inserting vector: { str ( e ) } " )
def insert_vectors ( self , vectors , metadatas = None ):
try :
self . client . insert_multi ( self . collection_name , vectors , metadatas )
logger . debug ( f"Inserted { len ( vectors ) } vectors" )
except Exception as e :
logger . error ( f"Error inserting multiple vectors: { str ( e ) } " )これらの方法は、それに関連するメタデータとともに、PulseJetコレクションへの単一および複数のベクトルの挿入を処理します。
ベクターの検索:
def search_similar_vectors ( self , query_vector , limit = 5 ):
try :
results = self . client . search_single ( self . collection_name , query_vector , limit = limit , filter = None )
return results
except Exception as e :
logger . error ( f"Error searching for similar vectors: { str ( e ) } " )
return []この方法は、PulseJetコレクションで類似性検索を実行して、特定のクエリベクトルに最も関連するドキュメントを見つけます。
接続を閉じる:
def close ( self ):
try :
self . client . close ()
logger . info ( "Closed Pulsejet client connection" )
except Exception as e :
logger . error ( f"Error closing Pulsejet client connection: { str ( e ) } " )このメソッドは、不要になったときにPulseJetデータベースへの接続を閉じます。
PulsejetRagClientは、PulseJetと対話するためにプロジェクト全体で使用されます。通常、それがどのようにインスタンス化され、使用されているかは次のとおりです。
作成:
from pulsejet_rag_client import create_pulsejet_rag_client
config = get_config ()
rag_client = create_pulsejet_rag_client ( config )インデックス作成文書:
indexing.pyでは、クライアントを使用してコレクションを作成し、ベクトルを挿入します。
rag_client . create_collection ()
for file_name , file_embeddings in embeddings_data . items ():
for chunk_id , content , embed in file_embeddings :
metadata = { "filename" : file_name , "chunk_id" : chunk_id , "content" : content }
rag_client . insert_vector ( embed , metadata ) rag.pyでは、クライアントを使用して、RAGプロセス中に同様のベクターを検索します。
results = rag_client . search_similar_vectors ( query_embed , limit = 5 )操作が完了した後、接続を閉じます。
rag_client . close ()この実装は、RAGシステム内のすべてのPulseJet操作に対して、クリーンでカプセル化されたインターフェイスを提供します。
LLama3.1を使用したRagタスクは、クエリの長さが増加しているため、単純な質問応答よりも時間がかかります。アールデコのチャットボットは、LLMSをRAGでどのように使用できるかを示しています。当社のプロジェクトは、RAG実装の包括的な調査を提供し、データのスクレイピングやドキュメントのチャンクから、作成の作成とベクターデータベースの統合まで、あらゆるステップをカバーしています。
RAGシステムのドキュメントベースが大きくなるにつれて、挿入操作と検索操作のパフォーマンスがますます重要になります。 PulseJet Vectorデータベースを本格的なRAGシステムに統合する方法を学ぶことで、特に大規模なドキュメントベースでRAGアプリケーションを扱う場合、その機能から大きな恩恵を受けることができます。
私たちのぼろきれの反応はより正確だったかもしれません。アールデコのチャットボットのパフォーマンスを強化するために、いくつかの実験的アプローチを検討しています。
次のイニシアチブを通じてこのプロジェクトを拡大する予定です。
アールデコのチャットボットを試し、パラメーターを変更し、独自の関心のあるドメインに適応させることをお勧めします。
著者:GüvençUsanmaz