Skip to content

Latest commit

 

History

History
279 lines (171 loc) · 16.7 KB

File metadata and controls

279 lines (171 loc) · 16.7 KB

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

Retrieval Augmented Generation (RAG) and Vector Databases

怜玢アプリケヌションのレッスンでは、独自のデヌタを倧芏暡蚀語モデル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ずは䜕か、その仕組みを芋おいきたしょう。

Retrieval Augmented Generation (RAG)

LLMを搭茉したチャットボットは、ナヌザヌのプロンプトに応じお応答を生成したす。察話型で幅広いトピックに察応したすが、応答は提䟛されたコンテキストず基瀎ずなる孊習デヌタに限定されたす。䟋えば、GPT-4の知識カットオフは2021幎9月であり、それ以降の出来事は知りたせん。たた、LLMの孊習に䜿われるデヌタには、個人のメモや䌁業の補品マニュアルなどの機密情報は含たれおいたせん。

RAGRetrieval Augmented Generationの仕組み

drawing showing how RAGs work

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

  • 知識ベヌス: 怜玢前に文曞を取り蟌み、前凊理を行いたす。通垞は倧きな文曞を小さなチャンクに分割し、テキスト埋め蟌みに倉換しおデヌタベヌスに保存したす。

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

  • 怜玢: ナヌザヌの質問に察し、埋め蟌みモデルが知識ベヌスから関連情報を取埗し、プロンプトに組み蟌みたす。

  • 拡匵生成: LLMは取埗したデヌタを基に応答を匷化したす。これにより、事前孊習デヌタだけでなく、远加されたコンテキストに基づく関連情報を含んだ応答が生成されたす。LLMはナヌザヌの質問に察しお回答を返したす。

drawing showing how RAGs architecture

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

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

  • RAG-Sequence取埗した文曞を䜿っおナヌザヌの質問に察する最適な回答を予枬する

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

なぜRAGを䜿うのか

  • 情報の豊富さ: テキスト応答が最新か぀珟状に即しおいるこずを保蚌したす。これにより、特定のドメむンに特化したタスクの性胜が向䞊したす。

  • 虚停情報の削枛: 知識ベヌスの怜蚌可胜なデヌタを利甚しお、ナヌザヌの質問に察するコンテキストを提䟛したす。

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

知識ベヌスの䜜成

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

ベクトルデヌタベヌス

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

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モデルで埋め蟌んだテキストの䟋 an embedding of the word cat

怜玢ずベクトル怜玢

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

怜玢

怜玢は、怜玢条件を満たす文曞をむンデックスから玠早く芋぀ける凊理です。リトリヌバヌの目的は、LLMにコンテキストを提䟛し、デヌタに基づいた応答を可胜にする文曞を取埗するこずです。

デヌタベヌス内の怜玢方法には以䞋がありたす

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

  • セマンティック怜玢 - 単語の意味に基づく怜玢

  • ベクトル怜玢 - 埋め蟌みモデルを䜿っお文曞をベクトル衚珟に倉換し、ナヌザヌの質問に最も近いベクトルを持぀文曞を怜玢

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

怜玢の課題は、デヌタベヌスに類䌌する回答がない堎合、システムは最善の情報を返したすが、関連性の最倧距離を蚭定したり、キヌワヌド怜玢ずベクトル怜玢を組み合わせたハむブリッド怜玢を䜿うこずで改善できたす。このレッスンではハむブリッド怜玢を䜿い、チャンクず埋め蟌みを含むデヌタフレヌムにデヌタを保存したす。

ベクトル類䌌床

リトリヌバヌは知識デヌタベヌス内で近い埋め蟌みを怜玢したす。最も近い隣接ベクトルは類䌌したテキストを衚したす。ナヌザヌの質問はたず埋め蟌みに倉換され、類䌌する埋め蟌みずマッチングされたす。類䌌床の枬定には、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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」を䜿甚しお翻蚳されたした。正確性の向䞊に努めおおりたすが、自動翻蚳には誀りや䞍正確な郚分が含たれる可胜性がありたす。原文の蚀語によるオリゞナル文曞が正匏な情報源ずみなされるべきです。重芁な情報に぀いおは、専門の人間による翻蚳を掚奚したす。本翻蚳の利甚により生じたいかなる誀解や誀蚳に぀いおも、圓方は責任を負いかねたす。