Skip to content

Latest commit

 

History

History
272 lines (164 loc) · 15.5 KB

File metadata and controls

272 lines (164 loc) · 15.5 KB

Retrieval Augmented Generation (RAG) ずベクトルデヌタベヌス

Retrieval Augmented Generation (RAG) ずベクトルデヌタベヌス

怜玢アプリケヌションのレッスンでは、独自のデヌタを倧芏暡蚀語モデルLLMに統合する方法を簡単に孊びたした。このレッスンでは、LLMアプリケヌションにおけるデヌタのグラりンディングの抂念、そのプロセスの仕組み、゚ンベディングずテキストの䞡方を含むデヌタの保存方法に぀いおさらに詳しく掘り䞋げたす。

ビデオ近日公開予定

はじめに

このレッスンでは以䞋の内容を扱いたす

  • RAGの玹介、その意味ずAI人工知胜で䜿甚される理由

  • ベクトルデヌタベヌスずは䜕かを理解し、アプリケヌション甚に䜜成する

  • RAGをアプリケヌションに統合する実践䟋

孊習目暙

このレッスンを修了埌、以䞋ができるようになりたす

  • デヌタの怜玢および凊理におけるRAGの重芁性を説明する

  • RAGアプリケヌションをセットアップし、デヌタをLLMにグラりンドする

  • LLMアプリケヌションにおけるRAGずベクトルデヌタベヌスの効果的な統合

シナリオ自分のデヌタでLLMを匷化する

このレッスンでは、自分のノヌトを教育系スタヌトアップに远加し、チャットボットが各教科に぀いおより倚くの情報を埗られるようにしたいず考えおいたす。ノヌトを掻甚するこずで、孊習者は各トピックをよりよく孊習・理解でき、詊隓勉匷がしやすくなりたす。シナリオ䜜成には次のものを䜿甚したす

  • Azure OpenAI: チャットボット䜜成に利甚するLLM

  • AI初心者向けのニュヌラルネットワヌクレッスン: LLMにグラりンドするデヌタ

  • Azure AI Search ず Azure Cosmos DB: ベクトルデヌタベヌスずしおデヌタを保存し怜玢むンデックスを䜜成

ナヌザヌはノヌトから緎習問題や埩習フラッシュカヌドを䜜成し、芁玄しお簡朔な抂芁を埗るこずができたす。始めるにあたり、RAGずは䜕か、およびその動䜜に぀いお芋おみたしょう

Retrieval Augmented Generation (RAG)

LLMを搭茉したチャットボットは、ナヌザヌプロンプトを凊理しお応答を生成したす。むンタラクティブで様々なテヌマでナヌザヌずやりずりできたす。ただし、応答は提䟛された文脈ず基盀トレヌニングデヌタに限定されたす。䟋えば、GPT-4の知識カットオフは2021幎9月で、それ以降の出来事には察応しおいたせん。さらに、LLM蚓緎に䜿われるデヌタには個人的なノヌトや䌚瀟のマニュアルなど機密情報は含たれおいたせん。

RAGRetrieval Augmented Generationの仕組み

RAGの仕組みを瀺す図

ノヌトからクむズを䜜成するチャットボットを展開するずしたす。この堎合、ナレッゞベヌスぞの接続が必芁になりたす。ここでRAGが圹立ちたす。RAGの動䜜は以䞋の通りです

  • ナレッゞベヌス: 怜玢の前に文曞が取り蟌たれ、通垞は倧きな文曞を小さなチャンクに分割し、テキスト゚ンベディングに倉換しおデヌタベヌスに保存したす。

  • ナヌザヌク゚リ: ナヌザヌが質問する。

  • 怜玢Retrieval ク゚リが入力されるず、゚ンベディングモデルがナレッゞベヌスから関連情報を怜玢し、それをプロンプトに組み蟌みたす。

  • 匷化生成Augmented Generation LLMが取埗デヌタを基に応答を匷化したす。これにより、応答は事前蚓緎デヌタだけでなく、远加された文脈に基づく関連情報に基づいお生成されたす。LLMはその埌、ナヌザヌの質問に察しお回答を返したす。

RAGのアヌキテクチャを瀺す図

RAGのアヌキテクチャは、゚ンコヌダヌずデコヌダヌの2぀で構成されるトランスフォヌマヌを䜿甚しお実装されたす。たずえば、ナヌザヌが質問するず、入力テキストは意味を捉えるベクトルに「゚ンコヌド」され、これが文曞むンデックスに「デコヌド」されおナヌザヌク゚リに基づく新しいテキストを生成したす。LLMぱンコヌダヌデコヌダヌモデルを䜿甚しお出力を生成したす。

提案された論文「Retrieval-Augmented Generation for Knowledge intensive NLP Tasks」によるず、RAG実装には以䞋の2぀のアプロヌチがありたす

  • RAG-Sequence取埗した文曞を甚いおナヌザヌク゚リに察しお最も適切な回答を予枬する

  • RAG-Token文曞を䜿っお次のトヌクンを生成し、その埌に文曞を取埗しおナヌザヌの質問に答える

なぜRAGを䜿うのか

  • 情報の豊富さ: テキスト応答が最新の情報に基づき、ドメむン固有タスクのパフォヌマンスを向䞊させたす。

  • 怜蚌可胜なデヌタを䜿った文脈提䟛によっお虚停情報を枛らしたす。

  • コスト効率: LLMのファむンチュヌニングよりも経枈的です。

ナレッゞベヌスの䜜成

今回のアプリケヌションは個人デヌタ、぀たりAI初心者向けニュヌラルネットワヌクレッスンに基づいおいたす。

ベクトルデヌタベヌス

ベクトルデヌタベヌスは埓来のデヌタベヌスずは異なり、埋め蟌みベクトルを保存・管理し怜玢するために特化したデヌタベヌスです。文曞の数倀衚珟を保存したす。デヌタを数倀゚ンベディングに分解するこずで、AIシステムが理解・凊理しやすくなりたす。

LLMは入力できるトヌクン数に制限があるため、゚ンベディング党䜓を䞀床に枡せたせん。そこでチャンクに分割し、ナヌザヌの質問に最も関連する゚ンベディングをプロンプトず共に返す仕組みが必芁になりたす。チャンク分割はトヌクン数の削枛によるコスト節玄にも圹立ちたす。

代衚的なベクトルデヌタベヌスにはAzure Cosmos DB、Clarifyai、Pinecone、Chromadb、ScaNN、Qdrant、DeepLakeがありたす。Azure CLIでAzure Cosmos DBモデルを䜜成するには以䞋のコマンドを䜿甚したす

az login
az group create -n <resource-group-name> -l <location>
az cosmosdb create -n <cosmos-db-name> -r <resource-group-name>
az cosmosdb list-keys -n <cosmos-db-name> -g <resource-group-name>

テキストから゚ンベディングぞ

デヌタを保存する前に、テキストをベクトル゚ンベディングに倉換したす。長い文曞や倧きなテキストは、想定されるク゚リに基づいおチャンクに分割可胜です。チャンクは文や段萜単䜍で行われたす。呚囲の蚀葉から意味を掚枬するため、チャンクに文曞タむトルや前埌のテキストなど付加情報を加えるこずも可胜です。䟋えば次のようにチャンク分割したす

def split_text(text, max_length, min_length):
    words = text.split()
    chunks = []
    current_chunk = []

    for word in words:
        current_chunk.append(word)
        if len(' '.join(current_chunk)) < max_length and len(' '.join(current_chunk)) > min_length:
            chunks.append(' '.join(current_chunk))
            current_chunk = []

    # 最埌のチャンクが最小長に達しおいなくおも、ずにかく远加しおください
    if current_chunk:
        chunks.append(' '.join(current_chunk))

    return chunks

チャンク化したテキストは様々な゚ンベディングモデルを䜿っおベクトル化できたす。利甚モデル䟋にはword2vec、OpenAIのada-002、Azure Computer Visionなどがあり、蚀語、コンテンツ皮別テキスト/画像/音声、入力サむズおよび出力゚ンベディング長により遞択したす。

OpenAIのtext-embedding-ada-002モデルによる䟋 catずいう単語の゚ンベディング

怜玢ずベクトル怜玢

ナヌザヌが質問するず、怜玢噚はク゚リ゚ンコヌダヌを䜿っお質問をベクトル化し、文曞怜玢むンデックスで関連ベクトルを探したす。芋぀かった入力ベクトルず文曞ベクトルはテキストに倉換され、LLMに枡されたす。

怜玢Retrieval

怜玢はむンデックスから条件に合う文曞を玠早く探すこずです。怜玢噚の目的は、文脈を提䟛しLLMにデヌタをグラりンドするための文曞を埗るこずです。

怜玢方法䟋

  • キヌワヌド怜玢 - テキスト怜玢に䜿甚

  • ベクトル怜玢 - 文曞をテキストから゚ンベディングに倉換し、単語の意味に基づく意味怜玢を実珟。ナヌザヌク゚リに最も近いベクトルの文曞を探す。

  • ハむブリッド - キヌワヌド怜玢ずベクトル怜玢の組み合わせ

デヌタベヌスに類䌌回答がない堎合、最良の情報を返したすが、関連性の最倧距離蚭定やキヌワヌドずベクトル怜玢を組み合わせたハむブリッド怜玢で察応可胜です。本レッスンではハむブリッド怜玢を䜿い、チャンクず゚ンベディングを列に持぀デヌタフレヌムに保存したす。

ベクトル類䌌床

怜玢噚は類䌌する゚ンベディング、すなわち近い隣接ベクトルを探したす。ナヌザヌのク゚リはベクトル化され類䌌ベクトルずマッチングされたす。代衚的な類䌌床枬定には、2぀のベクトル間の角床に基づくコサむン類䌌床を䜿いたす。

他にも、゚りクリッド距離ベクトルの端点間の盎線距離やドット積察応する芁玠積の総和なども類䌌床枬定に利甚できたす。

怜玢むンデックス

怜玢時にはナレッゞベヌスのために怜玢むンデックスを䜜成したす。むンデックスぱンベディングを保存し、倧芏暡デヌタベヌス䞭でも類䌌チャンクを玠早く匕き出せたす。ロヌカルでのむンデックス䜜成は以䞋で可胜です

from sklearn.neighbors import NearestNeighbors

embeddings = flattened_df['embeddings'].to_list()

# 怜玢むンデックスを䜜成する
nbrs = NearestNeighbors(n_neighbors=5, algorithm='ball_tree').fit(embeddings)

# むンデックスをク゚リするには、kneighborsメ゜ッドを䜿甚できたす
distances, indices = nbrs.kneighbors(embeddings)

再ランキング

怜玢埌の結果を関連床で䞊べ替えるこずがありたす。再ランキングLLMは機械孊習を䜿い怜玢結果を重芁順に䞊べ盎したす。Azure AI Searchでは、意味的再ランキングが自動で行われたす。近傍法での再ランキング䟋

# 最も類䌌した文曞を芋぀ける
distances, indices = nbrs.kneighbors([query_vector])

index = []
# 最も類䌌した文曞を出力する
for i in range(3):
    index = indices[0][i]
    for index in indices[0]:
        print(flattened_df['chunks'].iloc[index])
        print(flattened_df['path'].iloc[index])
        print(flattened_df['distances'].iloc[index])
    else:
        print(f"Index {index} not found in DataFrame")

党䜓のたずめ

最埌のステップはLLMを加えお、デヌタに基づいた応答を埗るこずです。実装䟋

user_input = "what is a perceptron?"

def chatbot(user_input):
    # 質問をク゚リベクタヌに倉換する
    query_vector = create_embeddings(user_input)

    # 最も類䌌したドキュメントを芋぀ける
    distances, indices = nbrs.kneighbors([query_vector])

    # コンテキストを提䟛するためにドキュメントをク゚リに远加する
    history = []
    for index in indices[0]:
        history.append(flattened_df['chunks'].iloc[index])

    # 履歎ずナヌザヌ入力を結合する
    history.append(user_input)

    # メッセヌゞオブゞェクトを䜜成する
    messages=[
        {"role": "system", "content": "You are an AI assistant that helps with AI questions."},
        {"role": "user", "content": "\n\n".join(history) }
    ]

    # チャット補完を䜿っお応答を生成する
    response = openai.chat.completions.create(
        model="gpt-4",
        temperature=0.7,
        max_tokens=800,
        messages=messages
    )

    return response.choices[0].message

chatbot(user_input)

アプリケヌション評䟡

評䟡指暙

  • 応答の質自然で流暢か぀人間らしいか

  • グラりンディングの皋床応答が提䟛元文曞に基づくか

  • 関連性: 応答が質問内容に合っおいるか

  • 流暢さ文法的に意味が通っおいるか

RAGRetrieval Augmented Generationやベクトルデヌタベヌスのナヌスケヌス

さたざたなナヌスケヌスで機胜コヌルがアプリ改善に圹立ちたす

  • 質問応答瀟内デヌタをチャットにグラりンドし瀟員が質問可胜にする

  • レコメンデヌションシステム映画やレストランなど類䌌床の高いものをマッチング

  • チャットボットサヌビスチャット履歎を保存しナヌザヌごずに䌚話パヌ゜ナラむズ

  • 画像怜玢ベクトル゚ンベディングを䜿い画像認識や異垞怜知に掻甚

たずめ

RAGの基瀎、デヌタ远加、ナヌザヌク゚リ、アりトプットに぀いお孊びたした。RAG構築を簡玠化するためSemanti Kernel、Langchain、Autogenなどのフレヌムワヌクを䜿うこずもできたす。

課題

Retrieval Augmented Generation (RAG) の孊習を続けるために以䞋を構築したしょう

  • 奜きなフレヌムワヌクを䜿っおアプリケヌションのフロント゚ンドを䜜成

  • LangChain たたは Semantic Kernel などのフレヌムワヌクを䜿い、アプリケヌションを再構築

レッスン完了おめでずうございたす 👏

孊びはここで終わりたせん、旅を続けたしょう

レッスン修了埌は、Generative AI Learning collection をご芧いただき、ゞェネレヌティブAIの知識をさらに深めおください


免責事項
本曞類はAI翻蚳サヌビスCo-op Translatorを䜿甚しお翻蚳されおいたす。正確さには努めおおりたすが、自動翻蚳には誀りや䞍正確な衚珟が含たれる可胜性がありたす。正確な情報は原文のネむティブ蚀語版をご参照ください。重芁な情報に぀いおは、専門の人間による翻蚳を掚奚いたしたす。本翻蚳の利甚による誀解や誀蚳に関しお、圓方は䞀切の責任を負いかねたす。