Шпаргалка LangChain – Все секреты на одной странице

Шпаргалка LangChain - Полное собрание секретов на одной странице

Созданный лендинг – это мое резюме основных принципов LangChain. В этой статье я рассмотрю секции кода и опишу стартовый пакет, который вам понадобится, чтобы стать экспертом в LangChain.

В настоящее время это единственный видовой план, охватывающий основы LangChain. Скачайте версию pdf, ознакомьтесь с GitHub и посетите код в Colab.

Изучите мой курс LangChain 101:

Курс LangChain 101 (обновленный)

Сессии курса LangChain 101. Весь код находится на GitHub. LLMs, Чат-боты

VoAGI.com

Модели

Модель в LangChain – это любая языковая модель, такая как text-davinci-003/gpt-3.5-turbo/4/4-turbo от OpenAI, LLAMA, FALCON и т.д., которую можно использовать для различных задач обработки естественного языка.

Посмотрите мою лекцию по моделям в курсе LangChain 101:

LangChain 101: Часть 2ab. Все, что вам нужно знать о (больших языковых) моделях

pub.towardsai.net

Следующий код демонстрирует инициализацию и использование языковой модели (в данном случае OpenAI) в LangChain.

from langchain.llms import OpenAIllm = OpenAI(model_name="text-davinci-003", temperature=0.01)print(llm("Suggest 3 bday gifts for a data scientist"))>>> 1. Подписка на журнал или издание по науке о данных2. Набор книг о науке о данных3. Кружка или футболка с научно-данными мотивами

Как видите, мы инициализируем LLM и вызываем его с запросом. Вся токенизация и встраивание происходят за кадром. Мы можем управлять историей разговора и включать системные инструкции в чат, чтобы получить больше возможностей для ответа.

from langchain.chat_models import ChatOpenAIfrom langchain.schema import HumanMessage, AIMessage, SystemMessagechat = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.01)conversation_history = [    HumanMessage(content="Suggest 3 bday gifts for a data scientist"),    AIMessage(content="What is your price range?"),    HumanMessage(content="Under 100$"),]print(chat(conversation_history).content)>>>1. Книга о науке о данных: Рассмотрите возможность подарить популярную и рекомендуемую книгу о науке о данных, такую как "Python for Data Analysis" от Уэса МакКинни или "The Elements of Statistical Learning" от Тревора Хастия, Роберта Тибширани и Джерома Фридмана. Эти книги могут предоставить ценную информацию и знания для профессионального развития специалиста в области науки о данных.2. Инструмент визуализации данных: Ученые-данные часто имеют дело с большими наборами данных и им необходимо эффективно представлять свои результаты. Подарите им инструмент визуализации данных, такой как Tableau Public или Plotly, который поможет им создавать интерактивные и привлекательные графики и диаграммы для передачи результатов анализа данных.3. Подписка на платформу по науке о данных: Предоставьте им доступ к платформе по науке о данных, такой как Kaggle или DataCamp, которые предлагают широкий спектр курсов, учебных пособий и наборов данных для развития навыков и оставания в курсе последних тенденций в этой области. Этот подарок предоставит им ценные учебные ресурсы и возможности для профессионального роста.

system_instruction = SystemMessage(    content="""Вы работаете одним из ассистентов в магазине электроники.Прибыль зависит от проданных товаров""")user_message = HumanMessage(content="3 bday gifts for a data scientist")print(chat([system_instruction, user_message]).content)>>>1. Ноутбук: Высокопроизводительный ноутбук является необходимым для любого ученого-данных. Ищите модель с мощным процессором, достаточным объемом оперативной памяти и большой емкостью накопителя. Это позволит выполнять сложные задачи анализа данных и хранить большие объемы данных.2. Внешний жесткий диск: Ученым-данным приходится иметь дело с огромными объемами данных, и иметь дополнительное пространство для хранения крайне важно. Внешний жесткий диск большой емкости предоставит им удобный и надежный способ хранения и резервного копирования данных.3. Инструмент визуализации данных: Визуализация данных - важный аспект науки о данных. Рассмотрите возможность подарить им подписку на инструмент визуализации данных, такой как Tableau или Power BI. Эти инструменты помогут им создавать наглядные и интерактивные диаграммы, графики и панели для эффективного представления своих результатов.

Как видите, мы можем направить разговор в определенном направлении, используя разные типы сообщений: HumanMessage, AIMessage и SystemMessage.

Open-source

Теперь давайте поговорим о моделях с открытым исходным кодом. Ниже представлен типичный пример инициализации и использования предварительно обученной языковой модели для генерации текста. Код включает использование токенизатора, конфигурацию модели и эффективный вывод с квантованием (несколько фрагментов кода ниже) и поддержкой CUDA.

from auto_gptq import AutoGPTQForCausalLMfrom transformers import AutoTokenizerfrom torch import cuda# Имя предварительно обученной моделиmodel_name = "TheBloke/llama-2-13B-Guanaco-QLoRA-GPTQ"# Инициализация токенизатора для моделитokenizer = AutoTokenizer.from_pretrained(model_name, use_fast=True)# Инициализация модели AutoGPTQForCausalLM с определенными конфигурациями# Эта модель представляет собой квантованную версию модели GPT, подходящую для эффективного выводаmodel = AutoGPTQForCausalLM.from_quantized(    model_name,    use_safetensors=True,       # Включает SafeTensors для безопасной сериализации    trust_remote_code=True,     # Доверяет удаленному коду (не рекомендуется для ненадежных источников)    device_map="auto",          # Автоматическое отображение модели на доступное устройство    quantize_config=None        # Пользовательская конфигурация квантования (None для значения по умолчанию))# Входной запрос, который будет токенизирован и передан моделиquery = "<Здесь ваш текст>"# Токенизация входного запроса и преобразование его в формат тензора, совместимый с CUDAinput_ids = tokenizer(query, return_tensors="pt").input_ids.cuda()# Генерация текста с использованием модели с указанным параметром температурыoutput = model.generate(input_ids=input_ids, temperature=0.1)

Генерация текста

В процессе генерации текста вы можете оказывать значительное влияние на процесс генерации текста с помощью различных параметров:

Как LLM генерирует текст?

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

pub.towardsai.net

  • temperature влияет на случайность генерации токенов
  • Top-k сэмплирование ограничивает генерацию токенов наиболее вероятными k токенами на каждом шаге
  • Top-p (nucleus) сэмплирование ограничивает генерацию токенов кумулятивной вероятностью p
  • max_tokens указывает длину сгенерированных токенов
llm = OpenAI(temperature=0.5, top_k=10, top_p=0.75, max_tokens=50)

Квантование

Использование квантования важно с точки зрения производительности.

Как подогнать большие языковые модели в ограниченную память: квантование

Как запустить llm на локальной машине

pub.towardsai.net

Ниже мы оптимизируем предварительно обученную языковую модель для эффективной производительности с использованием 4-битного квантования. Использование BitsAndBytesConfig необходимо для применения этих оптимизаций, которые особенно полезны для сценариев развертывания, где размер модели и скорость являются ключевыми факторами.

from transformers import BitsAndBytesConfig, AutoModelForCausalLMimport torch# Укажите имя модели или путьmodel_name_or_path = "your-model-name-or-path"# Настройте BitsAndBytesConfig для 4-битного квантования# Эта конфигурация используется для оптимизации размера модели и скорости выводабнконфиг = BitsAndBytesConfig(    load_in_4bit=True,                          # Включает загрузку модели с точностью 4 бита    bnb_4bit_compute_dtype=torch.bfloat16,      # Устанавливает тип данных вычислений на bfloat16    bnb_4bit_quant_type="nf4",                  # Устанавливает тип квантования на nf4    bnb_4bit_use_double_quant=True              # Включает двойное квантование для улучшения точности)# Загрузка предварительно обученной причинно-языковой модели с 4-битным квантованиемmodel_4bit = AutoModelForCausalLM.from_pretrained(    model_name_or_path,     quantization_config=bnb_config,             # Применение конфигурации 4-битного квантования    device_map="auto",                          # Автоматическое отображение модели на доступное устройство    trust_remote_code=True                      # Доверие удаленному коду (используйте осторожно))

Тонкая настройка

В некоторых случаях необходимо осуществить тонкую настройку предобученной языковой модели. Обычно это достигается с использованием метода Low-Rank Adaptation (LoRA) для эффективной адаптации к задаче. Также показывается использование градиентного контролирования и подготовка к k-битному обучению, которые являются методами оптимизации процесса обучения с точки зрения использования памяти и вычислительной эффективности.

LangChain 101: Часть 2с. Тонкая настройка LLM с использованием PEFT, LORA и RL

Все, что вам нужно знать о тонкой настройке LLMs, PEFT, LORA и обучении больших языковых моделей

pub.towardsai.net

LangChain 101: Часть 2d. Тонкая настройка LLM с использованием обратной связи человека

Как реализовать обучение с подкреплением с обратной связью человека для предобученных LLM. Рассмотрите, если вы хотите исправить плохое…

pub.towardsai.net

from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
from transformers import AutoModelForCausalLM, Trainer, TrainingArguments, DataCollatorForLanguageModeling
# Загрузка предобученной причинно-следственной языковой модели
pretrained_model = AutoModelForCausalLM.from_pretrained("your-model-name")
# Включение градиентного контролирования для оптимизации использования памяти
pretrained_model.gradient_checkpointing_enable()
# Подготовка модели для k-битного обучения, оптимизация для обучения с низкой шириной битов
model = prepare_model_for_kbit_training(pretrained_model)
# Определение конфигурации LoRa (Low-Rank Adaptation)
# Это настраивает модель для задачеспецифической тонкой настройки с использованием низкоранговых матриц
config = LoraConfig(
    r=16,                            # Ранг матриц низкого ранга
    lora_alpha=32,                   # Масштаб для слоев LoRA
    lora_dropout=0.05,               # Уровень отсева для слоев LoRA
    bias="none",                     # Тип смещения
    target_modules=["query_key_value"],  # Целевые компоненты модели для адаптации LoRA
    task_type="CAUSAL_LM"            # Тип задачи, здесь причинная языковая модель
)
# Адаптация модели с указанной конфигурацией LoRa
model = get_peft_model(model, config)
# Инициализация Trainer для обучения модели
trainer = Trainer(
    model=model,
    train_dataset=train_dataset,  # Тренировочный набор данных
    args=TrainingArguments(
        num_train_epochs=10,        # Количество эпох обучения
        per_device_train_batch_size=8,        # Другие аргументы обучения...
    ),
    data_collator=DataCollatorForLanguageModeling(tokenizer)  # Объединяет пакеты данных
)
# Отключение кэширования для экономии памяти во время обучения
model.config.use_cache = False
# Начало процесса обучения
trainer.train()

Подсказки

LangChain позволяет создавать динамические подсказки, которые могут направлять поведение способности генерировать текст языковых моделей. Шаблоны подсказок в LangChain предоставляют способ генерации конкретных ответов от модели. Давайте рассмотрим практический пример, где нам необходимо создать SEO-описания для конкретных продуктов.

from langchain.prompts import PromptTemplate, FewShotPromptTemplate
# Определение и использование простого шаблона подсказки
template = "Выступите в роли эксперта по SEO. Предоставьте SEO-описание для {product}"
prompt = PromptTemplate(input_variables=["product"], template=template)
# Форматирование подсказки с указанным продуктом
formatted_prompt = prompt.format(product="Perpetuum Mobile")
print(llm(formatted_prompt))>>>Perpetuum Mobile — ведущий поставщик инновационных устойчивых энергетических решений. Наши продукты и услуги разработаны с целью помочь бизнесам и частным лицам сократить свой углеродный след и сэкономить деньги на энергозатратах. Мы специализируемся на солнечной, ветровой и геотермальной энергетических системах, а также на решениях для хранения энергии. Наша команда опытных инженеров и техников стремится предоставлять клиентам продукты и услуги самого высокого качества. Мы стремимся быть надежным и экономичным поставщиком возобновляемых энергетических решений в отрасли. Благодаря нашему принципу устойчивости и удовлетворенности клиентов, Perpetuum Mobile является идеальным выбором для ваших энергетических потребностей.

Могут возникнуть случаи, когда у вас есть небольшой набор данных с несколькими примерами, демонстрирующими желаемое выполнение задачи. Рассмотрим пример задачи классификации текста:

# Определение шаблона обучения с примерами
examples = [
    {"email_text": "Выиграйте бесплатный iPhone!", "category": "Спам"},
    {"email_text": "Следующее планирование спринта.", "category": "Встречи"},
    {"email_text": "Версия 2.1 Y теперь доступна",
     "category": "Обновления проекта"}
]
prompt_template = PromptTemplate(
    input_variables=["email_text", "category"],
    template="Классифицируйте электронную почту: {email_text} /n {category}"
)
few_shot_prompt = FewShotPromptTemplate(
    example_prompt=prompt_template,
    examples=examples,
    suffix="Классифицируйте электронную почту: {email_text}",
    input_variables=["email_text"]
)
# Использование шаблона обучения few-shot
formatted_prompt = few_shot_prompt.format(
    email_text="Привет. Я переназначаю ежедневный созвон на завтра на 10 утра."
)
print(llm(formatted_prompt))>>>/n Встречи

Индексы

Индексы в LangChain используются для эффективной обработки и получения большого объема данных. Вместо загрузки всего файла в текстовый формат в LLM, мы сначала индексируем/поиск данных в источнике и только после нахождения лучших k ответов передаем их для формулировки ответа. Потрясающе!

В LangChain использование индексов включает загрузку документов из разных источников, разделение текста, создание векторных хранилищ и получение соответствующих документов.

from langchain.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import FAISS

# Загрузка документов из веб-источника
loader = WebBaseLoader("https://ru.wikipedia.org/wiki/%D0%A5%D0%B8%D1%89%D1%83%D1%87%D0%BA%D0%B8")
loaded_documents = loader.load()

# Разделение загруженных документов на меньшие тексты
text_splitter = RecursiveCharacterTextSplitter(chunk_size=400, chunk_overlap=50)
texts = text_splitter.split_documents(loaded_documents)

# Создание векторного хранилища и выполнение поиска похожих текстов
db = FAISS.from_documents(texts, embeddings)
print(db.similarity_search("Какой вклад в математику внес Исаак Ньютон?"))>>>[Document(page_content="Исаак Ньютон открыл законы физики, объясняющие законы Кеплера, и объединил концепции, которые сейчас известны как исчисление. Независимо от этого Готтфрид Вильгельм Лейбниц разработал исчисление и основу символьной нотации, которая все еще используется. Он также усовершенствовал двоичную систему счисления, которая является основой практически всех цифровых (электрон", metadata={'source': 'https://ru.wikipedia.org/wiki/%D0%A5%D0%B8%D1%89%D1%83%D1%87%D0%BA%D0%B8', 'title': 'Хищушки — Википедия', 'language': 'ru'}), Document(page_content='математических открытий, взаимодействуя с новыми научными открытиями, делались все быстрее и до сих пор продолжаются. Это включает значительные работы как Исаака Ньютона, так и Готтфрида Вильгельма Лейбница в развитии бесконечно малого исчисления в течение XVII века.', metadata={'source': 'https://ru.wikipedia.org/wiki/%D0%A5%D0%B8%D1%89%D1%83%D1%87%D0%BA%D0%B8', 'title': 'Хищушки — Википедия', 'language': 'ru'}), Document(page_content="В XIII веке Насир ад-Дин Туси совершил прорыв в сферической тригонометрии. Он также написал влиятельные работы по постулату параллельности Евклида. В XV веке Гиясетдин Каштси вычислил значение π до 16 десятичного знака. Каштси также имел алгоритм для вычисления корней степени n, который был особый случай методов, предложенных много столетий позже Руффини и Хорнер.", metadata={'source': 'https://ru.wikipedia.org/wiki/%D0%A5%D0%B8%D1%89%D1%83%D1%87%D0%BA%D0%B8', 'title': 'Хищушки — Википедия', 'language': 'ru'}), Document(page_content='В. В. Максимов, который продолжил традиции Н. Н. Лузина и А. Н. Колмогорова.', metadata={'source': 'https://ru.wikipedia.org/wiki/%D0%A5%D0%B8%D1%89%D1%83%D1%87%D0%BA%D0%B8', 'title': 'Хищушки — Википедия', 'language': 'ru'})]

Помимо использования similarity_search, мы можем использовать векторные БД в качестве извлекателей:

# Инициализация и использование извлекателя для получения соответствующих документов
retriever = db.as_retriever()
print(retriever.get_relevant_documents("Какой вклад в математику внес Исаак Ньютон?"))>>>[Document(page_content="Исаак Ньютон открыл законы физики, объясняющие законы Кеплера, и объединил концепции, которые сейчас известны как исчисление. Независимо от этого Готтфрид Вильгельм Лейбниц разработал исчисление и основу символьной нотации, которая все еще используется. Он также усовершенствовал двоичную систему счисления, которая является основой практически всех цифровых (электрон", metadata={'source': 'https://ru.wikipedia.org/wiki/%D0%A5%D0%B8%D1%89%D1%83%D1%87%D0%BA%D0%B8', 'title': 'Хищушки — Википедия', 'language': 'ru'}), Document(page_content='математических открытий, взаимодействуя с новыми научными открытиями, делались все быстрее и до сих пор продолжаются. Это включает значительные работы как Исаака Ньютона, так и Готтфрида Вильгельма Лейбница в развитии бесконечно малого исчисления в течение XVII века.', metadata={'source': 'https://ru.wikipedia.org/wiki/%D0%A5%D0%B8%D1%89%D1%83%D1%87%D0%BA%D0%B8', 'title': 'Хищушки — Википедия', 'language': 'ru'}), Document(page_content="В XIII веке Насир ад-Дин Туси совершил прорыв в сферической тригонометрии. Он также написал влиятельные работы по постулату параллельности Евклида. В XV веке Гиясетдин Каштси вычислил значение π до 16 десятичного знака. Каштси также имел алгоритм для вычисления корней степени n, который был особый случай методов, предложенных много столетий позже Руффини и Хорнер.", metadata={'source': 'https://ru.wikipedia.org/wiki/%D0%A5%D0%B8%D1%89%D1%83%D1%87%D0%BA%D0%B8', 'title': 'Хищушки — Википедия', 'language': 'ru'}), Document(page_content='В. В. Максимов, который продолжил традиции Н. Н. Лузина и А. Н. Колмогорова.', metadata={'source': 'https://ru.wikipedia.org/wiki/%D0%A5%D0%B8%D1%89%D1%83%D1%87%D0%BA%D0%B8', 'title': 'Хищушки — Википедия', 'language': 'ru'})]

Память

В LangChain память относится к возможности модели запоминать предыдущие части разговора или контекста. Это необходимо для поддержания непрерывности взаимодействия. Давайте используем ConversationBufferMemory для хранения и извлечения истории разговоров.

from langchain.memory import ConversationBufferMemory# Инициализация памяти буфера разговораmemory = ConversationBufferMemory(memory_key="chat_history")# Добавление сообщений в память разговорамemory.chat_memory.add_user_message("Привет!")memory.chat_memory.add_ai_message("Добро пожаловать! Чем я могу вам помочь?")# Загрузка переменных памяти, если они естьmemory.load_memory_variables({})>>>{'chat_history': 'Человек: Привет!\nИИ: Добро пожаловать! Чем я могу вам помочь?'}

Мы рассмотрим еще несколько примеров использования памяти в следующих разделах.

Цепи

LangChain цепи – это последовательности операций, обрабатывающих ввод и генерирующих вывод. Давайте рассмотрим пример создания пользовательской цепи для разработки ответа на электронную почту, основанного на предоставленной обратной связи:

from langchain.prompts import PromptTemplatefrom langchain.chains import ConversationChain, summarize, question_answeringfrom langchain.schema import StrOutputParser# Определение и использование цепи для резюмирования обратной связи клиентаfeedback_summary_prompt = PromptTemplate.from_template(    """Вы являетесь менеджером по обслуживанию клиентов. Учитывая обратную связь клиентов,         ваша задача - суммировать основные моменты.        Обратная связь клиента: {feedback}         Резюме:""")# Шаблон для составления ответа на бизнес-письмоemail_response_prompt = PromptTemplate.from_template(    """Вы являетесь представителем службы поддержки клиентов. Учитывая резюме обратной связи клиента,         ваша задача - написать профессиональный ответ на электронное письмо.         Резюме обратной связи:{summary}Электронный ответ:""")feedback_chain = feedback_summary_prompt | llm | StrOutputParser()email_chain = (    {"summary": feedback_chain}    | email_response_prompt    | llm    | StrOutputParser())# Использование цепи обратной связи с реальной обратной связью клиентаemail_chain.invoke(  {"feedback": "Разочарован доставкой с опозданием и плохой упаковкой."})>>>\n\nУважаемый [Клиент],\n\nБлагодарим вас за то, что уделили время и оставили отзыв о нашей работе. Мы приносим извинения за доставку с опозданием и качество упаковки. Удовлетворение клиентов является нашим приоритетом, и мы сожалеем, что не смогли оправдать ваши ожидания.\n\nВ настоящее время мы изучаем эту проблему и предпримем все необходимые меры для того, чтобы она не повторялась в будущем. Мы ценим вашу торговую марку и надеемся, что вы дадите нам еще один шанс предоставить вам улучшенный опыт.\n\nЕсли у вас возникнут дополнительные вопросы или проблемы, пожалуйста, не стесняйтесь связаться с нами.\n\nС уважением,\n[Ваше имя]

Как вы можете видеть, у нас есть две цепи: одна генерирует резюме обратной связи (feedback_chain), а другая генерирует ответ на электронную почту на основе резюме обратной связи (email_chain). Вышеуказанная цепь была создана с использованием языка выражений LangChain, рекомендуемого способа создания цепей согласно LangChain.

Мы также можем использовать предопределенные цепи, например, для задач резюмирования или простого вопросно-ответного диалога:

# Предопределенные цепи для резюмирования и вопросно-ответного диалогаchain = summarize.load_summarize_chain(llm, chain_type="stuff")chain.run(texts[:30])>>>История математики занимается историей открытий в математике и математических методов и записи в прошлом. Она началась в VI веке до н.э. с пифагорейцев, которые придумали термин «математика». Греческая математика значительно совершенствовала методы и расширяла предмет математики. Китайская математика внесла свой вклад, включая позиционную систему счисления и первое использование отрицательных чисел. Числовая система хинди-арабская и правила ее использования развивались на протяжении I тысячелетия н.э. в Индии и были переданы в Западный мир через исламскую математику. С древних времен до Средних веков периоды математических открытий часто сопровождались стагнацией на протяжении столетий. Начиная с Ренессанса в Италии в XV веке, новые математические разработки, взаимодействуя с новыми научными открытиями, происходят с увеличивающейся скоростью, которая продолжается и по сей день.

chain = question_answering.load_qa_chain(llm, chain_type="stuff")chain.run(input_documents=texts[:30],   question="Назовите величайших арабских математиков прошлого")>>>Мухаммад ибн Муса ал-Хорезми

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

# Использование памяти в цепи разговора
память = ConversationBufferMemory()
разговор = ConversationChain(llm=llm, память=память)
разговор.run("Назовите самую высокую гору в мире")>>>Самая высокая гора в мире - гора Эверест
разговор.run("Какова ее высота?")>>>Гора Эверест находится на высоте 8 848 метров (29 029 футов) над уровнем моря.

Агенты и инструменты

LangChain позволяет создавать пользовательские инструменты и агентов для специализированных задач. Пользовательские инструменты могут быть чем угодно, от вызова API до пользовательских функций Python, которые могут быть интегрированы в агенты LangChain для выполнения сложных операций. Давайте создадим агента, который будет приводить любое предложение к нижнему регистру.

из langchain.tools импортировать StructuredTool, BaseToolfrom langchain.agents импортировать initialize_agent, AgentTypeimport re# Определение и использование пользовательского инструмента обработки текста
def text_processing(string: str) -> str:    """Обработка текста"""    return string.lower()text_processing_tool = StructuredTool.from_function(text_processing)# Инициализация и использование агента с пользовательским инструментомagent = initialize_agent([text_processing_tool], llm,   agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)agent.run({"input": "Обработка текста: Лондон - столица Великобритании"})>>>> Вход в новую цепочку исполнителей агента... Мне нужно использовать инструмент обработки текстаДействие: text_processingВход в действие: Лондон - столица ВеликобританииИзмерение: Лондон - столица ВеликобританииМысли: Я знаю окончательный ответОкончательный ответ: Лондон - столица Великобритании> Завершение цепочки.'лондон - столица великобритании'

Как видите, наш агент использовал определенный нами инструмент и привел предложение к нижнему регистру. Теперь давайте создадим полнофункционального агента. Для этого мы создадим пользовательский инструмент для конвертации единиц (например, миль в километры) внутри текста и интегрируем его в разговорного агента, используя фреймворк LangChain. Класс UnitConversionTool демонстрирует практический пример расширения базовых функциональностей с конкретной логикой конвертации.

импортировать reиз langchain.tools импортировать BaseToolfrom langchain.agents импортировать initialize_agentclass UnitConversionTool(BaseTool):    """    Инструмент для преобразования американских единиц в международные единицы.    В частности, он преобразует мили в километры.    """    name = "Инструмент конвертации единиц"    description = "Преобразует американские единицы в международные единицы"    def _run(self, text: str):        """        Синхронно преобразует мили в тексте в километры.        Аргументы:            text (str): Входной текст, содержащий мили для преобразования.        Возвращает:            str: Текст с преобразованными милями в километры.        """        def miles_to_km(match):            miles = float(match.group(1))            return f"{miles * 1.60934:.2f} км"        return re.sub(r'\b(\d+(\.\d+)?)\s*(мили|миля)\b', miles_to_km, text)    def _arun(self, text: str):        """        Асинхронная версия функции преобразования. Пока не реализовано.        """        raise NotImplementedError("No async yet")# Инициализация агента с инструментом преобразования единицagent = initialize_agent(    agent='чатовый-реактивный-описание',    инструменты=[UnitConversionTool()],    llm=llm,    память=память)# Пример использования агента для преобразования единицagent.run("пять миль")>>> Пять миль примерно равно 8 километрам.agent.run("Извините, я имел в виду 15")>>> 15 километров примерно равно 9.3 милям

Это завершает представленный в моей одностраничной брошюре код. Надеюсь, вы нашли его полезным!

Напоминание: Вы можете загрузить PDF-версию, ознакомиться с одностраничниками на GitHub и запустить код в Colab.

Буду признателен, если вы похлопаете статью и подпишитесь на меня, так как это мотивирует меня писать новые части и статьи 🙂 Плюс, вы будете получать уведомления, когда новая часть будет опубликована.