Создание базы данных QA

Эта статья является частью серии уроков по txtai, платформе семантического поиска на основе ИИ.

txtai выполняет рабочие процессы машинного обучения для преобразования данных и создания приложений семантического поиска на основе ИИ.

Разговорный ИИ — это растущая область, которая потенциально может автоматизировать большую часть индустрии обслуживания клиентов. До полной автоматизации еще далеко (большинство из нас разговаривали с автоматизированным агентом и просто хотели поговорить с человеком), но она определенно может стать надежной первой линией перед вмешательством человека.

В этой статье представлен процесс ответа на вопросы пользователей с помощью экземпляра вкраплений txtai. Это не разговорный ИИ, а поиск наиболее близкого вопроса к вопросу пользователя. Это полезно в случаях, когда есть список часто задаваемых вопросов.

Установите зависимости

Установите txtai и все зависимости.

pip install txtai datasets
Войти в полноэкранный режим Выход из полноэкранного режима

Загрузите набор данных

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

from datasets import load_dataset

ds = load_dataset("web_questions", split="train")

for row in ds.select(range(5)):
  print(row["question"], row["answers"])
Вход в полноэкранный режим Выход из полноэкранного режима
what is the name of justin bieber brother? ['Jazmyn Bieber', 'Jaxon Bieber']
what character did natalie portman play in star wars? ['Padmé Amidala']
what state does selena gomez? ['New York City']
what country is the grand bahama island in? ['Bahamas']
what kind of money to take to bahamas? ['Bahamian dollar']
Войти в полноэкранный режим Выход из полноэкранного режима

Создание индекса

Далее мы создадим индекс txtai. Индексируемым текстом будет вопрос. Мы также сохраним полное содержимое, чтобы иметь доступ к ответу во время запроса.

from txtai.embeddings import Embeddings

# Create embeddings index with content enabled. The default behavior is to only store indexed vectors.
embeddings = Embeddings({"path": "sentence-transformers/nli-mpnet-base-v2", "content": True})

# Map question to text and store content
embeddings.index([(uid, {"url": row["url"], "text": row["question"], "answer": ", ".join(row["answers"])}, None) for uid, row in enumerate(ds)])
Вход в полноэкранный режим Выход из полноэкранного режима

Задаем вопросы

Теперь, когда индекс создан, давайте зададим несколько вопросов! Мы будем использовать txtai SQL для выбора полей, которые мы хотим вернуть.

Посмотрите список заданных вопросов и наиболее подходящее сочетание «вопрос-ответ».

def question(text):
  return embeddings.search(f"select text, answer, score from txtai where similar('{text}') limit 1")

question("What is the timezone of NYC?")
Вход в полноэкранный режим Выход из полноэкранного режима
[{'answer': 'North American Eastern Time Zone',
  'score': 0.8904051184654236,
  'text': 'what time zone is new york under?'}]
Войти в полноэкранный режим Выход из полноэкранного режима
question("Things to do in New York")
Войти в полноэкранный режим Выход из полноэкранного режима
[{'answer': "Chelsea Art Museum, Brooklyn Bridge, Empire State Building, The Broadway Theatre, American Museum of Natural History, Central Park, St. Patrick's Cathedral, Japan Society of New York, FusionArts Museum, American Folk Art Museum",
  'score': 0.8308358192443848,
  'text': 'what are some places to visit in new york?'}]
Войти в полноэкранный режим Выход из полноэкранного режима
question("Microsoft founder")
Войти в полноэкранный режим Выход из полноэкранного режима
[{'answer': 'Bill Gates',
  'score': 0.6617322564125061,
  'text': 'who created microsoft windows?'}]
Войти в полноэкранный режим Выход из полноэкранного режима
question("Apple founder university")
Войти в полноэкранный режим Выход из полноэкранного режима
[{'answer': 'Reed College',
  'score': 0.5137897729873657,
  'text': 'what college did steve jobs attend?'}]
Войти в полноэкранный режим Выход из полноэкранного режима
question("What country uses the Yen?")
Войти в полноэкранный режим Выход из полноэкранного режима
{'answer': 'Japanese yen',
  'score': 0.6663530468940735,
  'text': 'what money do japanese use?'}]
Войти в полноэкранный режим Выход из полноэкранного режима
question("Show me a list of Pixar movies")
Войти в полноэкранный режим Выход из полноэкранного режима
[{'answer': "A Bug's Life, Toy Story 2, Ratatouille, Cars, Up, Toy Story, Monsters, Inc., The Incredibles, Finding Nemo, WALL-E",
  'score': 0.653051495552063,
  'text': 'what does pixar produce?'}]
Войти в полноэкранный режим Выход из полноэкранного режима
question("What is the timezone of Florida?")
Войти в полноэкранный режим Выход из полноэкранного режима
[{'answer': 'North American Eastern Time Zone',
  'score': 0.9672279357910156,
  'text': 'where is the time zone in florida?'}]
Войти в полноэкранный режим Выход из полноэкранного режима
question("Tell me an animal found offshore in Florida")
Войти в полноэкранный режим Выход из полноэкранного режима
[{'answer': 'Largemouth bass',
  'score': 0.6526554822921753,
  'text': 'what kind of fish do you catch in florida?'}]
Войти в полноэкранный режим Выход из полноэкранного режима

Не так уж плохо! В этой базе данных всего более 6 000 пар вопрос-ответ. Для улучшения качества можно было бы наложить фильтр оценки на запрос, чтобы возвращать только высокоуверенные ответы. Но это дает представление о том, что возможно.

Запуск в качестве приложения

Это также можно запустить как приложение. См. ниже.

from txtai.app import Application

# Save index
embeddings.save("questions.tar.gz")

# Build application and index data
app = Application("path: questions.tar.gz")

# Run search query
app.search("select text, answer, score from txtai where similar('Tell me an animal found offshore in Florida') limit 1")[0]
Войти в полноэкранный режим Выход из полноэкранного режима
{'answer': 'Largemouth bass',
 'score': 0.6526554822921753,
 'text': 'what kind of fish do you catch in florida?'}
Войти в полноэкранный режим Выход из полноэкранного режима

Подведение итогов

В этой статье был представлен простой сервис подбора вопросов. Она может стать основой автоматизированного агента по обслуживанию клиентов и/или онлайн FAQ.

Для полного примера смотрите codequestion — приложение, которое сопоставляет вопросы пользователей с парами вопрос-ответ на Stack Overflow.

Оцените статью
Procodings.ru
Добавить комментарий