Skip to content

Latest commit

 

History

History
279 lines (171 loc) · 18.5 KB

File metadata and controls

279 lines (171 loc) · 18.5 KB

怜玢匷化生成 (RAG) ずベクタヌデヌタベヌス

怜玢匷化生成 (RAG) ずベクタヌデヌタベヌス

怜玢アプリケヌションのレッスンでは、独自のデヌタを倧芏暡蚀語モデル (LLM) に統合する方法を簡単に孊びたした。このレッスンでは、LLMアプリケヌションにデヌタを根拠づける抂念、プロセスのメカニズム、埋め蟌みやテキストを含むデヌタを保存する方法に぀いおさらに深く掘り䞋げたす。

ビデオは近日公開予定

はじめに

このレッスンでは、以䞋の内容をカバヌしたす

  • RAGの玹介、それが䜕であり、なぜAI人工知胜で䜿甚されるのか。

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

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

孊習目暙

このレッスンを完了するず、次のこずができるようになりたす

  • デヌタの取埗ず凊理におけるRAGの重芁性を説明する。

  • RAGアプリケヌションをセットアップし、デヌタをLLMに根拠づける。

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

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

このレッスンでは、教育スタヌトアップに独自のノヌトを远加し、チャットボットがさたざたな科目に関する情報を埗られるようにしたす。ノヌトを䜿甚するこずで、孊習者はより良く孊習し、異なるトピックを理解しやすくなり、詊隓の埩習が容易になりたす。シナリオを䜜成するために䜿甚するのは

  • Azure OpenAI: チャットボットを䜜成するために䜿甚するLLM

  • AI for beginners' lesson on Neural Networks: これがLLMに根拠づけるデヌタです

  • Azure AI Search ず Azure Cosmos DB: ベクタヌデヌタベヌスを䜿甚しおデヌタを保存し、怜玢むンデックスを䜜成したす

ナヌザヌはノヌトから緎習クむズを䜜成したり、埩習甚のフラッシュカヌドを䜜成したり、それを簡朔な抂芁にたずめたりするこずができたす。たず、RAGずは䜕か、その動䜜を芋おみたしょう

怜玢匷化生成 (RAG)

LLMを搭茉したチャットボットは、ナヌザヌのプロンプトを凊理しお応答を生成したす。これはむンタラクティブに蚭蚈されおおり、幅広いトピックでナヌザヌず察話したす。ただし、その応答は提䟛されたコンテキストず基盀ずなるトレヌニングデヌタに限定されたす。たずえば、GPT-4の知識のカットオフは2021幎9月であり、この期間以降に発生したむベントに぀いおの知識はありたせん。さらに、LLMを蚓緎するために䜿甚されたデヌタには、個人的なノヌトや䌚瀟の補品マニュアルなどの機密情報は含たれおいたせん。

RAG怜玢匷化生成の動䜜方法

RAGの動䜜方法を瀺す図

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

  • 知識ベヌス: 怜玢前に、これらのドキュメントを取り蟌み、前凊理する必芁がありたす。通垞、倧きなドキュメントを小さなチャンクに分割し、テキスト埋め蟌みに倉換しおデヌタベヌスに保存したす。

  • ナヌザヌの質問: ナヌザヌが質問をしたす。

  • 怜玢: ナヌザヌが質問をするず、埋め蟌みモデルが知識ベヌスから関連情報を怜玢し、プロンプトに組み蟌むための远加のコンテキストを提䟛したす。

  • 匷化生成: LLMは怜玢されたデヌタに基づいお応答を匷化したす。これにより、生成された応答は事前に蚓緎されたデヌタだけでなく、远加されたコンテキストからの関連情報にも基づいおいたす。怜玢されたデヌタはLLMの応答を補匷するために䜿甚されたす。LLMはその埌、ナヌザヌの質問に察する回答を返したす。

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

RAGのアヌキテクチャは、゚ンコヌダヌずデコヌダヌの2぀の郚分からなるトランスフォヌマヌを䜿甚しお実装されたす。たずえば、ナヌザヌが質問をするず、入力テキストがベクトルに「゚ンコヌド」され、単語の意味を捉え、ベクトルがドキュメントむンデックスに「デコヌド」され、ナヌザヌの質問に基づいお新しいテキストを生成したす。LLMぱンコヌダヌデコヌダヌモデルの䞡方を䜿甚しお出力を生成したす。

提案された論文によるず、RAGを実装する際の2぀のアプロヌチは次のずおりです知識集玄型NLP自然蚀語凊理゜フトりェアタスクのための怜玢匷化生成

  • RAG-Sequence 怜玢されたドキュメントを䜿甚しお、ナヌザヌの質問に察する最適な回答を予枬したす。

  • RAG-Token ドキュメントを䜿甚しお次のトヌクンを生成し、それをナヌザヌの質問に答えるために怜玢したす。

なぜRAGを䜿甚するのか

  • 情報の豊富さ: テキスト応答が最新であるこずを保蚌したす。したがっお、内郚知識ベヌスにアクセスするこずで、特定のドメむンタスクのパフォヌマンスを向䞊させたす。

  • 怜蚌可胜なデヌタ を知識ベヌスで利甚するこずで、ナヌザヌの質問にコンテキストを提䟛し、捏造を枛らしたす。

  • LLMの埮調敎に比べおより経枈的であるため、コスト効率が高いです。

知識ベヌスの䜜成

私たちのアプリケヌションは、AI初心者向けカリキュラムのニュヌラルネットワヌクレッスンずいう個人デヌタに基づいおいたす。

ベクタヌデヌタベヌス

ベクタヌデヌタベヌスは、埓来のデヌタベヌスずは異なり、埋め蟌みベクトルを保存、管理、怜玢するために蚭蚈された専門的なデヌタベヌスです。ドキュメントの数倀衚珟を保存したす。デヌタを数倀埋め蟌みに分解するこずで、AIシステムがデヌタを理解し、凊理しやすくなりたす。

埋め蟌みをベクタヌデヌタベヌスに保存する理由は、LLMが入力ずしお受け付けるトヌクンの数に制限があるためです。埋め蟌み党䜓をLLMに枡すこずはできないため、チャンクに分割する必芁がありたす。ナヌザヌが質問をするず、質問に最も近い埋め蟌みがプロンプトずずもに返されたす。チャンク化は、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 the last chunk didn't reach the minimum length, add it anyway
    if current_chunk:
        chunks.append(' '.join(current_chunk))

    return chunks

チャンク化した埌、さたざたな埋め蟌みモデルを䜿甚しおテキストを埋め蟌むこずができたす。䜿甚できるモデルには、word2vec、OpenAIのada-002、Azure Computer Visionなどがありたす。䜿甚するモデルの遞択は、䜿甚する蚀語、゚ンコヌドされたコンテンツの皮類テキスト/画像/音声、゚ンコヌドできる入力のサむズ、埋め蟌み出力の長さに䟝存したす。

OpenAIのtext-embedding-ada-002モデルを䜿甚した埋め蟌みテキストの䟋 猫ずいう単語の埋め蟌み

怜玢ずベクタヌ怜玢

ナヌザヌが質問をするず、怜玢者はそれをク゚リ゚ンコヌダヌを䜿甚しおベクトルに倉換し、入力に関連するドキュメント怜玢むンデックス内の関連ベクトルを怜玢したす。完了するず、入力ベクトルずドキュメントベクトルの䞡方をテキストに倉換し、LLMを通じお枡したす。

怜玢

怜玢は、システムがむンデックスから怜玢基準を満たすドキュメントを迅速に芋぀けようずする際に発生したす。怜玢者の目暙は、コンテキストを提䟛し、デヌタにLLMを根拠づけるために䜿甚されるドキュメントを取埗するこずです。

デヌタベヌス内で怜玢を実行する方法はいく぀かありたす

  • キヌワヌド怜玢 - テキスト怜玢に䜿甚されたす

  • セマンティック怜玢 - 単語の意味を䜿甚したす

  • ベクタヌ怜玢 - 埋め蟌みモデルを䜿甚しおドキュメントをテキストからベクトル衚珟に倉換したす。怜玢は、ナヌザヌの質問に最も近いベクトル衚珟を持぀ドキュメントをク゚リするこずで行われたす。

  • ハむブリッド - キヌワヌド怜玢ずベクタヌ怜玢の䞡方を組み合わせたもの。

怜玢に関する課題は、デヌタベヌスにク゚リに類䌌した応答がない堎合に発生したす。その堎合、システムは可胜な限り最良の情報を返したすが、関連性のための最倧距離を蚭定する、たたはキヌワヌド怜玢ずベクタヌ怜玢の䞡方を組み合わせたハむブリッド怜玢を䜿甚するなどの戊術を䜿甚できたす。このレッスンでは、ベクタヌ怜玢ずキヌワヌド怜玢の䞡方を組み合わせたハむブリッド怜玢を䜿甚したす。デヌタをチャンクず埋め蟌みを含む列を持぀デヌタフレヌムに保存したす。

ベクタヌ類䌌性

怜玢者は、知識デヌタベヌスを通じお、近くにある埋め蟌みを怜玢したす。最も近い隣接は、類䌌したテキストです。ナヌザヌがク゚リを行う堎合、最初に埋め蟌たれ、類䌌した埋め蟌みず䞀臎したす。異なるベクトルがどれだけ類䌌しおいるかを芋぀けるために䜿甚される䞀般的な枬定は、2぀のベクトル間の角床に基づくコサむン類䌌性です。

他の代替手段ずしお䜿甚できる類䌌性の枬定方法には、ベクトルの端点間の盎線距離であるナヌクリッド距離や、2぀のベクトルの察応する芁玠の積の合蚈を枬定するドット積がありたす。

怜玢むンデックス

怜玢を行う際、怜玢を実行する前に知識ベヌスの怜玢むンデックスを構築する必芁がありたす。むンデックスは埋め蟌みを保存し、倧芏暡なデヌタベヌスでも最も類䌌したチャンクを迅速に怜玢できたす。ロヌカルにむンデックスを䜜成するには、次のようにしたす

from sklearn.neighbors import NearestNeighbors

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

# Create the search index
nbrs = NearestNeighbors(n_neighbors=5, algorithm='ball_tree').fit(embeddings)

# To query the index, you can use the kneighbors method
distances, indices = nbrs.kneighbors(embeddings)

再ランク付け

デヌタベヌスをク゚リした埌、最も関連性のある結果から䞊べ替える必芁があるかもしれたせん。再ランク付けLLMは、機械孊習を利甚しお怜玢結果の関連性を向䞊させ、最も関連性の高い順に䞊べ替えたす。Azure AI Searchを䜿甚するず、再ランク付けはセマンティック再ランカヌを䜿甚しお自動的に行われたす。最近傍を䜿甚した再ランク付けの動䜜䟋

# Find the most similar documents
distances, indices = nbrs.kneighbors([query_vector])

index = []
# Print the most similar documents
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):
    # Convert the question to a query vector
    query_vector = create_embeddings(user_input)

    # Find the most similar documents
    distances, indices = nbrs.kneighbors([query_vector])

    # add documents to query  to provide context
    history = []
    for index in indices[0]:
        history.append(flattened_df['chunks'].iloc[index])

    # combine the history and the user input
    history.append(user_input)

    # create a message object
    messages=[
        {"role": "system", "content": "You are an AI assistant that helps with AI questions."},
        {"role": "user", "content": history[-1]}
    ]

    # use chat completion to generate a response
    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怜玢匷化生成ずベクタヌデヌタベヌスを䜿甚するナヌスケヌス

関数呌び出しがアプリを改善できるさたざたなナヌスケヌスがありたす

  • 質問応答䌚瀟のデヌタをチャットに根拠づけ、埓業員が質問できるようにする。

  • レコメンデヌションシステム映画やレストランなど、最も類䌌した倀をマッチングするシステムを䜜成する。

  • チャットボットサヌビスチャット履歎を保存し、ナヌザヌデヌタに基づいお䌚話をパヌ゜ナラむズする。

  • ベクタヌ埋め蟌みに基づく画像怜玢、画像認識や異垞怜出に圹立ちたす。

たずめ

デヌタをアプリケヌションに远加するこずから、ナヌザヌのク゚リず出力たで、RAGの基本的な領域をカバヌしたした。RAGの䜜成を簡玠化するために、Semanti Kernel、Langchain、Autogenなどのフレヌムワヌクを䜿甚できたす。

課題

怜玢匷化生成RAGの孊習を続けるために、以䞋を構築できたす

  • 任意のフレヌムワヌクを䜿甚しおアプリケヌションのフロント゚ンドを構築する

  • LangChainたたはSemantic Kernelのいずれかのフレヌムワヌクを利甚し、アプリケヌションを再䜜成する。

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

孊習はここで止たりたせん、旅を続けたしょう

このレッスンを完了した埌、生成AI孊習コレクションをチェックしお、生成AIの知識をさらに高めたしょう

免責事項:
この文曞は、AI翻蚳サヌビスCo-op Translatorを䜿甚しお翻蚳されおいたす。正確さを期すために努力しおいたすが、自動翻蚳には誀りや䞍正確さが含たれる可胜性があるこずをご承知おきください。元の蚀語の文曞が暩嚁ある情報源ず芋なされるべきです。重芁な情報に぀いおは、専門の人間による翻蚳をお勧めしたす。この翻蚳の䜿甚に起因する誀解や誀蚳に぀いお、圓瀟は責任を負いたせん。