Реверс-инжиниринг исходного кода Reddit с помощью LangChain и GPT-4
19 июня 2023 г.Представьте, что вы пишете программу, которая может понимать, помогать и даже генерировать код, подобно тому, как это сделал бы опытный разработчик.
Что ж, это возможно с LangChain. Используя передовые модели, такие как VectorStores, Conversational RetrieverChain и LLM, LangChain выводит нас на новый уровень понимания и генерации кода.
В этом руководстве мы реконструируем общедоступный репозиторий исходного кода Reddit для версии 1 сайта, чтобы лучше понять кодовую базу и предоставить понимание его внутренней работы. Я был вдохновлен на создание этого руководства после прочтения твита Пола Грэма на эту тему (и потому, что я не ничего не знал о Лиспе, но все же хотел понять, о чем он говорит).
https://twitter.com/paulg/status/1669986094392156160?s=20&embedable =правда
Мы будем использовать технологию встраивания OpenAI и инструмент под названием Activeloop, чтобы сделать код понятным, и LLM (в данном случае GPT-4) для взаимодействия с кодом. Если вы заинтересованы в использовании другого LLM или другой платформы, ознакомьтесь с моим предыдущим руководством по адресу реверс-инжиниринг алгоритма Twitter с использованием DeepInfra и Dolly.
Когда мы закончим, мы сможем сократить сложную работу, которая потребуется для понимания алгоритма, попросив ИИ дать нам ответы на наши самые насущные вопросы, вместо того, чтобы тратить недели, просеивая их самостоятельно. Начнем.
Концептуальный план понимания кода с помощью LangChain
LangChain – это мощный инструмент для анализа репозиториев кода на GitHub. Он объединяет три важные части: VectorStores, Conversational RetrieverChain и LLM (языковую модель), чтобы помочь вам понять код, ответить на вопросы о нем в контексте и даже создать новый код в репозиториях GitHub.
Conversational RetrieverChain — это система, помогающая находить и извлекать полезную информацию из VectorStore. Он использует интеллектуальные методы, такие как контекстно-зависимая фильтрация и ранжирование, чтобы выяснить, какие фрагменты кода и информация наиболее релевантны вашему конкретному вопросу или запросу. Его отличает то, что он учитывает историю разговора и контекст, в котором задан вопрос. Это означает, что он может предоставить вам высококачественные и релевантные результаты, которые конкретно соответствуют вашим потребностям. Проще говоря, это похоже на умного помощника, который понимает контекст ваших вопросов и дает вам наилучшие возможные ответы на основе этого контекста.
Теперь давайте рассмотрим рабочий процесс LangChain и посмотрим, как он работает на высоком уровне:
- Индексировать базу кода. Первый шаг — клонировать целевой репозиторий, который вы хотите проанализировать. Загрузите все файлы в репозиторий, разбейте их на более мелкие фрагменты и запустите процесс индексации. Если у вас уже есть проиндексированный набор данных, вы можете даже пропустить этот шаг.
2. Встраивание и хранилище кода. Чтобы сделать фрагменты кода более понятными, LangChain использует модель встраивания с учетом кода. Эта модель помогает уловить сущность кода и сохраняет встроенные фрагменты в VectorStore, что делает их легко доступными для будущих запросов.
3. Понимание запросов. Здесь в игру вступает ваш LLM. Вы можете использовать такую модель, как GPT-4, для обработки ваших запросов. Модель используется для анализа ваших запросов и понимания их смысла путем рассмотрения контекста и извлечения важной информации. Благодаря этому модель помогает LangChain точно интерпретировать ваши запросы и предоставлять вам точные и релевантные результаты.
4. Создание ретривера. Как только ваш вопрос станет ясным, в игру вступит диалоговая цепочка ретривера. Он проходит через VectorStore, где хранятся фрагменты кода, и находит фрагменты кода, наиболее соответствующие вашему запросу. Этот процесс поиска очень гибкий и может быть настроен в соответствии с вашими требованиями. У вас есть возможность изменять настройки и применять фильтры в соответствии с вашими потребностями, что гарантирует получение наиболее точных и полезных результатов для вашего запроса.
5. Создайте цепочку диалогов. После того, как вы настроили извлекатель, пришло время построить цепочку диалогов. Этот шаг включает в себя настройку параметров ретривера в соответствии с вашими потребностями и применение любых дополнительных фильтров, которые могут потребоваться. Делая это, вы можете сузить поиск и убедиться, что вы получаете самые точные, точные и релевантные результаты для ваших запросов. По сути, это позволяет вам точно настроить процесс поиска, чтобы получить наиболее полезную для вас информацию.
6. Задавайте вопросы. А теперь самое интересное! Вы можете задавать вопросы о кодовой базе, используя диалоговую цепочку поиска. Он будет генерировать исчерпывающие и контекстно-зависимые ответы для вас. Ваш LLM, будучи частью диалоговой цепочки, учитывает извлеченные фрагменты кода и историю разговоров, чтобы предоставить вам подробные и точные ответы.
Следуя этому рабочему процессу, вы сможете эффективно использовать LangChain для более глубокого понимания кода, получения контекстно-зависимых ответов на свои вопросы и даже для создания фрагментов кода в репозиториях GitHub. Теперь давайте посмотрим на это в действии, шаг за шагом.
Пошаговое руководство
Давайте перейдем к фактической реализации.
1. Получение ключей
Для начала вам необходимо зарегистрироваться на соответствующих веб-сайтах и получить ключи API для Activeloop и OpenAI.
2. Настройка файла 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
from dotenv import load_dotenv
# Load environment variables from .env
load_dotenv()
embeddings = OpenAIEmbeddings(disallowed_special=())
3. Клонирование и индексирование целевого репозитория
Далее мы клонируем репозиторий алгоритмов Reddit, загружаем, разделяем и индексируем документы. Вы можете клонировать алгоритм по этой ссылке.
root_dir = './reddit1.0-master'
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
4. Встраивание фрагментов кода:
Далее мы используем встраивания 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}/reddit-source", embedding_function=embeddings) # dataset would be publicly available
db.add_documents(texts)
print("done")
5. Использование GPT-4 для обработки и понимания запросов пользователей
Теперь мы настраиваем другой файл Python, question.py
, для использования GPT-4, языковой модели, доступной в OpenAI, для обработки и понимания пользовательских запросов.
6. Конструирование ретривера
Мы создаем средство извлечения, используя созданное ранее хранилище VectorStore.
db = DeepLake(dataset_path="hub://mikelabs/reddit-source", 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
7. Построение цепочки диалогов
Мы используем диалоговую цепочку извлечения, чтобы связать извлекатель и языковую модель. Это позволяет нашей системе обрабатывать запросы пользователей и генерировать контекстно-зависимые ответы.
model = ChatOpenAI(model_name='gpt-4') # switch to gpt-3.5-turbo if you want
qa = ConversationalRetrievalChain.from_llm(model, retriever=retriever)
8. Задавать вопросы
Теперь мы можем задавать вопросы об исходном коде Reddit. Ответы, предоставляемые диалоговой цепочкой поиска, зависят от контекста и напрямую основаны на кодовой базе.
questions = ["What's the best way to earn karma?", "How does the karma system work?", "<YOUR QUESTIONS HERE>"]
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")
Вот некоторые ответы, которые я получил:
-> **Question**: What's the best way to earn karma?
**Answer**: The best way to earn karma is by submitting high-quality, interesting, and relevant content or comments that engage the community and contribute positively to discussions. Be active in the community, participate in conversations, and always follow the rules and guidelines of the platform.
-> **Question**: How does the karma system work?
**Answer**: The karma system, as defined in the provided code, is a way to keep track of a user's accumulated points within the platform. A user's karma is a numerical value that represents their contributions and participation within the community.
The `karma` function takes a user's ID as an argument and retrieves their karma value from the database. If a user's karma is not found, the function returns 0.
Karma is mainly updated in two ways:
1. When a user submits content, their karma may increase based on the popularity of the submitted content.
2. When a user reports a link (using the 'wtf' function), their karma may be adjusted based on the reason provided for reporting the link.
Top submitters, those with the highest karma values, are displayed on the platform in different categories: today, this week, and all-time.
Что вы спросите? Чему вы научитесь? Дайте мне знать!
Заключение
В этом руководстве мы исследовали общедоступный репозиторий исходного кода Reddit для версии 1 сайта с помощью LangChain. Используя возможности искусственного интеллекта, мы экономим драгоценное время и усилия, заменяя ручную проверку кода автоматическими ответами на запросы.
LangChain — это мощный инструмент, который революционизирует понимание и генерацию кода. Используя передовые модели, такие как VectorStores, Conversational RetrieverChain и LLM, LangChain позволяет разработчикам эффективно анализировать репозитории кода, предоставлять контекстно-зависимые ответы и создавать новый код.
Рабочий процесс LangChain включает в себя индексацию кодовой базы, встраивание фрагментов кода, обработку пользовательских запросов с языковыми моделями и использование Conversational RetrieverChain для извлечения соответствующих фрагментов кода. Настраивая средство извлечения и создавая диалоговую цепочку, разработчики могут точно настроить процесс поиска для получения точных результатов.
Следуя пошаговому руководству, вы можете использовать LangChain для улучшения понимания кода, получения контекстно-зависимых ответов и даже создания фрагментов кода в репозиториях GitHub. LangChain открывает новые возможности для продуктивности и понимания. Что вы будете строить с его помощью?
Спасибо за прочтение!
:::информация Также опубликовано здесь
:::
Оригинал