Создайте собственного чат-бота для разработки приложений вопросов и ответов из любых источников данных с использованием LangChain, OpenAI и PineconeDB.

Введение

Появление больших языковых моделей — одно из самых захватывающих технологических достижений нашего времени. Он открыл безграничные возможности в области искусственного интеллекта, предлагая решения реальных проблем в различных отраслях. Одним из наиболее интересных применений этих моделей является разработка индивидуальных вопросов-ответов или чат-ботов, которые используют как личные, так и организационные источники данных. Однако, поскольку LLM обучаются на общедоступных общедоступных данных, их ответы не всегда могут быть конкретными или полезными для конечного пользователя. Чтобы решить эту проблему, мы можем использовать такие платформы, как LangChain, для разработки собственных чат-ботов, которые дают конкретные ответы на основе наших данных. В этой статье мы узнаем, как создавать собственные приложения вопросов и ответов с развертыванием в облаке Streamlit. Итак, начнем!

(Примечание: эта статья основана на опубликованной статье об аналитике — Ссылка)

Цели обучения:

  • Узнайте, почему собственное приложение для ответов на вопросы лучше, чем тонкая настройка языковой модели.
  • Научитесь разрабатывать конвейер семантического поиска с помощью OpenAI и Pinecone.
  • Разработайте собственное приложение вопросов и ответов и разверните его в облакеstreamlit.

Оглавление:

  1. Обзор приложения «вопрос-ответ»
  2. Что такое база данных векторов сосновых шишек?
  3. Построение конвейера семантического поиска с использованием OpenAI и Pinecone
  4. Пользовательское приложение для ответов на вопросы с функцией Streamlit
  5. Заключение
  6. Часто задаваемые вопросы

Обзор приложения «вопрос-ответ»

Ответы на вопросы или «чат по вашим данным» — популярный вариант использования LLM и LangChain. LangChain предоставляет ряд компонентов для загрузки любых источников данных, которые вы можете найти для своего варианта использования. Он поддерживает огромное количество источников данных и преобразователей для преобразования в ряд строк для хранения в векторных базах данных. После того, как данные сохранены в базе данных, можно выполнить запрос к базе данных, используя компоненты, называемые ретриверами. Более того, используя LLM, мы можем получать точные ответы, как чат-боты, не манипулируя тоннами документов.

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

Рабочий процесс приложения «вопрос-ответ»

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

  1. Загрузчики документов: для загрузки пользовательских документов для векторизации и хранения.
  2. Разделители текста. Это преобразователи документов, которые преобразуют документы в фрагменты фиксированной длины для их эффективного хранения.
  3. Векторное хранилище: интеграция с векторными базами данных для хранения векторных вложений входных текстов.
  4. Поиск документов. Для получения текстов на основе запросов пользователей к базе данных. Они используют методы поиска по сходству, чтобы получить одно и то же.
  5. Вывод модели. Окончательный вывод модели для пользовательского запроса, созданный на основе входного запроса запроса и полученных текстов.

Это высокоуровневый рабочий процесс конвейера вопросов и ответов, который может решить многие типы реальных проблем. Я не углублялся в каждый компонент LangChain, но если вы хотите узнать о нем больше, прочтите мою предыдущую статью, опубликованную на Analytics Vidhya (Ссылка: Нажмите здесь)

Преимущества пользовательских вопросов и ответов перед точной настройкой модели

  1. Ответы, зависящие от контекста
  2. Адаптируется к новым входным документам
  3. Нет необходимости точно настраивать модель, что экономит затраты на обучение модели.
  4. Более точные и конкретные ответы, а не общие ответы

Что такое база данных векторов сосновых шишек?

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

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

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

# install pinecone-client
pip install pinecone-client

# import pinecone and initialize with your API key and environment name
import pinecone
pinecone.init(api_key="YOUR_API_KEY", environment="YOUR_ENVIRONMENT")

# create your first index to get started with storing vectors 
pinecone.create_index("first_index", dimension=8, metric="cosine")

# Upsert sample data (5 8-dimensional vectors)
index.upsert([
    ("A", [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]),
    ("B", [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2]),
    ("C", [0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3]),
    ("D", [0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4]),
    ("E", [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5])
])

# Use list_indexes() method to call a number of indexes available in db
pinecone.list_indexes()

[Output]>>> ['first_index']

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

Построение конвейера семантического поиска с использованием OpenAI и Pinecone

Мы узнали, что рабочий процесс подачи заявки на вопросы и ответы состоит из 5 этапов. В этом разделе мы выполним первые 4 шага: загрузчики документов, разделители текста, векторное хранилище и поиск документов.

Чтобы выполнить эти шаги в вашей локальной среде или облачной среде ноутбуков, такой как Google Colab, вам необходимо установить некоторые библиотеки и создать учетную запись в OpenAI и Pinecone, чтобы получить их ключи API соответственно. Начнем с настройки среды:

Установка необходимых библиотек

# install langchain and openai with other dependencies
!pip install --upgrade langchain openai -q
!pip install pillow==6.2.2
!pip install unstructured -q
!pip install unstructured[local-inference] -q
!pip install detectron2@git+https://github.com/facebookresearch/[email protected]#egg=detectron2 -q
!apt-get install poppler-utils
!pip install pinecone-client -q
!pip install tiktoken -q


# setup openai environment
import os
os.environ["OPENAI_API_KEY"] = "YOUR-API-KEY"

# importing libraries
import os
import openai
import pinecone
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Pinecone
from langchain.llms import OpenAI
from langchain.chains.question_answering import load_qa_chain

После завершения установки импортируйте все библиотеки, как указано в приведенном выше фрагменте кода. Затем выполните следующие шаги:

Загрузить документы

На этом этапе мы загрузим документы из каталога в качестве отправной точки для конвейера проектов ИИ. у нас есть 2 документа в нашем каталоге, которые мы загрузим в среду нашего проекта.

#load the documents from content/data dir
directory = '/content/data'

# load_docs functions to load documents using langchain function
def load_docs(directory):
  loader = DirectoryLoader(directory)
  documents = loader.load()
  return documents

documents = load_docs(directory)
len(documents)
[Output]>>> 5

Разделение текстовых данных

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

# split the docs using recursive text splitter
def split_docs(documents, chunk_size=200, chunk_overlap=20):
  text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
  docs = text_splitter.split_documents(documents)
  return docs

# split the docs
docs = split_docs(documents)
print(len(docs))
[Output]>>>12

Хранить данные в векторном хранилище

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

# embedding example on random word
embeddings = OpenAIEmbeddings()

# initiate pinecondb
pinecone.init(
    api_key="YOUR-API-KEY",
    environment="YOUR-ENV"
)

# define index name
index_name = "langchain-project"

# store the data and embeddings into pinecone index
index = Pinecone.from_documents(docs, embeddings, index_name=index_name)

Извлечение данных из базы данных векторов

На этом этапе мы получим документы с помощью семантического поиска из нашей векторной базы данных. у нас есть векторы, хранящиеся в индексе под названием “langchain-project”, и как только мы запросим то же самое, что показано ниже, мы получим большинство похожих документов из базы данных.

# An example query to our database
query = "What are the different types of pet animals are there?"

# do a similarity search and store the documents in result variable 
result = index.similarity_search(
    query,  # our search query
    k=3  # return 3 most relevant docs
)
-
--------------------------------[Output]--------------------------------------
result
[Document(page_content='Small mammals like hamsters, guinea pigs, 
and rabbits are often chosen for their
low maintenance needs. Birds offer beauty and song,
and reptiles like turtles and lizards can make intriguing pets.', 
metadata={'source': '/content/data/Different Types of Pet Animals.txt'}),
 Document(page_content='Pet animals come in all shapes and sizes, each suited 
to different lifestyles and home environments. Dogs and cats are the most 
common, known for their companionship and unique personalities. Small', 
metadata={'source': '/content/data/Different Types of Pet Animals.txt'}),
 Document(page_content='intriguing pets. Even fish, with their calming presence
, can be wonderful pets.', 
metadata={'source': '/content/data/Different Types of Pet Animals.txt'})]

Мы можем получить документы на основе поиска по сходству из векторного хранилища, как показано в приведенном выше фрагменте кода. Если вы хотите узнать больше о приложениях семантического поиска. Настоятельно рекомендую прочитать мою предыдущую статью на эту тему (ссылка: нажмите здесь)

Специальное приложение для ответов на вопросы с подсветкой

На заключительном этапе создания приложения для ответов на вопросы мы интегрируем каждый компонент рабочего процесса для создания специального приложения для вопросов и ответов, которое позволяет пользователям вводить различные источники данных, такие как веб-статьи, PDF-файлы, CSV-файлы и т. д., для общения с ним. тем самым делая их продуктивными в своей повседневной деятельности. Нам нужно создать репозиторий GitHub и добавить в него следующие файлы.

Добавляемые файлы проекта:

  1. main.py — файл Python, содержащий оптимизированный код внешнего интерфейса.
  2. qanda.py — функция быстрого проектирования и вывода модели, возвращающая ответ на запрос пользователя.
  3. utils.py — служебные функции для загрузки и разделения входных документов.
  4. vector_search.py — встраивание текста и функция хранения векторов.
  5. requirements.txt — зависимости проекта для запуска приложения в оптимизированном общедоступном облаке.

В этом демонстрационном проекте мы поддерживаем два типа источников данных:

  1. Текстовые данные на основе веб-URL
  2. Файлы PDF в Интернете

Эти два типа содержат широкий спектр текстовых данных и наиболее часто встречаются во многих случаях использования. вы можете увидеть код main.pypython ниже, чтобы понять пользовательский интерфейс приложения.

# import necessary libraries
import streamlit as st
import openai
import qanda
from vector_search import *
from utils import *
from io  import StringIO

# take openai api key in
api_key = st.sidebar.text_input("Enter your OpenAI API key:", type='password')
# open ai key
openai.api_key = str(api_key)

# header of the app
_ , col2,_ = st.columns([1,7,1])
with col2:
    col2 = st.header("Simplchat: Chat with your data")
    url = False
    query = False
    pdf = False
    data = False
    # select option based on user need
    options = st.selectbox("Select the type of data source",
                            options=['Web URL','PDF','Existing data source'])
    #ask a query based on options of data sources
    if options == 'Web URL':
        url = st.text_input("Enter the URL of the data source")
        query = st.text_input("Enter your query")
        button = st.button("Submit")
    elif options == 'PDF':
        pdf = st.text_input("Enter your PDF link here") 
        query = st.text_input("Enter your query")
        button = st.button("Submit")
    elif options == 'Existing data source':
        data= True
        query = st.text_input("Enter your query")
        button = st.button("Submit") 

# write code to get the output based on given query and data sources   
if button and url:
    with st.spinner("Updating the database..."):
        corpusData = scrape_text(url)
        encodeaddData(corpusData,url=url,pdf=False)
        st.success("Database Updated")
    with st.spinner("Finding an answer..."):
        title, res = find_k_best_match(query,2)
        context = "\n\n".join(res)
        st.expander("Context").write(context)
        prompt = qanda.prompt(context,query)
        answer = qanda.get_answer(prompt)
        st.success("Answer: "+ answer)

# write a code to get output on given query and data sources
if button and pdf:
    with st.spinner("Updating the database..."):
        corpusData = pdf_text(pdf=pdf)
        encodeaddData(corpusData,pdf=pdf,url=False)
        st.success("Database Updated")
    with st.spinner("Finding an answer..."):
        title, res = find_k_best_match(query,2)
        context = "\n\n".join(res)
        st.expander("Context").write(context)
        prompt = qanda.prompt(context,query)
        answer = qanda.get_answer(prompt)
        st.success("Answer: "+ answer)
        
if button and data:
    with st.spinner("Finding an answer..."):
        title, res = find_k_best_match(query,2)
        context = "\n\n".join(res)
        st.expander("Context").write(context)
        prompt = qanda.prompt(context,query)
        answer = qanda.get_answer(prompt)
        st.success("Answer: "+ answer)
        
        
# delete the vectors from the database
st.expander("Delete the indexes from the database")
button1 = st.button("Delete the current vectors")
if button1 == True:
    index.delete(deleteAll='true')

Чтобы проверить другие файлы кода, посетите репозиторий проекта на GitHub. (Ссылка: Нажмите здесь)

Развертывание приложения вопросов и ответов в облакеstreamlit

Streamlit предоставляет бесплатное облако сообщества для размещения приложений. Более того,streamlit прост в использовании благодаря функциям автоматизированного конвейера CI/CD. Чтобы узнать больше оstreamlit для создания приложений, посетите мою предыдущую статью, которую я написал на Analytics Vidya (ссылка: Нажмите здесь)

Заключение

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

Часто задаваемые вопросы

Вопрос 1. Что такое сосновая шишка и LangChain?

О: Pinecone — это масштабируемая база данных векторов долгосрочной памяти для хранения вложений текста для приложений на базе LLM, а LangChain — это платформа, которая позволяет разработчикам создавать приложения на основе LLM.

Вопрос 2: Каково применение ответов на вопросы НЛП?

О: Приложения для ответов на вопросы используются в чат-ботах поддержки клиентов, научных исследованиях, электронном обучении и т. д.

Вопрос 3. Почему мне следует использовать LangChain?

О:Работа с LLM может быть сложной. LangChain позволяет разработчикам использовать различные компоненты для интеграции этих LLM наиболее удобным для разработчиков способом, что позволяет быстрее доставлять продукты.

Вопрос 4. Каковы шаги по созданию приложения для вопросов и ответов?

О: Шаги по созданию приложения вопросов и ответов следующие: загрузка документа, разделение текста, векторное хранение, извлечение и вывод модели.

Вопрос 5. Что такое инструменты LangChain?

О: LangChain имеет следующие инструменты: загрузчики документов, преобразователи документов, хранилище векторов, цепочки, память и агенты.