Эй! Я Диана. Я стажер-архитектор решений в 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, позволяющей гарантировать, что 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
Архитектура
- Пользователь делает запрос к Slack Bot
- API Gateway вызовет Reader Lambda, который загрузит вопрос в DynamoDB (для хранения истории сообщений) и в очередь FIFO (где он будет вызван Writer Lambda).
- Writer Lambda выдает поисковый запрос к индексу Amazon Kendra на основе запроса пользователя.
- Индекс возвращает результаты поиска с выдержками из соответствующих документов из полученных данных предприятия.
- Writer Lambda отправляет пользовательский запрос вместе с данными, полученными из индекса (от Кендры) и историей чата в качестве контекста в приглашении LLM.
- Ответ 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 объединит запрос пользователя + историю чата, найдет соответствующие документы у получателя и, наконец, передаст эти документы и вопрос в цепочку ответов на вопросы для возврата ответа.
#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} )
Бизнес-результат
- Сокращение времени и затрат
- Нет необходимости загружать другое стороннее приложение
- Легкий доступ для сотрудников предприятия через 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.
- Добавьте уровни безопасности, мониторинга и аутентификации пользователей для готовности к работе.