В этой статье я собираюсь проиллюстрировать свой опыт создания системы рекомендаций в реальном времени с помощью модели Palm2 LLM, TMDB API и Streamlit.

Моя цель — рассказать о том, как разработать систему рекомендаций фильмов, используя интеграцию нескольких API и компонентов.

Этот блог представляет собой письменное руководство по просмотру видео на YouTube 🎥. Если вам понравилось видео, то поставьте лайк👍 под видео и подпишитесь на канал. Итак, приступим 😊.

Что такое API модели большого языка PaLm 2?

Модели большого языка (LLM) — это мощный, универсальный тип модели машинного обучения, который позволяет компьютерам лучше, чем когда-либо, понимать и генерировать естественный язык. Их можно использовать для создания всевозможных приложений, от чат-ботов до виртуальных помощников, приложений для перевода и многого другого. Кроме того, вам не нужно быть экспертом по искусственному интеллекту или даже писать код, чтобы использовать их. Все, что нужно, — это несколько предложений или «подсказок», чтобы начать разработку собственного приложения LLM.

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

Вы можете присоединиться к списку ожидания, чтобы получить ключ API через MakerSuite и быстро приступить к созданию прототипа.

Что такое API TMDB?

База данных фильмов (TMDB) — это созданная сообществом база данных фильмов и телепередач. Каждая часть данных была добавлена ​​удивительным сообществом, начиная с 2008 года.

Действия для получения ключа API для TMDB API:

1 . Создайте учетную запись на сайте TMDB (https://www.themoviedb.org/) или войдите, если у вас уже есть учетная запись.

2 . Перейти на страницу Настройки профиля.

3 . Перейдите на вкладку API (https://www.themoviedb.org/settings/api). Вы найдете свой ключ API и токен доступа для чтения API. Мы собираемся использовать токен доступа для чтения API для нашего проекта.

Вы можете найти более подробную информацию о том, как мы можем использовать TMDB API и его конечные точки, на https://developer.themoviedb.org/docs 😎.

Немного о Streamlit 🔥

Streamlit (https://streamlit.io/) — это библиотека Python с открытым исходным кодом, которая позволяет легко создавать красивые настраиваемые веб-приложения для машинного обучения и обработки данных и делиться ими. Всего за несколько минут вы можете создавать и развертывать мощные приложения для работы с данными.

Подробнее о том, как использовать Streamlit, вы можете узнать в официальной документации.

Вы можете установить его с помощью pip следующим образом:

pip install streamlit

Давайте приступим к программированию 🧑‍💻.

давайте установим необходимые библиотеки для проекта.

pip install google-generativeai streamlit

Google предоставляет библиотеку Python под названием google-generativeai для взаимодействия со своими генеративными моделями.

давайте импортируем необходимые модули Python, которые необходимы.

import os
import dotenv
import google.generativeai as palm
import requests
import time
import urllib.parse
import streamlit as st

Теперь мы собираемся добавить ключи API для модели Palm и TMDB API в файл .env 🔑.

PALM_API_KEY="Your Palm API key here"
TMDB_API_KEY="You TMDB API access token here"

Теперь наша переменная окружения установлена. Пришло время импортировать ключи API в код Python. Мы можем сделать это, выполнив следующую строку кода.

dotenv.load_dotenv()

Теперь мы собираемся создать класс с именем Recommend_movies .

class Recommend_movies:
    def __init__(self) -> None:
        self.model = palm
        self.model.configure(api_key=os.getenv("PALM_API_KEY"))

        self.session = requests.Session()
        self.session.headers = {
            "accept": "application/json",
            "Authorization": f"Bearer {os.getenv('TMDB_API_KEY')}"
        }

        self.defaults = {
            'model': 'models/text-bison-001',
            'temperature': 0.7,
            'candidate_count': 1,
            'top_k': 40,
            'top_p': 0.95,
            'max_output_tokens': 1024,
            'stop_sequences': [],
            'safety_settings': [
                {"category":"HARM_CATEGORY_DEROGATORY","threshold":1},
                {"category":"HARM_CATEGORY_TOXICITY","threshold":1},
                {"category":"HARM_CATEGORY_VIOLENCE","threshold":2},
                {"category":"HARM_CATEGORY_SEXUAL","threshold":2},
                {"category":"HARM_CATEGORY_MEDICAL","threshold":2},
                {"category":"HARM_CATEGORY_DANGEROUS","threshold":2}
            ],
        }
    
    def urlify_string(self,string):
        url_encoded = urllib.parse.quote(string)
        return url_encoded
    
    def generate(self,movie_name :str):

        result = []
        
        prompt = f"""input: Th Dark Knight 
            output: Batman Begins
            The Prestige
            Se7en
            Fight Club
            The Shawshank Redemption
            input: {movie_name}
            output:"""

        response = self.model.generate_text(
            **self.defaults,
            prompt=prompt
        )
        
        recommendations = response.result.split("\n")
        time.sleep(0.1)
        for i in recommendations:
            movie = self.urlify_string(i)
            url = f"https://api.themoviedb.org/3/search/movie?query={movie}&include_adult=false&language=en-US&page=1"
            res = self.session.get(url).json()
            result.append(res["results"])

        return result

Теперь мы обсудим вышеприведенный код метод за методом. Начнем с метода инициализатора.

def __init__(self) -> None:
        self.model = palm
        self.model.configure(api_key=os.getenv("PALM_API_KEY"))

        self.session = requests.Session()
        self.session.headers = {
            "accept": "application/json",
            "Authorization": f"Bearer {os.getenv('TMDB_API_KEY')}"
        }

        self.defaults = {
            'model': 'models/text-bison-001',
            'temperature': 0.7,
            'candidate_count': 1,
            'top_k': 40,
            'top_p': 0.95,
            'max_output_tokens': 1024,
            'stop_sequences': [],
            'safety_settings': [
                {"category":"HARM_CATEGORY_DEROGATORY","threshold":1},
                {"category":"HARM_CATEGORY_TOXICITY","threshold":1},
                {"category":"HARM_CATEGORY_VIOLENCE","threshold":2},
                {"category":"HARM_CATEGORY_SEXUAL","threshold":2},
                {"category":"HARM_CATEGORY_MEDICAL","threshold":2},
                {"category":"HARM_CATEGORY_DANGEROUS","threshold":2}
            ],
        }

Сначала мы собираемся назначить нашу модель ладони, следуя строке кода, и мы настроим ключ API ладони для модели.

self.model = palm
self.model.configure(api_key=os.getenv("PALM_API_KEY"))

Теперь мы собираемся создать объект сеанса для вызова API TMDB и настроить ключ API TMDB с объектом сеанса.

self.session = requests.Session()
self.session.headers = {
    "accept": "application/json",
    "Authorization": f"Bearer {os.getenv('TMDB_API_KEY')}"
}

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

self.defaults = {
            'model': 'models/text-bison-001',
            'temperature': 0.7,
            'candidate_count': 1,
            'top_k': 40,
            'top_p': 0.95,
            'max_output_tokens': 1024,
            'stop_sequences': [],
            'safety_settings': [
                {"category":"HARM_CATEGORY_DEROGATORY","threshold":1},
                {"category":"HARM_CATEGORY_TOXICITY","threshold":1},
                {"category":"HARM_CATEGORY_VIOLENCE","threshold":2},
                {"category":"HARM_CATEGORY_SEXUAL","threshold":2},
                {"category":"HARM_CATEGORY_MEDICAL","threshold":2},
                {"category":"HARM_CATEGORY_DANGEROUS","threshold":2}
            ],
        }

Далее нам нужно преобразовать строку в форму URL. Используя метод urlify_string для преобразования строки в форму URL 🌐.

def urlify_string(self,string):
        url_encoded = urllib.parse.quote(string)
        return url_encoded

Теперь мы собираемся генерировать результаты из модели. Мы собираемся использовать выходные данные модели ладони для получения афиши фильма и названия фильма из TMDB API.

def generate(self,movie_name :str):

        result = []
        
        prompt = f"""input: Th Dark Knight 
            output: Batman Begins
            The Prestige
            Se7en
            Fight Club
            The Shawshank Redemption
            input: {movie_name}
            output:"""

        response = self.model.generate_text(
            **self.defaults,
            prompt=prompt
        )
        
        recommendations = response.result.split("\n")
        time.sleep(0.1)
        for i in recommendations:
            movie = self.urlify_string(i)
            url = f"https://api.themoviedb.org/3/search/movie?query={movie}&include_adult=false&language=en-US&page=1"
            res = self.session.get(url).json()
            result.append(res["results"])

        return result

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

Модель PaLM поставляется в трех вариантах:

1 . Текстовая подсказка

2 . Запрос данных

3 . Подсказка в чате

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

Что такое запрос данных 🤔?

Подсказка данных чем-то похожа на модель тонкой настройки. Здесь нам нужно дать модели ладони несколько примеров для обучения, а затем она генерирует аналогичный вывод для определенного ввода.

Как вы можете видеть в приведенном выше примере изображения, нам нужно дать пример ввода и вывода в модель. В примерах, которые я ввел как Темный рыцарь, а в столбце вывода есть фильмы, похожие на «Темный рыцарь» .

Кстати, Темный рыцарь — мой любимый фильм 🃏🦇.

Вернемся к теме. Теперь мы собираемся протестировать нашу подсказку. Итак, на входе мы собираемся добавить Железного человека в качестве фильма, а затем он будет генерировать выходные фильмы 🎥.

Теперь нам нужно дать такой ввод и вывод в коде Python 🐍.

prompt = f"""input: Th Dark Knight 
            output: Batman Begins
            The Prestige
            Se7en
            Fight Club
            The Shawshank Redemption
            input: {movie_name}
            output:"""

Здесь, в приведенном выше коде Python, мы форматируем новую строку, используя f-строку в Python. Мы изменили приглашение, чтобы выводить вывод для определенного фильма.

response = self.model.generate_text(
            **self.defaults,
            prompt=prompt
        )
        
recommendations = response.result.split("\n")

Затем мы проанализируем нашу подсказку и настройки по умолчанию для метода generate_text, который будет генерировать выходные данные. После генерации текста мы собираемся разделить вывод по символу новой строки, потому что имена фильмов в выводе находятся на новых строках.

for i in recommendations:
            movie = self.urlify_string(i)
            url = f"https://api.themoviedb.org/3/search/movie?query={movie}&include_adult=false&language=en-US&page=1"
            res = self.session.get(url).json()
            result.append(res["results"])

 return result

Затем мы пройдемся по рекомендации, сгенерированной моделью ладони, и сделаем запрос GET к TMDB API, чтобы получить информацию о конкретном фильме. Затем мы сохраним это в списке результатов и, наконец, вернем результат.

Теперь наш код генерации текста модели завершен. Теперь мы собираемся реализовать пользовательский интерфейс с помощью streamlit.

Сначала мы дадим название нашему веб-приложению. Он похож на тег h1 в HTML. Следующий код создаст заголовок, вызвав метод st.title("Имя заголовка").

st.title("Recommendation System Using Palm 🎞️")

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

text_box = st.text_input("Your movie goes here 🎥")

Теперь мы собираемся создать объект для класса Recommend_movies.

r_m = Recommend_movies()

Для управления макетом в Streamlit мы будем использовать столбцы. Мы добавим полученное изображение в столбец 1, если индекс изображения четный, иначе мы добавим полученное изображение в столбец 2.

col1, col2 = st.columns(2)
for i in range(len(result)) :
        if result[i] != []:
            
            if i % 2 == 0 : 

                col1.image(f"https://image.tmdb.org/t/p/w300_and_h450_bestv2{result[i][0]['poster_path']}")
                col1.write(result[i][0]['title'])
            else :
                
                col2.image(f"https://image.tmdb.org/t/p/w300_and_h450_bestv2{result[i][0]['poster_path']}")
                col2.write(result[i][0]['title'])

Мы можем добавить изображение в столбец, вызвав метод col.image. Нам нужно передать путь к изображению в качестве параметра в col.image.

Вот и все, теперь давайте запустим наше приложение 😊. Если вы правильно установили streamlit, вы можете запускать команды cli для streamlit следующим образом:

streamlit run filename.py

После запуска файла python для проекта откроется новая вкладка браузера по адресу http://localhost:8501/. Вы увидите веб-приложение, подобное этому:

Вам просто нужно вставить название фильма в текстовое поле и нажать Enter. Вы должны увидеть такой вывод:

Вот и все ! . Поздравляю 😎! Вы создали рекомендательную систему по модели PaLM. Исходный код доступен на Github.

Спасибо, что прочитали эту статью 😊. Если вам понравился контент в блоге, поставьте лайк 👍. Также проверьте мой канал на YouTube здесь. Если у вас есть какие-либо вопросы, не стесняйтесь комментировать.

Вы можете связаться со мной через linkedin, а также с сайта портфолио.

Спасибо 😃!