Докато продължаваме да разработваме NomNom, нашия интелигентен чатбот за рецепти, ние сме развълнувани да споделим някои от техническите детайли зад неговата реализация. В основата си NomNom комбинира напреднали техники за Обработка на естествен език (NLP) с надежден RDF-базиран граф на знанието, за да предостави безпроблемно, разговорно изживяване при търсене на рецепти.
NLP конвейерът: От потребителски вход до структурирана заявка#
Нашият NLP конвейер е проектиран да трансформира естествените езикови потребителски заявки в структурирани представяния, които могат да бъдат използвани за заявки към нашия RDF граф на знанието. Ето разбивка на ключовите компоненти:
Токенизация: Използваме Natural Language Toolkit (NLTK) за Python, за да разбием потребителския вход на отделни токени. Тази стъпка е от решаващо значение за по-нататъшна обработка.
Маркиране на частите на речта: Прилагаме маркера за части на речта на NLTK, за да идентифицираме граматическата роля на всяка дума в заявката. Това помага за разбирането на структурата на потребителската заявка.
Разпознаване на именувани обекти (NER): Разработихме персонализиран NER модел, използвайки Stanford NER и допълнителни данни за обучение, специфични за кулинарната област. Това ни позволява да идентифицираме съставки, методи за готвене, кухни и други релевантни обекти в потребителската заявка.
Анализ на зависимостите: Използваме Stanford Parser, за да разберем връзките между различните части на заявката, което е особено полезно за сложни заявки.
Класификация на намеренията: Реализирахме модел за многокласова класификация, използвайки scikit-learn, за да категоризираме потребителските заявки в намерения като търсене на рецепти, хранителни запитвания или обяснение на техники за готвене.
Генериране на заявки: Въз основа на извлечените обекти, идентифицираното намерение и анализираната структура, ние генерираме SPARQL заявка, която може да бъде изпълнена срещу нашия RDF граф на знанието.
RDF граф на знанието: Мозъкът на NomNom#
Нашият RDF граф на знанието е изграден и управляван с помощта на рамката Apache Jena. Ето как сме структурирали и реализирали този ключов компонент:
Дизайн на онтологията: Разработихме персонализирана OWL онтология, която дефинира класове и свойства за рецепти, съставки, методи за готвене, хранителна информация и др. Тази онтология служи като схема за нашия граф на знанието.
Въвеждане на данни: Създадохме Python скриптове, които трансформират данни за рецепти от различни източници (уебсайтове, готварски книги, потребителски предложения) в RDF тройки, съответстващи на нашата онтология.
Хранилище на тройки: Използваме Apache Jena TDB като наше хранилище на тройки, което осигурява ефективно съхранение и заявки на RDF данни.
SPARQL крайна точка: Настроихме Fuseki сървър, за да осигурим SPARQL крайна точка, позволяваща на нашата NLP система да прави заявки към графа на знанието.
Машина за извод: Използваме вградените възможности за извод на Jena, за да извлечем допълнителни факти и връзки, подобрявайки богатството на нашия граф на знанието.
Свързване на NLP и RDF: Изпълнение на заявки и генериране на отговори#
След като имаме SPARQL заявка, генерирана от потребителския вход, процесът продължава както следва:
Изпълнение на заявката: SPARQL заявката се изпраща към нашия Fuseki сървър и се изпълнява срещу RDF графа на знанието.
Обработка на резултатите: Резултатите от заявката, върнати като RDF, се обработват и трансформират в по-използваем формат за нашата система за генериране на отговори.
Генериране на отговори: Използваме система, базирана на шаблони, реализирана в Python, за да генерираме отговори на естествен език въз основа на резултатите от заявката и първоначалното намерение на потребителя.
Управление на диалога: Проста машина на състоянията следи контекста на разговора, позволявайки последващи въпроси и уточнения.
Предизвикателства и решения#
Разработването на NomNom не беше без предизвикателства. Ето няколко, с които се сблъскахме и как ги адресирахме:
Сложност на заявките: Някои потребителски заявки могат да бъдат доста сложни. Реализирахме система за декомпозиция на заявки, която разбива сложните заявки на по-прости подзаявки.
Разрешаване на двусмислености: Кулинарните термини често могат да бъдат двусмислени. Използваме комбинация от анализ на контекста и подкани за уточнение от потребителя, за да разрешим двусмислености.
Оптимизация на производителността: С нарастването на нашия граф на знанието, производителността на заявките може да бъде засегната. Реализирахме механизми за кеширане и техники за оптимизация на заявки, за да поддържаме отзивчивост.
Многоезична поддръжка: За да обслужваме глобална аудитория, работим върху разширяване на нашия NLP конвейер, за да поддържа множество езици, започвайки с испански и френски.
Бъдещи технически подобрения#
Докато гледаме към бъдещето, ние сме развълнувани от няколко технически подобрения в нашата пътна карта:
Дълбоко обучение за NLP: Изследваме използването на модели за дълбоко обучение, особено LSTM мрежи, за да подобрим нашите NLP възможности.
Разпределен граф на знанието: За да се справим с нарастващите обеми данни, разглеждаме разпределени RDF решения за съхранение като Apache Rya.
Интеграция на данни в реално време: Разработваме система за динамично актуализиране на нашия граф на знанието с нови рецепти и съдържание, генерирано от потребителите.
Семантично разсъждение: Планираме да използваме по-напреднали възможности за семантично разсъждение, за да предоставим още по-интелигентни препоръки за рецепти и замени.
NomNom представлява вълнуващо пресичане на NLP, семантични уеб технологии и изкуствен интелект. Чрез комбиниране на тези авангардни технологии, ние създаваме чатбот, който не само разбира рецепти, но може да води смислени кулинарни разговори с потребителите.
Очаквайте още технически задълбочени анализи, докато продължаваме да подобряваме и разширяваме възможностите на NomNom!