Эта статья является частью серии уроков по 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.