Материалы блога Planet PostgreSQL

Доступ к большим языковым моделям из PostgreSQL

Большие языковые модели (LLM) обеспечивают некоторые поистине уникальные возможности, которых нет ни у одного другого программного обеспечения, но они, как известно, привередливы в использовании, требуя больших объемов оперативной памяти и вычислительных ресурсов.
Это означает, что у простых смертных есть два возможных пути для экспериментов с LLM:
  • Используйте облачный сервис, такой как OpenAI. Вы получаете новейшие модели и лучшие серверы, по цене нескольких микрокопеек за токен.
  • Используйте небольшую локально размещенную модель. Вы таким образом используетее собственное оборудование и платите только за электричество.
Удивительно, но вы можете использовать любой из этих подходов и использовать один и тот же API доступа для доступа к сервисам LLM, потому что API OpenAI стал своего рода отраслевым стандартом.

Расширение доступа OpenAI

Зная это, имеет смысл создать базовое расширение доступа к API OpenAI в PostgreSQL, чтобы сделать использование API быстрым и простым. Расширение, которое мы создали для этого поста, выполняет три функции:
  • openai.models() возвращает список моделей, обслуживаемых API
  • openai.prompt(текст контекста, текст приглашения) возвращает текстовый ответ на запрос, оцененный с использованием контекста.
  • openai.vector(текст приглашения) возвращает векторное встраивание текста приглашения.
OpenAI API просто принимает JSON-запросы по HTTP и возвращает JSON-ответы, поэтому у нас есть все необходимое для создания клиентского расширения, сочетающего встроенную поддержку JSON PostgreSQL с расширением http.
Получить функции расширения можно двумя способами:
  • Вы можете установить расширение, если у вас есть системный доступ к вашей базе данных.
  • Или вы можете просто загрузить файл openai--1.0.sql, так как это 100% код PL/PgSQL. Только не забудьте сделать это в первую очередь, потому что расширение API зависит от расширения http.CREATE EXTENSION http

Локальные или удаленные

Расширение API определяет, к какой конечной точке API следует достичь и какие модели использовать, считывая несколько глобальных переменных.
Использовать OpenAI очень просто.
  • Зарегистрируйтесь для получения ключа API.
  • Настройте переменные key, URI и model.
SET openai.api_key = 'your_api_key_here';
SET openai.api_uri = 'https://api.openai.com/v1/';
SET openai.prompt_model = 'gpt-4o-mini';
SET openai.embedding_model = 'text-embedding-3-small';
Использовать местную модель Ollama также довольно просто.
  • Скачать Ollama.
  • Убедитесь, что вы можете бегать ollama
  • тогда ollama pull llama3.1:latest
  • и ollama pull mxbai-embed-large
  • Настройка сеансовых ключей
SET openai.api_uri = 'http://127.0.0.1:11434/v1/';
SET openai.api_key = 'none';
SET openai.prompt_model = 'llama3.1:latest';
SET openai.embedding_model = 'mxbai-embed-large';
Если вы хотите использовать одну и ту же настройку в нескольких сеансах, используйте команду, чтобы сделать значения постоянными.ALTER DATABASE dbname SET variable = value

Тестирование с анализом тональности

С настроенной системой у вас есть возможность запустить функцию и получить результат. Используя Ollama, ваш результат должен выглядеть примерно так.openai.models()
SELECT * FROM openai.models();
            id            | object |       created       | owned_by
--------------------------+--------+---------------------+----------
 mxbai-embed-large:latest | model  | 2024-11-04 20:48:39 | library
 llama3.1:latest          | model  | 2024-07-25 22:45:02 | library
LLM сделали анализ настроений слишком просто до смешного простым. Основная проблема заключается в том, чтобы просто убедить модель ограничить сводку входных данных одним индикативным значением, а не полностью записанной сводкой.

В качестве простого примера представьте себе базовую форму обратной связи. Мы получаем обратную связь от клиентов в свободной форме и поручаем LLM анализировать тональность в триггере по INSERT или UPDATE.
CREATE TABLE feedback (
    feedback text, -- freeform comments from the customer
    sentiment text -- positive/neutral/negative from the LLM
    );
Триггерная функция — это просто вызов функции с соответствующим ограничением контекста, чтобы заставить модель возвращать ответ только из одного слова.openai.prompt()
--
-- Step 1: Create the trigger function
--
CREATE OR REPLACE FUNCTION analyze_sentiment() RETURNS TRIGGER AS $$
DECLARE
    response TEXT;
BEGIN
    -- Use openai.prompt to classify the sentiment as positive, neutral, or negative
    response := openai.prompt(
        'You are an advanced sentiment analysis model. Read the given feedback text carefully and classify it as one of the following sentiments only: "positive", "neutral", or "negative". Respond with exactly one of these words and no others, using lowercase and no punctuation',
        NEW.feedback
    );

    -- Set the sentiment field based on the model's response
    NEW.sentiment := response;

    RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';

--
-- Step 2: Create the trigger to execute the function before each INSERT or UPDATE
--
CREATE TRIGGER set_sentiment
    BEFORE INSERT OR UPDATE ON feedback
    FOR EACH ROW
    EXECUTE FUNCTION analyze_sentiment();
После того как функция триггера будет активирована, новые записи в форме обратной связи будут автоматически анализироваться тональностью по мере их поступления.
INSERT INTO feedback (feedback)
    VALUES
        ('The food was not well cooked and the service was slow.'),
        ('I loved the bisque but the flan was a little too mushy.'),
        ('This was a wonderful dining experience, and I would come again,
          even though there was a spider in the bathroom.');

SELECT * FROM feedback;
-[ RECORD 1 ]-----------------------------------------------------
feedback  | The food was not well cooked and the service was slow.
sentiment | negative

-[ RECORD 2 ]-----------------------------------------------------
feedback  | I loved the bisque but the flan was a little too mushy.
sentiment | positive

-[ RECORD 3 ]-----------------------------------------------------
feedback  | This was a wonderful dining experience, and I would
            come again, even though there was a spider in
            the bathroom.
sentiment | positive

Заключение

До LLM анализ sentiment включал в себя множество нюансов. Теперь мы можем просто запросить ответ в черном ящике LLM, используя простой английский язык для размещения параметров вокруг запроса.
Отдельные сервисы, такие как Ollama, обеспечивают экономичный способ тестирования и, возможно, даже развертывания способных моделей среднего размера, таких как Llama3-8B.