Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[Стачка] Вопрос-ответные системы в облаке Yande...

[Стачка] Вопрос-ответные системы в облаке Yandex Cloud на основе продвинутого RAG и многоагентности

Dmitri Soshnikov

September 27, 2024
Tweet

More Decks by Dmitri Soshnikov

Other Decks in Programming

Transcript

  1. м Дмитрий Сошников Доцент НИУ ВШЭ/МАИ, консультант Yandex Cloud, тех.

    руководитель AI Lab ШД НИУ ВШЭ Tg: @shwarsico Вопрос-ответные системы в облаке Yandex Cloud на основе продвинутого RAG и многоагентности
  2. Full Fine-Tuning ▪ Много обучающих примеров ▪ Много ресурсов на

    обучение ▪ Изменяются веса исходной модели ▪ Получается новая языковая модель с большим числом параметров Как добавить знания в LLM? LoRA Fine-Tuning ▪ Вместо обучения всех параметров обучается «добавка» к весам, которая раскладывается на матрицы меньшей размерности ▪ Из-за меньшего количества параметров нужно меньше данных и меньше вычислительных ресурсов P-Tuning ▪ Параметры модели не меняются, но подбирается continuous prompt embedding, который помогает достичь нужных результатов ▪ Требует меньше всего вычислительных ресурсов и данных для обучения ▪ Хорошо работает на изменение формата ответа, но не знаний модели Дообучение модели 6
  3. RAG-Sequence: для генерации всей последовательности используются одни и те же

    документы RAG-Token: для генерации каждого токена могут использоваться разные документы Как добавить знания в LLM: RAG Lewis, Patrick, et al. «Retrieval-augmented generation for knowledge-intensive nlp tasks.» Advances in Neural Information Processing Systems 33 (2020): 9459-9474. Retrieval-Augmented Generation 7
  4. RAG на практике (Naïve RAG) 8 Prompt Engineering Embedding Векторная

    база данных E E E E Запрос пользователя YandexGPT API Ответ
  5. Гиперпараметры: ▪ Размер фрагмента текста ▪ Размер overlap ▪ Промпт

    ▪ Алгоритм поиска фрагментов ▪ Количество фрагментов в запросе ▪ Используемые эмбеддинги RAG на практике (Naïve RAG) 9 Prompt Engineering Embedding Векторная база данных E E E E Запрос пользователя YandexGPT API Ответ
  6. Исходные материалы Каберне́ фра́н — темный сорт винограда, один из

    древнейших мировых сортов, от которого произошли такие сорта как: «каберне совиньон», «карменер», мерло». «Фран» в названии обозначает «французский». Происхождение слова «каберне» имеет разные версии, однако подлинность их не установлена. Используется для производства красных и розовых вин, как моносортовых, так и в составе бленда из нескольких сортов. Некоторые исследования указывают на то, что предок сорта «каберне фран» завезен во Францию из Испании. Существуют отдельные указания на то, что «каберне фран» выращивали на виноградниках долины Луары еще в XIV веке. Однако чаще можно встретить версию, что этот сорт начали активно и повсеместно высаживать во Франции в XVII веке. Каберне фран часто используют для создания ассамбляжа красных вин. Процент этого сорта в составе бленда с «мерло» и «каберне совиньон» может быть как минимальным, так и достигать 50% от общего объема. Красные вина каберне фран отличаются характерным ароматом, в котором присутствуют травяные оттенки, особенно аромат зеленого перца, пряные и табачные ноты. Вкус, в зависимости от региона производства, может варьироваться от сладких ягодных оттенков малины, ежевики до пикантных нот лаврового листа, табака, графита или гравия. Розовые вина из каберне фран могут впечатлять и нежными ягодными оттенками, и выразительным ароматом свежей выпечки. Каберне фран может сопровождать выпечку с начинками из мяса, равиоли и разнообразные пасты.
  7. from langchain_chroma import Chroma from yandex_chain import YandexEmbeddings embeddings =

    YandexEmbeddings(…) db = Chroma.from_texts(wines+regions, embeddings) Индексируем with open('../source/wines.txt',encoding='utf-8') as f: wines = ''.join(f.readlines()) with open('../source/regions.txt',encoding='utf-8') as f: regions = ''.join(f.readlines()) wines = [normalize(x) for x in wines.split('-----')] regions = [normalize(x) for x in regions.split('-----')] Загружаем текстовую базу данных
  8. retriever = db.as_retriever(search_type="mmr", search_kwargs={"k": 5}) llm = YandexLLM(…, model=YandexGPTModel.Pro) prompt

    = "Пожалуйста, посмотри на текст ниже в обратных кавычках и ответь на вопрос {question}, используя информацию из этого текста. Текст: ```{context}```” prompt = langchain.prompts.PromptTemplate( template=prompt, input_variables=["context", "question"]) Создаём ретривер и шаблон промпта chain = ( {"context": retriever | join_docs, "question": RunnablePassthrough()} | prompt | llm | StrOutputParser()) chain.invoke(q) Создаём RAG-цепочку
  9. 14 Parent Retriever ▪ Разбиваем фрагменты документов на ещё более

    мелкие фрагменты ▪ Parent-Child Relationship ▪ Мелкие документы уточняют конкретные понятия, родительские — задают более крупный контекст ▪ Находим ребенка, вбрасываем в контекст родителя Продвинутые стратегии индексации Фрагмент Понятие 1 Понятие 2 14
  10. 15 Гипотетические вопросы ▪ Из фрагментов документов извлекаются вопросы, на

    которые эти фрагменты отвечают ▪ Индексируются гипотетические вопросы, вбрасываются в контекст исходные документы Продвинутые стратегии индексации Фрагмент LLM Вопрос 1 Вопрос 2 … 15
  11. "Каберне фран — это какой сорт винограда?", "Каково происхождение слова

    каберне?", "От какого сорта произошли каберне совиньон, карменер и мерло?", "Что обозначает часть «фран» в названии «каберне фран»?", "Для производства каких вин используется каберне фран?", "Какого цвета могут быть вина из каберне фран и какой у них аромат?", "Каким вкусом обладают красные вина из каберне фран в зависимости от региона производства?", "С чем можно подавать моносортовые вина из каберне фран?", "Какие блюда подходят к более лёгким винам из каберне фран?", "К каким видам мяса подходит выразительное вино каберне фран и с каким гарниром его можно подать?", "Какой соус может дополнить вкус вина каберне фран?", "Какая выпечка может сопровождать вино каберне фран?"
  12. 17 Суммаризация Индексируются суммаризованные фрагменты текста, вбрасываются в контекст исходные

    документы Продвинутые стратегии индексации Сумм Фрагмент Индекс 17
  13. Одна из проблем наивного RAG 19 Мерло Мерло хорошо сочетается

    с сыром Бри … Каберне Каберне хорошо сочетается с сыром Бри Сира Сыр Бри отлично подходит к вину сорта Сира Вопрос: Какие вина хорошо подходят к сыру Бри?
  14. 20 Различные подходы к улучшению RAG Zhao, Penghao, et al.

    «Retrieval-augmented generation for ai-generated content: A survey.» arXiv preprint arXiv:2402.19473 (2024). 20
  15. GraphRAG github.com/microsoft/graphrag 21 Edge, Darren, et al. «From local to

    global: A graph rag approach to query-focused summarization.» arXiv preprint arXiv:2404.16130 (2024) — Microsoft Research
  16. # Цель Тебе на вход даётся текстовый документ. Сначала выдели

    все сущности, которые необходимы, чтобы передать всю содержащуюся в тексте информацию и идеи. Далее, найди все связи между этими сущностями в тексте. # Шаги 1. Выдели все сущности. Для каждой найденной сущности, укажи: - entity_name: Имя сущности, заглавными буквами - entity_type: Предложи несколько категорий для сущности. Категории не должны быть конкретными, а должны быть наиболее общими. - entity_description: Подробное описание атрибутов сущности. Не используй кавычки и другие знаки препинания в имени сущности. Удаляй лишние кавычки. Выведи информацию о сущности в следующем виде (entity|<entity_name>|<entity_type>|<entity_description>) Извлечение сущностей и связей Примечания
  17. 2. Для всех сущностей, выделенных на шаге 1, выдели все

    связи, т.е. пары (исходная_сущность, целевая_сущность) которые *связаны* между собой. Для каждой пары связанных сущностей, извлеки следующую информацию: - source_entity: имя исходной сущности, как она найдена на шаге 1 - target_entity: имя целевой сущности, как она найдена на шаге 1 - relationship_name: короткое имя связи между сущностями - relationship_description: описание того, как исходная сущность и целевая сущность связаны между собой. В связах могут участвовать только сущности, выделенные на шаге 1. Выведи информацию о связях в следующем виде (relationship|<source_entity>|<target_entity>|<relationship_name>|<relationshi p_description>) 3. Выведи результат в виде списка, содержащего все сущности, найденные на шаге 1, и связи, найденные на шаге 2. Используй **перевод строки** как разделитель списка. 4. Когда закончишь, выведи [EOF] Извлечение сущностей и связей Примечания
  18. ###################### -Примеры- ###################### Текст: Борщ — горячий заправочный суп на

    основе свёклы, которая придаёт ему характерный красный цвет. В словаре В. И. Даля — род щей, похлёбка из квашеной свёклы, на говядине и свинине, или со свиным салом. Получило широкое распространение во многих национальных кухнях: это блюдо есть у русских, белорусов и др. Результат: (entity|БОРЩ|БЛЮДО|горячий заправочный суп на основе свёклы) (entity|ГОВЯДИНА|ИНГРЕДИЕНТ|Мясо коровы, входящее в состав борща) … -Реальные данные- ###################### Текст: {} Результат: Извлечение сущностей и связей Примечания
  19. (entity|Бургенланд|ПРОВИНЦИЯ| самая молодая провинция Австрии) (entity|Австрия|СТРАНА| государство в Центральной Европе)

    (relationship|Бургенланд|Австрия| ЯВЛЯЕТСЯ_ЧАСТЬЮ| Бургенланд является частью Австрии) (entity|Словения|СТРАНА| государство на Балканском полуострове) (entity|Венгрия|СТРАНА| государство в Восточной Европе) (entity|Словакия|СТРАНА| государство в Центральной Европе) (relationship|Бургенланд|Словения| ГРАНИЧИТ_С|Бургенланд граничит со Словенией) (relationship|Бургенланд|Венгрия| ГРАНИЧИТ_С|Бургенланд граничит с Венгрией) (relationship|Бургенланд|Словакия| ГРАНИТ_С|Бургенланд граничит с Словакией)
  20. ('сира', 'вашингтон’, {'label': 'адаптируется’, 'desc': 'сорт сира хорошо адаптируется к

    климату в вашингтоне’}) ('сира', 'красные вина’, {'label': 'используется для’, 'desc': 'выращивают для производства красных вин’}) ('сира', 'окленд’, { 'label': 'произрастает’, 'desc': 'сира произрастает в окленде’}) ('сира', 'сорт винограда’, { 'label': 'является’, 'desc': 'сорт сира является красным сортом винограда’}) ('вашингтон', 'сша’, { 'label': 'город_в_стране’, 'desc': 'город вашингтон…’}) Сира
  21. Сорт винограда Сира (или Шираз) является красным техническим сортом винограда,

    который выращивают для производства красных вин. Он хорошо адаптируется к климату в Вашингтоне и произрастает в Окленде. Сира относится к группе столовых вин, которые подают во время обеда или ужина. Это универсальный сорт, который подходит ко многим блюдам: из птицы с мягкими сырами, спаржей и артишоками, свинине, лисичкам и спарже с ветчиной. Красные вина, в том числе сорта Сира, производят из винограда таких сортов, как Каберне Совиньон, Мерло, Мальбек, Пино Нуар, Фер Серваду, Дурас, Сира. Что ты знаешь про сорт Сира? Примечания
  22. 28 ▪ Allemang, Dean, and Juan Sequeda. «Increasing the LLM

    Accuracy for Question Answering: Ontologies to the Rescue!.» arXiv preprint arXiv:2405.11706 (2024) ▪ Martino, Ariana, Michael Iannelli, and Coleen Truong. «Knowledge injection to counter large language model (LLM) hallucination.» European Semantic Web Conference. Cham: Springer Nature Switzerland, 2023 На стыке явного представления знаний и ML! 28
  23. <owl:Class rdf:ID="PastaWithSpicyRedSauceCourse"> <owl:intersectionOf rdf:parseType="Collection"> <owl:Class rdf:about="#MealCourse" /> <owl:Restriction> <owl:onProperty rdf:resource="#hasFood"

    /> <owl:allValuesFrom rdf:resource="#PastaWithSpicyRedSauce" /> </owl:Restriction> </owl:intersectionOf> <rdfs:subClassOf> <owl:Restriction> <owl:onProperty rdf:resource="#hasDrink" /> <owl:allValuesFrom> <owl:Restriction> <owl:onProperty rdf:resource="&vin;hasColor" /> <owl:hasValue rdf:resource="#Red" /> </owl:Restriction> </owl:allValuesFrom> </owl:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <owl:Restriction> <owl:onProperty rdf:resource="#hasDrink" /> <owl:allValuesFrom> <owl:Restriction> <owl:onProperty rdf:resource="&vin;hasBody" /> <owl:hasValue rdf:resource="#Full" /> </owl:Restriction> </owl:allValuesFrom> </owl:Restriction> </rdfs:subClassOf> Food + Wine Ontology 29 <owl:Class rdf:ID="Merlot"> <rdfs:subClassOf> <owl:Restriction> <owl:onProperty rdf:resource="#hasColor" /> <owl:hasValue rdf:resource="#Red" /> //owl:Restriction> //rdfs:subClassOf> <rdfs:subClassOf> <owl:Restriction> <owl:onProperty rdf:resource="#hasSugar" /> <owl:hasValue rdf:resource="#Dry" /> //owl:Restriction> //rdfs:subClassOf> <rdfs:subClassOf> <owl:Restriction> <owl:onProperty rdf:resource="#hasFlavor" /> <owl:allValuesFrom> <owl:Class> <owl:oneOf rdf:parseType="Collection"> <owl:Thing rdf:about="#Moderate" /> <owl:Thing rdf:about="#Delicate" /> //owl:oneOf> //owl:Class> //owl:allValuesFrom> //owl:Restriction>
  24. ▪ Что подавать к Мерло? ▪ Сколько стоит литр Мерло?

    ▪ Из какого винограда делают Мерло? Многоагентные системы Маршрутизатор LLM Онтологические рассуждения RAG 30
  25. Многоагентная система class Agent: def __call__(self, state): # do something

    return "new_namestate" class NER(Agent): def __init__(self, prompt, on_success, on_fail, labels=None): self.llm = YandexLLM(model=YandexGPTModel.Pro, **auth) … def __call__(self, state): res = self.llm.invoke(self.prompt.replace('{}',state['input'])) if res=="NONE" or res=='(NONE)': return self.on_fail # parse … state['entities'] = res return self.on_success
  26. Многоагентная система class NaiveRAG(Agent): def __init__(self,num_documents=5): self.embeddings = YandexEmbeddings(**auth) self.db

    = Chroma(embedding_function=self.embeddings) self.llm = YandexLLM(model=YandexGPTModel.Pro,**auth) self.template = langchain.prompts.PromptTemplate( template=self.prompt, input_variables=["context", "question"]) self.retriever = self.db.as_retriever( search_type="mmr", search_kwargs={"k": num_documents}) self.chain = ( {"context": self.retriever | self.join_docs, "question": RunnablePassthrough()} | self.template | self.llm | StrOutputParser()) def __call__(self, state): state['output'] = self.chain.invoke(state['input']) return 'конец' TheNaiveRAG = NaiveRAG()
  27. Работа системы Executing state: начало, state = {'input': 'Расскажи всё,

    что ты знаешь про сорт вина мерло’} Executing state: graph_rag, state = {'input': 'Расскажи всё, что ты знаешь про сорт вина мерло', 'entities': ['мерло']} Мерло — это красный сорт винограда, который выращивают в разных странах по всему миру. Вот основная информация о сорте мерло: — Происхождение: сорт мерло происходит из Франции, где он стал одним из самых популярных сортов винограда. Его впервые упомянули в регионе Либурне. —Распространение: помимо Франции, мерло выращивают в Италии, США и других странах. В США этот сорт винограда культивируют в нескольких регионах, включая калифорнию, виргинию, аустрал и другие. — Характеристики: мерло является вторым по распространённости красным виноградом в мире после сорта каберне совиньон. Ягоды имеют насыщенный тёмно-синий цвет, их мякоть сочная, а вкус сладкий и мягкий. Вино из сорта мерло ассоциируется с птицей чёрный дрозд, благодаря своему цвету.
  28. 36 ▪ Промт для YandexGPT API ▪ Zero-shot Endpoint ▪

    Few-shot Endpoint ▪ Дообучение классификатора Пример наполнения файла для обучения бинарной классификации: Классификаторы на базе YandexGPT API 36
  29. 37 Подбор вина к блюдам: Prolog foodmatch(food_Fish,hasSugar,dry). foodmatch(food_Fish,hasBody,medium). foodmatch(food_Fish,hasFlavor,_). foodmatch(food_Fish,hasColor,_).

    wine(wine_FormanCabernetSauvignon,hasBody,full). wine(wine_FormanCabernetSauvignon,hasBody,medium). wine(wine_FormanCabernetSauvignon,hasColor,red). wine(wine_FormanCabernetSauvignon,hasSugar,dry). wine(wine_FormanCabernetSauvignon,hasFlavor,moderate). wine(wine_FormanCabernetSauvignon,hasFlavor,strong). match(F,W) :- foodmatch(F,hasColor,C), wine(W,hasColor,C), foodmatch(F,hasSugar,S), wine(W,hasSugar,S), foodmatch(F,hasFlavor,U), wine(W,hasFlavor,U), foodmatch(F,hasBody,B), wine(W,hasBody,B)
  30. 38 Пример диалога Executing state: начало, state = {'input': 'Какие

    вина едят с рыбой?’} Executing state: подбор_вина, state = {'input': 'Какие вина едят с рыбой?’} Executing state: найти_вино, state = {'input': 'Какие вина едят с рыбой?', 'entities': ['Fish']} Вам подойдут следующие вина: * CorbansDryWhiteRiesling, FoxenCheninBlanc, MountadamChardonnay, StGenevieveTexasWhite, PeterMccoyChardonnay, FormanChardonnay, BancroftChardonnay, SelaksIceWine, VentanaCheninBlanc, MountadamRiesling table = { 'начало' : InputClassifier, 'подбор_вина' : FoodNER, 'найти_вино' : WineFinderAgent, 'другая_тема' : GeneralNER, 'simple_rag' : TheNaiveRAG, 'graph_rag' : TheGraphRAG }
  31. Что лучше есть с самым известным вином из Австралии? Function

    Calling Cписок возможных функций Функция LLM 40
  32. Два подхода к оркестрации MAC An LLM A1 41 M

    V A2 A1 An LLM-оркестрация (Function Calling) Ручная оркестрация …
  33. LLM вдыхают новую жизнь в теорию мультиагентных систем. За счет

    синергетичес- кого эффекта МАС позволяют улучшать результаты LLM, хотя иногда за счет существенного увеличения стоимости 42 Различные подходы к обогащению LLM с помощью внешних знаний позволяют подобрать подход, оптимальный для решения конкретной задачи Graph RAG — это движение в сторону объединения неявного (LLM) и явного (графы, онтологии, семантические сети) представления знаний, в большей интерпретируемости Мораль 01/ 01/ 02/ 03/
  34. Спасибо за внимание! Дмитрий Сошников Доцент НИУ ВШЭ/МАИ, консультант Yandex

    Cloud, тех. руководитель лаборатории ГенИИ Школы дизайна НИУ ВШЭ t.me/shwarsico