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

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

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

В контексте обучения

До LLM выходные данные модели зависели от обученных данных. В наши дни студенты LLM обладают навыками изучения и решения новых задач, предоставляя вводные данные (подсказки) без их явного обучения. Этот навык называется обучением в контексте.

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

Сбор контекста

Чтобы собрать контекст для данного запроса, мы создаем векторные внедрения для всех данных документа. Эти данные хранятся в векторной базе данных. Мы можем использовать несколько методов машинного обучения, таких как SVM и KNN, для получения вложений, аналогичных запросу.

В нашем примере мы рассматриваем пользовательский каталог, который может содержать несколько файлов. Мы рассматриваем только несколько типов файлов (pdf, txt, md, CSV) с использованием langchain и используем модель FAISS для выполнения поиска по сходству встраивания, созданного с использованием обнимающего лица.

Faiss (поиск сходства AI в Facebook) — это библиотека для эффективного поиска по сходству и кластеризации плотных векторов. Он содержит алгоритмы поиска в наборах векторов любого размера. Faiss содержит несколько методов поиска по сходству. Предполагается, что экземпляры представлены в виде векторов и идентифицируются целым числом и что векторы можно сравнивать с расстояниями L2 (евклидовыми) или скалярными произведениями. Векторы, похожие на вектор запроса, — это те, которые имеют наименьшее расстояние L2 или наибольшее скалярное произведение с вектором запроса. Он также поддерживает косинусное сходство, поскольку это скалярное произведение нормализованных векторов.

from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceInstructEmbeddings
from langchain.vectorstores import FAISS

def get_context_faiss(query):
    search_results = db.similarity_search(query)
    context_doc = ' '.join([ doc.page_content for doc in search_results])
    return context_doc

if __name__ == "__main__":
    documents = []

    # Mention here your custom path
    path = "./test/"
    for document in ["pdf", "md", "txt", "csv"]:
        loader = DirectoryLoader(path, glob=f'*.{document}')
        documents.extend(loader.load())

    text_splitter = RecursiveCharacterTextSplitter(chunk_size = 500, chunk_overlap = 0)
    all_splits = text_splitter.split_documents(documents)

    embeddings = HuggingFaceInstructEmbeddings(
            model_name="hkunlp/instructor-large",
            model_kwargs={"device": "cpu"}
        )
    vectorstore = FAISS.from_documents(all_splits, embeddings)
    vectorstore.save_local("vector_store/faiss_index_local_data")
    db = FAISS.load_local("vector_store/faiss_index_local_data", embeddings)
    query = input("Enter your query: ")
    context = get_context_faiss(query)

Подсказка LLM

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

from transformers import T5Tokenizer, T5ForConditionalGeneration
prompt_txt = f"""{context}
Q: {query}
A: 
"""       
## In the current example we are using Flan-T5-llm to get our answers
tokenizer = T5Tokenizer.from_pretrained("google/flan-t5-xxl")
model = T5ForConditionalGeneration.from_pretrained("google/flan-t5-xxl")

input_ids = tokenizer(prompt_txt, return_tensors="pt").input_ids

outputs = model.generate(input_ids)
print(tokenizer.decode(outputs[0]))

Расширение возможностей

  1. Текущий код можно улучшить, включив в него распознавание речи. У нас есть несколько моделей с открытым исходным кодом, которые могут помочь преобразовать речь в текст в автономном режиме без каких-либо учетных данных. Следующий код использует шепот Openai для преобразования речи в текстовый преобразователь.
import speech_recognition as sr
r = sr.Recognizer()
with sr.Microphone() as source:
  print("Say something!")
  audio = r.listen(source)
query = r.recognize_whisper(audio, language="english")

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

2. Мы можем расширить возможности программы, попросив ее суммировать записанные звонки или видео. Видео преобразуются в аудио, а затем этот звук преобразуется в текст, который можно использовать для запросов.

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

Полный код этого бота можно найти здесь

Если мой пост вам интересен и вы хотите меня поддержать, купите мне кофе.

Приятного кодирования!!

Оригинально опубликовано на сайте https://vamsigutta.dev 18 августа 2023 г.