Техники использования больших языковых моделей
Вызов функций/инструментов
В контексте GigaChain термины «вызов инструментов» и «вызов функций» взаимозаменяемы. Хотя вызов функций иногда подразумевает выполнение одной функции, при работе с GigaChain подразумевается, что все модели работают так, как будто они могут возвращать несколько вызовов инструментов или функций в каждом сообщении.
Вызов инструментов позволяет модели отвечать на заданный запрос, генерируя вывод, который соответствует заданной пользователем схеме. При этом модель не выполняет каких-то действий. Она генерирует аргументы для инструмента, а решение выполнять инструмент или нет остается за пользователем. Например, если вы хотите извлечь выходные данные, соответствующий определенной схеме из неструктурированного текста, вы можете предоставить модели инструмент для выполнения этой задачи. Такой инструмент будет принимать параметры, соответствующие нужной схеме, а результат его работы вы сможете рассматривать как итоговый.
Вызов инструмента включает название, словарь аргументов и необязательный идентификатор.
Словарь аргументов имеет структуру {argument_name: argument_value}
.
Функциональность вызова функций может отличаться в зависимости от используемой модели. Как правило, она позволяет запросам к LLM включать доступные инструменты и их схемы, а ответы могут включать вызовы этих инструментов. Например, если у модели есть доступ к инструменту поисковой системы, LLM может обработать запрос пользователя, сначала обратившись к поисковой системе.
GigaChain предоставляет стандартизированный интерфейс для вызова инструментов, который не зависит от используемой модели.
Стандартный интерфейс включает:
ChatModel.bind_tools()
— метод, который указывает, какие инструменты доступны модели для вызова.AIMessage.tool_calls
— атрибут в сообщенииAIMessage
, которое возвращает модель. Атрибут используется для доступа к вызовам инструментов, которые запрашивает модель.
Извлечение данных
В таблице представлены способы извлечения данных, которые поддерживает GigaChain. Таблица содержит столбцы:
- Название — название алгоритма извлечения.
- Тип индекса — тип индекса (если есть), на котором он основан.
- Использует LLM — использует ли этот метод извлечения LLM.
- Когда использовать — комментарии о том, когда можно использовать этот метода извлечения.
- Описание — описание того, что делает этот алгоритм извлечения.
Название | Тип индекса | Использует LLM | Когда использовать | Описание |
---|---|---|---|---|
Vectorstore | Векторное хранилище | Нет | Если вы только начинаете и ищете что-то быстрое и простое. | Самый простой метод и наиболее подходящий для начала работы. Он включает создание эмбеддингов для каждого фрагмента текста |
ParentDocument | Векторное хранилище + Хранилище документов | Нет | Если ваши страницы содержат много мелких фрагментов разной информации, которые лучше индексируются по отдельности, но лучше извлекаются вместе. | Метод включает индексирование нескольких фрагментов для каждого документа. После чего вы ищете фрагменты, которые наиболее похожи в пространстве эмбеддинга, но извлекаете и возвращаете весь родительский документ вместо отдельных фрагментов |
Multi Vector | Векторное хранилище + Хранилище документов | Иногда во время индексирования | Если вы можете извлечь из документов информацию, которую считаете более релевантной для индексирования, чем сам текст. | Метод включает создание нескольких векторов для каждого документа. Каждый вектор может быть создан множеством способов — примеры включают суммаризацию текста и гипотетические вопросы |
Self Query | Векторное хранилище | Да | Если пользователи задают вопросы, на которые лучше отвечать, извлекая документы на основе метаданных, а не на основе схожести с текстом. | Метод использует LLM для преобразования ввода пользователя в: (1) строку для семантического поиска, (2) фильтр по метаданным. Это полезно, так как часто вопросы касаются именно метаданных документов, а не самого их содержания |
Contextual Compression | Любой | Иногда | Если вы обнаруживаете, что извлеченные документы содержат слишком много нерелевантной информации и отвлекают LLM. | Метод добавляет этап постобработки поверх другого ретривера и извлекает только наиболее релевантную информацию из документов, которые вернул ретривер. Это можно сделать с помощью эмбеддингов или LLM |
Time-Weighted Vectorstore | Векторное хранилище | Нет | Если у вас есть временные метки, связанные с вашими документами, и вы хотите извлекать самые последние из них. | Метод извлекает документы на основе комбинации семантической схожести (как в обычном векторном извлечении) и актуальности (учитывая временные метки индексированных документов) |
Multi-Query Retriever | Любой | Да | Если пользователи задают сложные вопросы, требующие нескольких отдельных фрагментов информации для ответа. | Метод использует LLM для генерации нескольких запросов из исходного. Это полезно, когда исходный запрос требует фрагментов информации по нескольким темам для правильного ответа. Генерируя несколько запросов, можно затем извлечь документы для каждой из тем |
Ensemble | Любой | Нет | Если у вас есть несколько методов извлечения и вы хотите попробовать их комбинацию. | Метод извлекает документы из нескольких ретриверов и затем комбинирует их |
Разделение текста
GigaChain предлагает множество различных типов разделителей текста.
Все они содержатся в пакете gigachain-text-splitters
.
Колонки таблицы:
- Название — название разделителя текста.
- Классы — классы, которые реализуют разделитель.
- Разделяет по — как разделитель делит текст.
- Добавляет метаданные — добавляет ли этот разделитель метаданные о том, откуда взят каждый фрагмент.
- Описание — описание разделителя, включая рекомендации по его использованию.
Название | Классы | Разделяет по | Добавляет метаданные | Описание |
---|---|---|---|---|
Рекурсивный | RecursiveCharacterTextSplitter, RecursiveJsonSplitter | Список символов, заданных пользователем | Рекурсивно разделяет текст, стараясь сохранить связанные части текста рядом друг с другом. Рекомендуется начинать разделение текста с этого способа | |
HTML | HTMLHeaderTextSplitter, HTMLSectionSplitter | HTML-специфические символы | ✅ | Разделяет текст на основе специфических для HTML символов. В частности, на основе HTML добавляет данные о том, откуда взят каждый фрагмент |
Markdown | MarkdownHeaderTextSplitter | Символы, специфические для Markdown | ✅ | Разделяет текст на основе символов, специфических для Markdown. В частности, на основе Markdown добавляет данные о том, откуда взят каждый фрагмент |
Код | множество языков | Символы, специфические для языков программирования (Python, JS) | Разделяет текст на основе символов, специфичных для языков программирования. Доступно 15 языков | |
Токены | множество классов | Токены | Разделяет текст на основе токенов. Существует несколько различных способов измерения количества токенов | |
Символы | CharacterTextSplitter | Символ, заданный пользователем | Разделяет текст на основе символа, заданного пользователем. Один из простейших методов | |
Семантический Chunker (экспериментальный) | SemanticChunker | Предложения | Сначала разделяет по предложениям. Затем объединяет соседние предложения, если они достаточно семантически похожи. Взято из Greg Kamradt | |
Интеграция: AI21 Semantic | AI21SemanticTextSplitter | Определяет различные темы, формирующие цельные фрагменты текста, и разделяет по ним | ✅ |