Skip to content

Latest commit

 

History

History
272 lines (164 loc) · 23.6 KB

File metadata and controls

272 lines (164 loc) · 23.6 KB

Retrieval Augmented Generation (RAG) и векторске базе података

Retrieval Augmented Generation (RAG) и векторске базе података

У лекцији о апликацијама за претрагу, укратко смо научили како да интегришете своје податке у Large Language Models (LLM). У овој лекцији ћемо детаљније проучити концепте повезивања ваших података у апликацији LLM, механизам процеса и методе за чување података, укључујући и ембеддинге и текст.

Видео ће ускоро бити доступан

Увод

У овој лекцији ћемо покрити следеће:

  • Увод у RAG, шта је и зашто се користи у вештачкој интелигенцији (AI).

  • Разумевање шта су векторске базе података и како направити једну за нашу апликацију.

  • Практичан пример како интегрисати RAG у апликацију.

Циљеви учења

Након завршетка ове лекције, моћи ћете да:

  • Објасните значај RAG у преузимању и обради података.

  • Подесите RAG апликацију и повежете своје податке са LLM-ом.

  • Ефективно интегришете RAG и векторске базе података у LLM апликације.

Наш сценарио: унапређење наших LLM-ова сопственим подацима

За ову лекцију желимо да додамо своје белешке у образовни стартап, што омогућава чатботу да добије више информација о различитим предметима. Коришћењем белешки које имамо, ученици ће моћи боље да уче и разумеју различите теме, олакшавајући им припрему за испите. За креирање нашег сценарија користићемо:

  • Azure OpenAI: LLM који ћемо користити за креирање нашег чатбота

  • Лекцију за почетнике у AI о неуронским мрежама: ово ће бити подаци на којима ћемо повезати наш LLM

  • Azure AI Search и Azure Cosmos DB: векторска база података за чување података и креирање индекса претраге

Корисници ће моћи да направе практичне квизове из белешки, карата за преглед и сумирања у концизне прегледе. Да почнемо, хајде да видимо шта је RAG и како функционише:

Retrieval Augmented Generation (RAG)

LLM-покретањи чатбот обрађује корисничке упите како би генерисао одговоре. Дизајниран је да буде интерактиван и да комуницира с корисницима о широком спектру тема. Међутим, његови одговори су ограничени контекстом који му је дат и основним подацима којима је трениран. На пример, GPT-4 има ограничење знања до септембра 2021, што значи да нема знање о догађајима који су се десили после тог периода. Поред тога, подаци који су коришћени за тренирање LLM изузимају поверљиве информације као што су личне белешке или приручници компаније.

Како RAG (Retrieval Augmented Generation) функционише

цртеж који показује како RAG функционише

Претпоставимо да желите да имплементирате чатбот који прави квизове из ваших белешки, потребна вам је веза са базом знања. Ту RAG долази у помоћ. RAG функционише на следећи начин:

  • База знања: Пре него што се приступи, документи морају да се учитају и претпроцесују, обично разбијајући велике документе на мање делове, претварајући их у ембеддинг текста и чувајући их у бази података.

  • Кориснички упит: корисник поставља питање

  • Претрага: Када корисник постави питање, модел ембеддинга преузима релевантне информације из базе знања како би обезбедио више контекста који ће бити унет у упит.

  • Проширена генерација: LLM побољшава свој одговор на основу преузетих података. Омогућава да генерисани одговор не буде заснован само на претходно обученим подацима већ и на релевантним информацијама из додатог контекста. Преузети подаци се користе за обогаћивање одговора LLM-а. Затим LLM враћа одговор на корисниково питање.

цртеж који приказује архитектуру RAG

Архитектура RAG-а се имплементира помоћу трансформера који се састоји из два дела: енкодера и декодера. На пример, када корисник постави питање, улазни текст се "енкодира" у векторе који хватају значење речи, а вектори се "декодирају" у наш индекс докумената и генеришу нови текст базиран на упиту корисника. LLM користи модел енкодер-декодер за генерисање излаза.

Постоје два приступа за имплементацију RAG-а према предложеном раду: Retrieval-Augmented Generation for Knowledge intensive NLP (natural language processing software) Tasks:

  • RAG-Sequence користи преузете документе како би предвидео најбољи могући одговор на кориснички упит

  • RAG-Token користи документе за генерисање следећег токена, затим их преузима да одговори на кориснички упит

Зашто користити RAG?

  • Богатство информација: осигурава да текстуални одговори буду ажурни и тренутни. Побољшава перформансе на задацима специфичним за одређену област приступањем интерној бази знања.

  • Смањује фабрикацију коришћењем проверљивих података у бази знања како би се обезбедио контекст корисничким упитима.

  • Више је исплатива јер је економичнија у поређењу са фајн-тјунингом LLM-а

Креирање базе знања

Наша апликација се базира на нашим личним подацима, односно лекцији о неуронским мрежама у курикулуму AI за почетнике.

Векторске базе података

Векторска база података, за разлику од традиционалних база, је специјализована база намењена за чување, управљање и претрагу уграђених вектора. Чува нумеричке репрезентације докумената. Разбијање података на нумеричке ембеддинге олакшава нашем AI систему да разуме и обради податке.

Чувамо своје ембеддинге у векторским базама јер LLM има ограничење броја токена које прима као улаз. Пошто не можете проследити целокупне ембеддинге у LLM, морамо их разложити на делове, а када корисник постави питање, ембеддинзи најсличнији том питању ће бити враћени заједно са упитом. Разлагање на делове такође смањује трошкове у погледу броја токена послатих кроз LLM.

Неки од популарних векторских база података укључују Azure Cosmos DB, Clarifyai, Pinecone, Chromadb, ScaNN, Qdrant и DeepLake. Можете креирати модел Azure Cosmos DB користећи Azure CLI уз следећу команду:

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, ada-002 од OpenAI-а, Azure Computer Vision и многе друге. Избор модела зависи од језика који користите, типа садржаја који се кодира (текст/слике/аудио), величине уноса који модел може кодирати и дужине ембеддинг излаза.

Пример уграђеног текста користећи OpenAI модел text-embedding-ada-002 је: ембеддинг речи "мачка"

Претраживање и векторска претрага

Када корисник постави питање, претраживач го трансформише у вектор користећи енкодер упита, затим претражује индекс докумената за релевантне векторе у документу који су повезани са уносом. Када то заврши, претвара и улазни вектор и документе у текст и прослеђује их LLM-у.

Претрага

Претрага се одвија када систем покуша брзо да пронађе документе у индексу који задовољавају критеријуме претраге. Циљ претраживача је да добије документе који ће се користити за обезбеђивање контекста и везивање LLM-а за ваше податке.

Постоји неколико начина да се изврши претрага у нашој бази података као што су:

  • Претрага по кључним речима - користи се за претрагу текста

  • Векторска претрага - конвертује документе из текста у векторске репрезентације користећи моделе ембеддинга, омогућавајући семантичку претрагу користећи значење речи. Претрага се врши упитивањем докумената чије су векторске репрезентације најближе корисничком питању.

  • Хибридна - комбинација претраге по кључним речима и векторске претраге.

Изазов при претрази настаје када у бази нема сличног одговора на упит, систем ће онда вратити најбоље информације које може пронаћи, међутим, можете користити тактике као што су подешавање максималне удаљености за релевантност или користити хибридну претрагу која комбинује претрагу по кључним речима и векторску претрагу. У овој лекцији ћемо користити хибридну претрагу, комбинацију обе ове врсте претраге. Чуваћемо податке у DataFrame-у са колонама које садрже делове као и ембеддинге.

Векторска сличност

Претраживач ће претраживати базу знања за ембеддинге који су блиски један другом, најближи сусед, јер су то слични текстови. У сценарију где корисник поставља упит, најпре се убацује у вектор, затим се поклапа са сличним ембеддингима. Уобичајена мера која се користи за процену колико су вектори слични је косинусна сличност која се заснива на углу између два вектора.

Сличност можемо мерити и другим алтернативама као што су Еуклидска удаљеност која представља праву линију између крајњих тачака вектора и унутрашњи производ (dot product) који мери суму производа одговарајућих елемената два вектора.

Индекс претраге

При претрази, морамо изградити индекс претраге за нашу базу знања пре него што извршимо претрагу. Индекс ће чувати наше ембеддинге и може брзо да пронађе најсличније делове чак и у великој бази. Индекс можемо направити локално користећи:

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), можете направити:

  • Направите front-end за апликацију користећи фрејмворк који изаберете

  • Користите неки од фрејмворка, било LangChain или Semantic Kernel, и поново креирајте своју апликацију.

Честитамо вам на завршетку лекције 👏.

Учење не престаје овде, наставите путовање

Након завршетка ове лекције, погледајте нашу Generative AI Learning collection да бисте наставили да унапређујете своје знање о генеративној вештачкој интелигенцији!


Одрицање од одговорности: Овај документ је преведен коришћењем АИ услуге за превођење Co-op Translator. Иако стремимо ка тачности, имајте у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом језику сматра се ауторитетним извором. За критичне информације препоручује се професионални људски превод. Нисмо одговорни за било каква неспоразума или погрешне тумачења настала коришћењем овог превода.