Эй! Я Диана. Я стажер-архитектор решений в AWS (Торонто). Вот как я создал Slack-Bot-Rag, Slack-бот, который предоставляет механизм, который может обучать собственные данные клиентов/предприятий с помощью извлечения данных по требованию, интегрируя поисковое дополненное поколение (RAG) с большими языковыми моделями (LLM). в интерфейсе Slack.

Проблемы GenAI для крупных предприятий

ГенИИ процветает, и мы все это чувствуем. Неудивительно, что крупные предприятия хотят включить его возможности в свои внутренние документы, но общедоступные программы LLM, такие как ChatGPT, сталкиваются со своими проблемами.

  • Текущие общедоступные LLM обучаются на большом массиве данных, но их источники данных ограничены и устарели.
  • Большая часть информации, которую хранят предприятия, также является частной и рассеянной по разным источникам (SharePoints, Confluence, корзины S3 и т. д.).
  • Поскольку LLM не обучены работе с данными, специфичными для предметной области, у него более высокая вероятность галлюцинаций, когда ему задают вопросы, выходящие за рамки данных, которые он обучал.
  • LLM имеют ограничения на максимальное количество слов для ввода, что может повлечь за собой высокие затраты и повлиять на его точность.

Решая эти технические проблемы, я также хотел посмотреть, сможет ли мой Slack-Bot-Rag решить любые бизнес-проблемы на этом пути.

Во-первых, как я могу ускорить процесс поиска информации нашими сотрудниками?

На протяжении всей моей стажировки у меня была возможность общаться со многими профессионалами на таких должностях, как архитекторы решений (SA), менеджеры технических программ (TPM), инженеры по разработке программного обеспечения (SDE) и другие в этой исключительно динамичной отрасли. По мнению этих экспертов, полагаться исключительно на поиск в Интернете может не соответствовать требуемым требованиям скорости и полноты. Установленная норма предполагает использование как внутренних, так и внешних корпоративных ресурсов, таких как интранет AWS или блоги AWS, для проведения тщательного исследования. Тем не менее, анализ обширного массива документов может отнимать у них много времени и жизненных сил, особенно когда они вынуждены понимать содержание в такой степени, которая позволяет им эффективно сообщать сложные детали клиентам, которые часто полагаются на них как на надежный источник.

Так что давайте подойдем к этому с умом. Вместо того, чтобы искать информацию в разных местах, как мне собрать их в одном месте, к которому каждый сможет обратиться?

Slack — очень распространенный и популярный инструмент общения в AWS/Amazon и других крупных корпорациях.

Может быть, вместо этого я смогу интегрировать возможности ChatGPT, обученные на материалах AWS, в платформу Slack?

Мы все знаем, что ИИ может понять, осмыслить и дать ответ, который бесконечно быстрее, чем люди. Как только мы соберем всю информацию в одном месте, следующий вопрос:

Как я могу запросить всю эту информацию, используя естественный язык?

Наконец, LLM взимают плату в зависимости от количества токенов, которые он принимает. Вместо того, чтобы загружать его тысячами корпоративных документов, как я могу сделать этот процесс более экономичным?

ИСПОЛЬЗОВАНИЕ RAG+LLM в качестве решения

Поисковая дополненная генерация (RAG) — это метод извлечения данных за пределами базовой модели для дополнения подсказок путем внедрения соответствующих извлеченных данных в контекст.

RAG извлекает наиболее релевантную информацию из базы знаний или контента предприятия на основе запроса пользователя и объединяет ее в качестве контекста вместе с запросом пользователя в виде подсказки.
Получение контента — это важнейший шаг в разработке эффективной RAG, позволяющей гарантировать, что LLM получает наиболее актуальный и краткий контекст из корпоративного контента для генерации точных ответов.
Этот контекст затем отправляется в модель большого языка. (LLM) для генерации ответа.

RAG сможет извлекать наиболее актуальную информацию из базы знаний предприятия и объединять ее в контекст вместе с запросом пользователя в виде подсказки. Затем LLM прочитает приглашение, чтобы сгенерировать ответ.

Я использовал Кендру для поисковой дополненной генерации, потому что

  • Кендра автоматически выполняет встраивание слов, разбиение документов на фрагменты и другие сложности более низкого уровня, обычно необходимые для реализации RAG.
  • У Кендры есть готовые коннекторы для S3, SharePoint, Confluence и веб-сайтов.
  • Kendra поддерживает неструктурированные данные, такие как HTML, Word, PowerPoint, PDF, Excel и текстовые файлы.

Использование Langchain для RAG+LLM

Я использовал Langchain, инструмент оркестрации подсказок, чтобы связать вместе свои LLM (OpenAI) и RAG (Kendra).

Цепочки позволяют нам объединять несколько компонентов вместе для создания единого связного приложения.

Давайте посмотрим, что происходит, когда я задаю вопрос: «Я спрашивал о Кендре?» к моему Slack-Bot-Rag.

Весь зеленый текст здесь является подсказкой. Подсказка считывается из истории чата (из DynamoDB), инструктирует LLM о том, как ему следует генерировать ответ, и связывает связанные отрывки Кендры в цепочку.

Slack-Bot-Rag

Мой Slack-Bot-Rag будет содержать персонализированную информацию в рамках ограничений знаний, содержащихся в документах для конкретного приложения. Он сможет понимать, извлекать и отвечать на вопросы, связанные с этой конкретной областью, и является более экономичным.

ДЕМО

В этой демонстрации сравнивается текущая модель ChatGPT и мой Slack-Bot-Rag, который был обучен на частных, собственных данных. Эта демонстрация продемонстрирует, что мой Slack-Bot-Rag сможет понимать, извлекать и отвечать на вопросы, которые не может ChatGPT.

ЧатGPT

Slack-Bot-RAG

Архитектура

  1. Пользователь делает запрос к Slack Bot
  2. API Gateway вызовет Reader Lambda, который загрузит вопрос в DynamoDB (для хранения истории сообщений) и в очередь FIFO (где он будет вызван Writer Lambda).
  3. Writer Lambda выдает поисковый запрос к индексу Amazon Kendra на основе запроса пользователя.
  4. Индекс возвращает результаты поиска с выдержками из соответствующих документов из полученных данных предприятия.
  5. Writer Lambda отправляет пользовательский запрос вместе с данными, полученными из индекса (от Кендры) и историей чата в качестве контекста в приглашении LLM.
  6. Ответ LLM будет отправлен обратно в Slack.

Обзор кода ключа

Давайте немного углубимся в код: https://github.com/dianachung00/langchain-aws-template/tree/kendra-integ-for-production

В файле Chain.py подробно описан механизм взаимодействия Кендры (RAG) и OpenAI (LLM) для генерации ответа.

Давайте импортируем LangChain и OpenAI для LLM и вставим приглашение.

from langchain.memory import ConversationBufferMemory, DynamoDBChatMessageHistory
from langchain.retrievers import AmazonKendraRetriever
from langchain.chains import ConversationalRetrievalChain  

# <Insert Prompt>
prompt_template = """
    The following is a friendly conversation between a human and an AI. 
    The AI is talkative and provides lots of specific details from its context.
    If the AI does not know the answer to a question, it truthfully says it 
    does not know.
    {context}
    Instruction: Based on the above documents, provide a detailed answer for {question} Answer "don't know" 
    if not present in the document. 
    Solution:"""
    PROMPT = PromptTemplate(
        template=prompt_template, input_variables=["context", "question"]
    )

    condense_qa_template = """

    Chat History:
    {chat_history}
    Follow Up Input: {question}
    Standalone question:"""
    standalone_question_prompt = PromptTemplate.from_template(condense_qa_template)First, we need a retriever! I have copied my Kendra IndexID as my retriever

И теперь нам нужен ретривер! Я скопировал свой индексный идентификатор Кендры в качестве своего ретривера (хранится в средах).

Цепочка ConversationalRetrievalQA основывается на RetrievalQAChain и обеспечивает компонент истории чата.

ConversationalRetrievalQA объединит запрос пользователя + историю чата, найдет соответствующие документы у получателя и, наконец, передаст эти документы и вопрос в цепочку ответов на вопросы для возврата ответа.

#Setting Amazon Kendra as the Retriever (RAG)
retriever = AmazonKendraRetriever(index_id=kendra_index_id)

llm = ChatOpenAI(temperature=0, openai_api_key=api_key)
    conversation = ConversationalRetrievalChain.from_llm(
        llm=llm, 
        retriever=retriever,
        return_source_documents=True, 
        condense_question_prompt=standalone_question_prompt, 
        verbose=True, 
        combine_docs_chain_kwargs={"prompt":PROMPT} 
)

Бизнес-результат

  1. Сокращение времени и затрат
  • Нет необходимости загружать другое стороннее приложение
  • Легкий доступ для сотрудников предприятия через Slack.
  • Метод RAG (обобщенные данные) → меньше токенов → экономически выгодно на LLM

2. Данные, настроенные для предприятия

  • Slack-Bot-Rag предотвращает галлюцинации в ответах
  • Персонализированная информация в рамках ограничений знаний конкретных областей

3. Новый отраслевой пример RAG + LLM

Все технологии, которые я использовал в своем проекте, относительно новые (Лангчейн и Кендра). На данный момент существует также очень ограниченное количество действующих отраслевых примеров, демонстрирующих внедрение RAG с LLM. Я надеюсь, что мой проект сможет оказать какое-то влияние на частных лиц и предприятия, ищущих аналогичные решения.

ЗАКЛЮЧЕНИЕ И РЕСУРСЫ

Над моим Slack-Bot-Rag работали в течение 12 недель во время моей стажировки в AWS SA. Подробнее о моем опыте стажировки и итоговой презентации можно посмотреть здесь: https://pitch.com/public/7cc6d755-6949-454e-a5da-9e94b29f11db

Вы также можете клонировать мой репозиторий здесь: https://github.com/dianachung00/langchain-aws-template/tree/kendra-integ-for-production

Удачи в строительстве!

На данный момент я буду работать над улучшением своего чат-бота, чтобы его можно было

  • Полностью разговорный (укажите источники ответов)
  • Добавьте поддержку нескольких LLM и исходных документов, чтобы пользователь мог сравнивать результаты.
  • Измените CDK с включенной/загружаемой интеграцией Kendra.
  • Добавьте уровни безопасности, мониторинга и аутентификации пользователей для готовности к работе.