Zmagasz się z AI lub rozwojem full-stack? Nasi eksperci są tutaj, aby Cię poprowadzić: dostosowane porady, integracja techniczna i nie tylko. Skontaktuj się z nami pod adresem [email protected].

RAG: Odpowiadanie na pytania na podstawie wiedzy o domenie z wyszukiwaniem semantycznym i generatywną sztuczną inteligencją

Odpowiadanie na pytania oparte na wiedzy dziedzinowej (takiej jak dokumentacja wewnętrzna, umowy, książki itp.) stanowi wyzwanie. W tym artykule badamy zaawansowaną technikę o nazwie Retrieval-Augmented Generation (RAG), aby osiągnąć to z dużą dokładnością, łącząc wyszukiwanie semantyczne i generowanie tekstu z modelami takimi jak ChatDolphin, LLaMA, ChatGPT, GPT-4....

Odpowiadanie na pytania

Wyzwania związane z odpowiadaniem na pytania dotyczące wiedzy o domenie

Odpowiadanie na pytania na podstawie wiedzy o domenie wymaga najpierw wysłania pewnego kontekstu do modelu sztucznej inteligencji, a następnie zadania pytania na jego temat.

Na przykład można wysłać następujący kontekst:

All NLP Cloud plans can be stopped anytime. You only pay for the time you used the service. In case of a downgrade, you will get a discount on your next invoice.

Teraz warto zadać sobie następujące pytanie:

When can plans be stopped?

Sztuczna inteligencja odpowiedziałaby mniej więcej tak:

Anytime

Aby uzyskać więcej informacji, zapoznaj się z naszą dokumentacją dotyczącą odpowiadania na pytania tutaj.

Problem z tym podejściem polega na tym, że rozmiar kontekstu (tj. rozmiar tekstu wejściowego) jest ograniczony. Nie można więc wysłać całej wiedzy o domenie jako kontekstu.

Załóżmy, że chcesz zbudować chatbota wsparcia, który wie wszystko o dokumentacji Twojego produktu, tak aby użytkownicy końcowi mogli zadać chatbotowi dowolne pytanie związane z produktem bez konieczności kontaktowania się z prawdziwym agentem wsparcia. Najprawdopodobniej dokumentacja składa się z kilkuset lub tysięcy, a nawet milionów słów...

Przyjrzyjmy się, jak pokonać to ograniczenie i odpowiadać na pytania na bardzo dużych dokumentach.

Wyszukiwanie semantyczne VS generatywna sztuczna inteligencja

Jeśli chodzi o odpowiadanie na pytania, można zastosować 2 rodzaje technologii. Generowanie tekstu (generatywna sztuczna inteligencja) i wyszukiwanie semantyczne.

Pierwszy z nich, generowanie tekstu, jest w zasadzie tym, co właśnie pokazałem powyżej. Zwykle wykorzystuje zaawansowany model generowania tekstu, taki jak ChatDolphin, LLaMA, ChatGPT, GPT-4.... Jest on w stanie zrozumieć ludzkie pytanie i odpowiedzieć jak człowiek. Nie działa on jednak na dużych dokumentach. Dostrajanie generatywnego modelu sztucznej inteligencji za pomocą wiedzy o domenie nie zadziała dobrze, ponieważ dostrajanie nie jest dobrą techniką dodawania wiedzy do modelu.

Wyszukiwanie semantyczne polega zasadniczo na wyszukiwaniu dokumentu w taki sam sposób jak Google, ale w oparciu o własną wiedzę o domenie.

Aby to osiągnąć, należy przekonwertować dokumenty wewnętrzne na wektory (znane również jako "embeddings"). Następnie należy również przekonwertować pytanie na wektor, a następnie przeprowadzić wyszukiwanie wektorowe (znane również jako "podobieństwo semantyczne") w celu pobrania części wiedzy o domenie, która jest najbliższa pytaniu.

Pierwszym rozwiązaniem jest przechowywanie osadzeń w dedykowanej wektorowej bazie danych, takiej jak PG Vector. Innym rozwiązaniem jest zakodowanie własnego modelu wyszukiwania semantycznego przy użyciu własnej wiedzy domenowej i wdrożenie go na GPU (jest to rozwiązanie, które proponujemy w NLP Cloud, ponieważ oferuje najlepszy czas reakcji). Następnie, po przygotowaniu wektorowej bazy danych lub po utworzeniu modelu, można zadawać pytania w języku naturalnym, a model sztucznej inteligencji zwróci fragment wiedzy o domenie, który najlepiej odpowiada na pytanie.

Wyszukiwanie semantyczne jest zazwyczaj bardzo szybkie i stosunkowo tanie. Jest również bardziej niezawodne niż strategia dostrajania generowania tekstu, więc nie napotkasz żadnego problemu z halucynacjami AI. Nie jest jednak w stanie poprawnie "odpowiedzieć" na pytanie. Po prostu zwraca fragment tekstu, który zawiera odpowiedź na pytanie. Następnie użytkownik musi przeczytać cały fragment tekstu, aby znaleźć odpowiedź na swoje pytanie.

Więcej szczegółów można znaleźć w naszej dokumentacji dotyczącej wyszukiwania semantycznego tutaj.

Dobrą wiadomością jest to, że możliwe jest połączenie zarówno wyszukiwania semantycznego, jak i generatywnej sztucznej inteligencji w celu osiągnięcia zaawansowanych wyników!

Odpowiadanie na pytania łączące wyszukiwanie semantyczne i generatywną sztuczną inteligencję

Aby odpowiedzieć na pytania dotyczące wiedzy dziedzinowej, strategia, którą preferujemy w NLP Cloud, jest następująca: najpierw wyślij zapytanie za pomocą wyszukiwania semantycznego, aby pobrać zasoby, które najlepiej odpowiadają na Twoje pytanie, a następnie użyj generowania tekstu, aby odpowiedzieć na pytanie w oparciu o te zasoby, tak jak człowiek.

Załóżmy, że jesteśmy sprzedawcą drukarek HP i chcemy odpowiadać na pytania naszych klientów na naszej stronie internetowej.

Najpierw będziemy musieli obliczyć osadzenia i przechowywać je w wektorowej bazie danych lub stworzyć własny model wyszukiwania semantycznego. Tutaj będzie on składał się tylko z 3 przykładów, ale w rzeczywistości można uwzględnić do 1 miliona przykładów podczas korzystania z wyszukiwania semantycznego w NLP Cloud. Po prostu tworzymy plik CSV i umieszczamy w nim następujące dane:

HP® LaserJets have unmatched printing speed, performance and reliability that you can trust. Enjoy Low Prices and Free Shipping when you buy now online.
Every HP printer comes with at least a one-year HP commercial warranty (or HP Limited Warranty). Some models automatically benefit from a three-year warranty, which is the case of the HP Color LaserJet Plus, the HP Color LaserJet Pro, and the HP Color LaserJet Expert.
HP LaserJet ; Lowest cost per page on mono laser printing. · $319.99 ; Wireless options available. · $109.00 ; Essential management features. · $209.00.

Następnie przesyłamy nasz zestaw danych CSV do NLP Cloud i klikamy "Create model". Po chwili nasz własny model wyszukiwania semantycznego zawierający naszą własną wiedzę o domenie będzie gotowy i otrzymamy prywatny adres URL API, aby z niego korzystać.

Zadajmy pytanie naszemu nowemu modelowi przy użyciu klienta NLP Cloud Python:

import nlpcloud

# We use a fake model name and a fake API key for illustration reasons.
client = nlpcloud.Client("custom-model/5d8e6s8w5", "poigre5754gaefdsf5486gdsa56", gpu=True)
client.semantic_search("How long is the warranty on the HP Color LaserJet Pro?")

Model szybko zwraca następujące informacje z krótkim czasem reakcji:

{
"search_results": [
    {
        "score": 0.99,
        "text": "Every HP printer comes with at least a one-year HP commercial warranty (or HP Limited Warranty). Some models automatically benefit from a three-year warranty, which is the case of the HP Color LaserJet Plus, the HP Color LaserJet Pro, and the HP Color LaserJet Expert."
    },
    {
        "score": 0.74,
        "text": "All consumer PCs and printers come with a standard one-year warranty. Care packs provide an enhanced level of support and/or an extended period of coverage for your HP hardware. All commercial PCs and printers come with either a one-year or three-year warranty."
    },
    {
        "score": 0.68,
        "text": "In-warranty plan · Available in 2-, 3-, or 4-year extension plans · Includes remote problem diagnosis support and Next Business Day Exchange Service."
    },
    ]
}

Teraz pobieramy odpowiedź, która uzyskała najwyższy wynik (możemy też idealnie pobrać kilka odpowiedzi): "Every HP printer comes with at least a one-year HP commercial warranty (or HP Limited Warranty). Some models automatically benefit from a three-year warranty, which is the case of the HP Color LaserJet Plus, the HP Color LaserJet Pro, and the HP Color LaserJet Expert."

Ta odpowiedź jest poprawna, ale nie jest zbyt przyjazna dla użytkownika, ponieważ użytkownik musi przeczytać dość długi fragment tekstu, aby uzyskać odpowiedź. Teraz ponownie zadamy to samo pytanie naszemu punktowi końcowemu odpowiadającemu na pytania, używając modelu ChatDolphin. Użyjemy odpowiedzi wyszukiwania semantycznego jako kontekstu:

import nlpcloud

client = nlpcloud.Client("chatdolphin", "poigre5754gaefdsf5486gdsa56", gpu=True)
client.question(
    """How long is the warranty on the HP Color LaserJet Pro?""",
    context="""Every HP printer comes with at least a one-year HP commercial warranty (or HP Limited Warranty). Some models automatically benefit from a three-year warranty, which is the case of the HP Color LaserJet Plus, the HP Color LaserJet Pro, and the HP Color LaserJet Expert."""
)

Zwraca następującą odpowiedź:

{
    "answer": "The warranty lasts for three years."
}

Całkiem nieźle, prawda?

Wnioski

Pomimo ostatnich postępów poczynionych w zakresie generatywnych modeli sztucznej inteligencji, takich jak ChatDolphin, LLaMA, ChatGPT, GPT-4 itp., ograniczony rozmiar zapytań uniemożliwia wykorzystanie tych wspaniałych modeli na podstawie konkretnej wiedzy domenowej do odpowiadania na pytania. Dostrajanie tych modeli niestety nie działa dobrze w takim przypadku...

Dobrą strategią jest wdrożenie systemu RAG. Najpierw należy odpowiedzieć na pytanie, konwertując dokumenty na osadzenia i przechowując je w wektorowej bazie danych lub tworząc własny model wyszukiwania semantycznego z dokumentów, a następnie użyć zwykłego modelu odpowiadania na pytania opartego na generatywnej sztucznej inteligencji, aby zwrócić ludzką odpowiedź na początkowe pytanie.

Jeśli chcesz wdrożyć tę strategię, nie wahaj się stworzyć własnego modelu wyszukiwania semantycznego w NLP Cloud: Zobacz powiązaną dokumentację tutaj!

Mark
Inżynier aplikacji w NLP Cloud