Повышение понимания документов с помощью LangChain и OpenAI

Улучшение усвоения документов с помощью LangChain и OpenAI

Изображение, сгенерированное с помощью DAAL-E

С огромным ростом в генеративном искусственном интеллекте и моделях языка, которые способны воспринимать и извлекать информацию из документов, мы видим новую эру, в которой машины, такие как GPT, помогают людям в лучшем извлечении, интерпретации и извлечении знаний.

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

Шаг 0: Настройка окружения

Для целей этой статьи мы будем использовать Jupyter Notebook и OpenAI API.

Вот модули, которые нам понадобятся для этого руководства.

pip install openai tiktoken chromadb langchain BeautifulSoup4

Нам также потребуются учетные данные API OpenAI

import osos.environ["OPENAI_API_KEY"] = "sk-xxxx"

После этого приступим.

Шаг 1: Получение содержимого документа

Мы будем использовать статью из блога Berkeley Artificial Intelligence Research https://bair.berkeley.edu/blog/2023/07/14/ddpo/

LangChain предоставляет удобный способ чтения данных из веб-URL и преобразования их

Шаг 2: Преобразование документов в фиксированные части

После получения содержимого документа следующим шагом является преобразование его в части фиксированного размера, чтобы текст соответствовал контекстному окну заданной модели. Мы будем использовать RecursiveCharacterTextSplitter с размером части 500.

from langchain.text_splitter import RecursiveCharacterTextSplittertext_splitter = RecursiveCharacterTextSplitter(chunk_size = 500, chunk_overlap = 0)all_splits = text_splitter.split_documents(data)print(all_splits[0])print(all_splits[1])> page_content='Обучение моделей диффузии с помощью обучения с подкреплением - блог по искусственному интеллекту Беркли\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nПодписаться\nО блоге\nАрхив\nBAIR\n\n\n\n\n\n\n\n\nОбучение моделей диффузии с помощью обучения с подкреплением\n\nКевин Блэк \xa0\xa0\n  \n  \n  Jul 14, 2023\n  \n  \n\n\n\n\n\n\n\n\n\n\nОбучение моделей диффузии с помощью обучения с подкреплением\n\n\n\n\n\n\nвидеоповтора' metadata={'source': 'https://bair.berkeley.edu/blog/2023/07/14/ddpo/', 'title': 'Обучение моделей диффузии с использованием обучения с подкреплением - блог по искусственному интеллекту Беркли', 'description': 'Блог BAIR', 'language': 'Язык не обнаружен.'}page_content='Модели диффузии недавно стали стандартом для генерации сложных многомерных выходных данных. Вы, возможно, слышали о них благодаря их способности создавать потрясающее искусство и гиперреалистичные синтетические изображения, но только выяснилось, что они имеют успех и в других областях, таких как разработка лекарств и непрерывное управление. Основная идея моделей диффузии - итеративное преобразование случайного шума в образец, такой как изображение или структура белка. Эта идея обычно мотивируется как максимальное правдоподобие' metadata={'source': 'https://bair.berkeley.edu/blog/2023/07/14/ddpo/', 'title': 'Обучение моделей диффузии с использованием обучения с подкреплением - блог по искусственному интеллекту Беркли', 'description': 'Блог BAIR', 'language': 'Язык не обнаружен.'}

Шаг 3: Хранение частей документов с использованием векторного хранилища

После разбиения документа на части следующим шагом является создание вложений для текста и сохранение их в векторное хранилище. Мы можем сделать это, как показано ниже.

from langchain.embeddings import OpenAIEmbeddingsfrom langchain.vectorstores import Chromavectorstore = Chroma.from_documents(documents=all_splits, embedding=OpenAIEmbeddings())retriever = vectorstore.as_retriever()

Шаг 4: Получение похожих документов на основе запроса

После создания вложений для текста мы можем получить соответствующие части документа для запроса, используя векторный поиск похожести.

question = "Какие шаги используются для алгоритма DDPO?"docs = vectorstore.similarity_search(question)print(f"Получено {len(docs)} документов")print(docs[0].page_content)> Получено 4 документа Основной идеей нашего алгоритма, который мы называем оптимизацией политики диффузии с шумоподавлением (DDPO), является то, что мы можем лучше максимизировать вознаграждение конечного образца, если обратим внимание на всю последовательность шагов шумоподавления, которые привели нас к результату. Для этого мы переформулируем процесс диффузии в виде многократного процесса принятия решений Маркова (MDP). На терминологии MDP: каждый шаг шумоподавления является действием, и агент получает вознаграждение только на последнем шаге каждой траектории шумоподавления, когда производится конечный образец.

Шаг 5: Генерация ответа с использованием переработанных документов

Теперь, когда у нас есть сжатые документы для нашего запроса, мы можем создать цепочку LLM, чтобы сформулировать ответ на наш запрос на основе предоставленного контекста извлекателя vectorstore. Мы сгенерируем подсказку, которая указывает LLM ответить на запрос, и укажем фиксированное сообщение в случае неопределенности.

от langchain.prompts импортируйте PromptTemplatetemplate = """Используйте следующие контекстные фрагменты, чтобы ответить на вопрос в конце. Если не знаете ответа, просто скажите, что не знаете, не пытайтесь придумать ответ. Объясните ответ не более чем в 3 предложениях. Будьте кратки. В конце ответа всегда говорите "Готово!". {context}Вопрос: {question}Ответ:"""prompt = PromptTemplate.from_template(template)

С помощью этой подсказки мы создадим цепочку LLM вот так:

из langchain.schema.runnable импортируйте RunnablePassthrough из langchain.chat_models импортируйте ChatOpenAIllm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)qa_chain = (    {"context": retriever, "question": RunnablePassthrough()}     | prompt     | llm )

В коде выше у нас есть несколько новых терминов – RunnablePassThrough. Это протокол, который упрощает создание пользовательских цепочек LLM, позволяя нам соединять компоненты, как мы сделали выше.

Теперь мы можем использовать нашу цепочку LLM для ответа на запрос.

qa_chain.invoke("Какие шаги используются в алгоритме DDPO?").content> 'Алгоритм DDPO использует последовательность шагов денойзинга для максимизации вознаграждения финального образца. Каждый шаг денойзинга рассматривается как действие в многократном марковском процессе принятия решений (MDP). Агент получает вознаграждение только на последнем шаге каждой траектории денойзинга, когда производится финальный образец. Готово!'qa_chain.invoke("Основная идея, рассмотренная в статье?").content> 'Основная идея, рассмотренная в статье - проблема избыточной оптимизации и необходимость в универсальном методе для предотвращения ее. Готово!'

Полный код для блокнота Python можно найти здесь.

Таким образом, у нас есть функциональная система, которую мы можем легко использовать для помощи в интерпретации и понимании документов.

Если вас заинтриговало, что еще можно сделать с помощью замечательных возможностей генеративного искусственного интеллекта и LangChain, оставайтесь с нами, и мы рассмотрим несколько других случаев использования в предстоящих статьях.