Что за твит? Реверс-инжиниринг алгоритма Twitter с помощью LangChain
13 июня 2023 г.Представьте, что вы пишете программу, которая может понимать, помогать и даже генерировать код, подобно тому, как это сделал бы опытный разработчик.
Что ж, это возможно с LangChain. Используя передовые модели, такие как VectorStores, Conversational RetrieverChain и LLM, LangChain выводит нас на новый уровень понимания и генерации кода.
В этом руководстве мы разработаем рекомендательный алгоритм Twitter, чтобы лучше понять кодовую базу и предоставить информацию для создания лучшего контента. Мы будем использовать технологию встраивания OpenAI и инструмент под названием Activeloop, чтобы сделать код понятным, и LLM, размещенный на DeepInfra под названием Долли, чтобы поговорить с кодом.
Когда мы закончим, мы сможем сократить сложную работу, которая потребуется для понимания алгоритма, попросив ИИ дать нам ответы на наши самые насущные вопросы, вместо того, чтобы тратить недели, просеивая их самостоятельно. Начнем.
Концептуальный план понимания кода с помощью LangChain
LangChain — очень полезный инструмент для анализа репозиториев кода на GitHub. Он объединяет три важные части: VectorStores, Conversational RetrieverChain и LLM (языковую модель), чтобы помочь вам понять код, ответить на вопросы о нем в контексте и даже создать новый код в репозиториях GitHub.
Conversational RetrieverChain — это система, помогающая находить и извлекать полезную информацию из VectorStore. Он использует интеллектуальные методы, такие как контекстно-зависимая фильтрация и ранжирование, чтобы выяснить, какие фрагменты кода и информация наиболее релевантны вашему конкретному вопросу или запросу.
Его отличает то, что он учитывает историю разговора и контекст, в котором задан вопрос. Это означает, что он может предоставить вам высококачественные и релевантные результаты, которые конкретно соответствуют вашим потребностям. Проще говоря, это похоже на умного помощника, который понимает контекст ваших вопросов и дает вам наилучшие возможные ответы на основе этого контекста.
Теперь давайте рассмотрим рабочий процесс LangChain и посмотрим, как он работает на высоком уровне:
Индексировать базу кода
Первый шаг — клонировать целевой репозиторий, который вы хотите проанализировать. Загрузите все файлы в репозиторий, разбейте их на более мелкие фрагменты и запустите процесс индексации. Если у вас уже есть проиндексированный набор данных, вы можете даже пропустить этот шаг.
Встраивание и хранилище кода
Чтобы сделать фрагменты кода более понятными, LangChain использует модель встраивания с учетом кода а>. Эта модель помогает уловить сущность кода и сохраняет встроенные фрагменты в VectorStore, что делает их легко доступными для будущих запросов.
Проще говоря, LangChain использует специальную технику, называемую встраиванием с учетом кода, чтобы упростить понимание фрагментов кода. У него есть модель, которая может анализировать код и фиксировать его важные функции. Затем он сохраняет эти проанализированные фрагменты кода в VectorStore, который является своего рода хранилищем для быстрого доступа. Таким образом, фрагменты кода организованы и готовы к быстрому извлечению, когда у вас возникнут вопросы или запросы в будущем.
Понимание запросов
Именно здесь вступает в игру ваш LLM. Для обработки вашего запросы. Модель используется для анализа ваших запросов и понимания их смысла путем рассмотрения контекста и извлечения важной информации. Благодаря этому модель помогает LangChain точно интерпретировать ваши запросы и предоставлять вам точные и релевантные результаты.
Создание ретривера:
После того, как ваш вопрос или запрос ясен, в игру вступает диалоговая цепочка RetrieverChain. Он проходит через VectorStore, где хранятся фрагменты кода, и находит фрагменты кода, наиболее соответствующие вашему запросу. Этот процесс поиска очень гибкий и может быть настроен в соответствии с вашими требованиями. У вас есть возможность изменять настройки и применять фильтры в соответствии с вашими потребностями, что гарантирует получение наиболее точных и полезных результатов для вашего запроса.
Создайте диалоговую цепочку
После того как вы настроили ретривер, пришло время создать диалоговую цепочку. Этот шаг включает настройку параметров ретривера в соответствии с вашими потребностями и применение любых дополнительных фильтров, которые могут потребоваться. Делая это, вы можете сузить поиск и убедиться, что вы получаете самые точные, точные и релевантные результаты для ваших запросов. По сути, это позволяет вам точно настроить процесс поиска, чтобы получить наиболее полезную для вас информацию.
Задавайте вопросы: самое интересное!
Вы можете задавать вопросы о кодовой базе, используя ConversationalRetrievalChain. Он будет генерировать исчерпывающие и контекстно-зависимые ответы для вас. Ваш LLM, будучи частью диалоговой цепочки, учитывает извлеченные фрагменты кода и историю разговоров, чтобы предоставить вам подробные и точные ответы.
Следуя этому рабочему процессу, вы сможете эффективно использовать LangChain для более глубокого понимания кода, получения контекстно-зависимых ответов на свои вопросы и даже создания фрагментов кода в репозиториях GitHub. Теперь давайте посмотрим на это в действии, шаг за шагом.
Пошаговое руководство
Давайте перейдем к фактической реализации.
Получение ключей
Для начала вам необходимо зарегистрироваться на соответствующих веб-сайтах и получить ключи API для Activeloop, DeepInfra и OpenAI.
Настройка файла Indexer.py
Создайте файл Python, например indexer.py, в который вы будете индексировать данные. Импортируйте необходимые модули и установите ключи API в качестве переменных среды:
import os
from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import DeepLake
os.environ['OPENAI_API_KEY'] = 'YOUR KEY HERE'
os.environ['ACTIVELOOP_TOKEN'] = 'YOUR KEY HERE'
embeddings = OpenAIEmbeddings(disallowed_special=())
Внедрения, на простом английском языке, представляют собой представления текста, которые фиксируют значение и взаимосвязь различных текстовых строк. Это числовые векторы или списки чисел, которые используются для измерения сходства или расстояния между различными входными текстами.
Вложения обычно используются для различных задач, таких как поиск, кластеризация, рекомендации, обнаружение аномалий, измерение разнообразия и классификация. В поиске встраивания помогают ранжировать релевантность результатов поиска запросу. При кластеризации встраивания группируют похожие текстовые строки вместе.
Рекомендации используют вложения, чтобы предлагать элементы со связанными текстовыми строками. Обнаружение аномалий использует вложения для выявления выбросов с небольшой взаимосвязью. Измерение разнообразия включает анализ распределения сходства между текстовыми строками. Классификация использует вложения для присвоения текстовым строкам их наиболее похожих меток.
Расстояние между двумя векторами вложения указывает, насколько связаны или похожи соответствующие текстовые строки. Меньшие расстояния указывают на высокую степень родства, а большие расстояния указывают на низкую степень родства.
Клонирование и индексирование целевого репозитория
Далее мы клонируем репозиторий алгоритмов Twitter, загружаем, разделяем и индексируем документы. Вы можете клонировать алгоритм по этой ссылке.
root_dir = './the-algorithm'
docs = []
for dirpath, dirnames, filenames in os.walk(root_dir):
for file in filenames:
try:
loader = TextLoader(os.path.join(dirpath, file), encoding='utf-8')
docs.extend(loader.load_and_split())
except Exception as e:
pass
Этот код проходит через каталог и его подкаталоги (os.walk(root_dir)). Для каждого обнаруженного файла (имена файлов) он пытается выполнить следующие шаги:
* Он создает объект TextLoader, указывая путь к файлу, который он обрабатывает в данный момент, (os.path.join(dirpath, file))
и устанавливая кодировку UTF-8.
* Затем он вызывает метод load_and_split()
объекта TextLoader, который, вероятно, считывает содержимое файла, выполняет некоторую обработку или операцию разделения и возвращает результирующие текстовые данные.
* Затем полученные текстовые данные добавляются в существующий список, называемый документами, с помощью метода extend()
.
* Если во время этого процесса возникает какое-либо исключение, оно перехватывается блоком try-except и просто игнорируется (`pass`).
По сути, этот фрагмент кода рекурсивно проходит через каталог, загружая и разделяя текстовые данные из файлов и добавляя полученные данные в список с именем docs.
Встраивание фрагментов кода
Далее мы используем встраивания OpenAI для встраивания фрагментов кода. Затем эти вложения сохраняются в VectorStore, что позволяет нам выполнять эффективный поиск по сходству:
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(docs)
username = "mikelabs" # replace with your username from app.activeloop.ai
db = DeepLake(dataset_path=f"hub://{username}/twitter-algorithm", embedding_function=embeddings, public=True) #dataset would be publicly available
db.add_documents(texts)print(“done”)
Этот код импортирует класс CharacterTextSplitter
и инициализирует его экземпляр размером 1000 символов без перекрытия. Затем он разбивает предоставленные документы на более мелкие текстовые фрагменты с помощью метода split_documents и сохраняет их в переменной texts.
Затем он устанавливает имя пользователя (то, которое вы использовали для регистрации в Activeloop!) и создает экземпляр DeepLake с именем db с путем к набору данных, указывающим на общедоступный набор данных, размещенный на «app.activeloop.ai» под указанным именем пользователя. embedding_function обрабатывает необходимые вложения.
Наконец, он добавляет тексты в базу данных с помощью метода add_documents, предположительно для хранения или дальнейшей обработки.
Запустите файл, затем подождите несколько минут (может показаться, что он немного завис… обычно не более 5 минут). Затем переходите к следующему шагу.
Использование Dolly-v2–12b для обработки и понимания запросов пользователей
Теперь мы настроим другой файл Python, question.py, для использования dolly-v2. –12b, языковая модель, доступная на платформе DeepInfra, для обработки и понимания пользовательских запросов.
Создание ретривера
Мы создаем средство извлечения, используя созданное ранее хранилище VectorStore.
db = DeepLake(dataset_path="hub://mikelabs/twitter-algorithm", read_only=True, embedding_function=embeddings) #use your username
retriever = db.as_retriever()
retriever.search_kwargs['distance_metric'] = 'cos'
retriever.search_kwargs['fetch_k'] = 100
retriever.search_kwargs['maximal_marginal_relevance'] = True
retriever.search_kwargs['k'] = 10
Вот разбивка того, что делает код:
Код инициализирует объект DeepLake с именем db. Он считывает набор данных из пути, указанного как «hub://mikelabs/twitter-algorithm». Обратите внимание, что вам нужно заменить «mikelabs» своим именем пользователя!
Затем объект базы данных преобразуется в ретривер с помощью метода as_retriever(). Этот шаг позволяет нам выполнять операции поиска данных, хранящихся в VectorStore.
Некоторые параметры поиска настраиваются путем изменения словаря retriever.search_kwargs
:
Для параметра distance_metric
задано значение «cos», что указывает на то, что косинусное сходство будет использоваться для измерения сходства между текстовыми входами. Представьте, что у вас есть два вектора, представляющие разные фрагменты текста, например предложения или документы. Косинусное сходство — это способ измерить, насколько похожи или связаны эти два фрагмента текста.
Чтобы вычислить косинусное сходство, мы смотрим на угол между двумя векторами. Если векторы указывают в одном направлении или очень близко друг к другу, косинусное сходство будет близко к 1. Это означает, что фрагменты текста очень похожи друг на друга.
С другой стороны, если векторы указывают в противоположных направлениях или находятся далеко друг от друга, косинусное подобие будет близко к -1. Это указывает на то, что фрагменты текста очень разные или непохожие.
Подобие косинусов, равное 0, означает, что векторы перпендикулярны друг другу или находятся под углом 90 градусов друг к другу. В этом случае между текстовыми фрагментами нет сходства.
В приведенном выше коде косинусное сходство используется в качестве меры для сравнения сходства между текстовыми входами. Это помогает определить, насколько тесно связаны два текстовых фрагмента. Используя косинусное сходство, код может ранжировать и извлекать лучшие совпадения, наиболее похожие на заданный запрос.
Параметр fetch_k
имеет значение 100, что означает, что средство извлечения извлечет 100 самых близких совпадений на основе косинусного сходства.
Для параметра maximal_marginal_relevance
задано значение True
, что предполагает, что средство извлечения будет отдавать приоритет различным результатам, а не возвращать очень похожие совпадения.
Параметр k
имеет значение 10, что указывает на то, что средство извлечения будет возвращать 10 результатов для каждого запроса.
Построение диалоговой цепочки
Мы используем ConversationalRetrievalChain, чтобы связать извлекатель и языковую модель. Это позволяет нашей системе обрабатывать запросы пользователей и генерировать контекстно-зависимые ответы:
model = DeepInfra(model_id="databricks/dolly-v2-12b")
qa = ConversationalRetrievalChain.from_llm(model,retriever=retriever)
ConversationalRetrievalChain действует как соединение между средством извлечения и языковой моделью. Это подключение позволяет системе обрабатывать запросы пользователей и генерировать ответы с учетом контекста.
Задавать вопросы
Теперь мы можем задавать вопросы о кодовой базе алгоритма Twitter. Ответы, предоставляемые ConversationalRetrievalChain, зависят от контекста и напрямую основаны на кодовой базе.
questions = ["What does favCountParams do?", ...]
chat_history = []
for question in questions:
result = qa({"question": question, "chat_history": chat_history})
chat_history.append((question, result['answer']))
print(f"-> **Question**: {question} n")
print(f"**Answer**: {result['answer']} n")
Вот несколько примеров вопросов, взятых из документации LangChain:
questions = [
"What does favCountParams do?",
"is it Likes + Bookmarks, or not clear from the code?",
"What are the major negative modifiers that lower your linear ranking parameters?",
"How do you get assigned to SimClusters?",
"What is needed to migrate from one SimClusters to another SimClusters?",
"How much do I get boosted within my cluster?",
"How does Heavy ranker work. what are it’s main inputs?",
"How can one influence Heavy ranker?",
"why threads and long tweets do so well on the platform?",
"Are thread and long tweet creators building a following that reacts to only threads?",
"Do you need to follow different strategies to get most followers vs to get most likes and bookmarks per tweet?",
"Content meta data and how it impacts virality (e.g. ALT in images).",
"What are some unexpected fingerprints for spam factors?",
"Is there any difference between company verified checkmarks and blue verified individual checkmarks?",
]
И вот образец ответа, который я получил:
**Question**: What does favCountParams do?
**Answer**: FavCountParams helps count your favorite videos in a way that is friendlier to the video hosting service (i.e., TikTok). For example, it skips counting duplicates and doesn't show recommendations that may not be relevant to you.
Ресурсы
Вот некоторые дополнительные ресурсы, которые могут оказаться полезными:
Заключение
В этом руководстве мы исследовали реконструирование алгоритма рекомендаций Twitter с помощью LangChain. Используя возможности искусственного интеллекта, мы экономим драгоценное время и усилия, заменяя ручную проверку кода автоматическими ответами на запросы.
LangChain — это мощный инструмент, который революционизирует понимание и генерацию кода. Используя передовые модели, такие как VectorStores, Conversational RetrieverChain и LLM, размещенные в такой службе, как DeepInfra, LangChain позволяет разработчикам эффективно анализировать репозитории кода, предоставлять контекстно-зависимые ответы и создавать новый код.
Рабочий процесс LangChain включает в себя индексирование базы кода, встраивание фрагментов кода, обработку пользовательских запросов с языковыми моделями и использование Conversational RetrieverChain для извлечения соответствующих фрагментов кода. Настраивая средство извлечения и создавая диалоговую цепочку, разработчики могут точно настроить процесс поиска для получения точных результатов.
Следуя пошаговому руководству, вы можете использовать LangChain для улучшения понимания кода, получения контекстно-зависимых ответов и даже создания фрагментов кода в репозиториях GitHub. LangChain открывает новые возможности для продуктивности и понимания. Что вы будете строить с его помощью? Спасибо за прочтение!
:::информация Также опубликовано здесь .
:::
Оригинал