заглушки Від нуля до розширеного оперативного проектування з Langchain у Python - Unite.AI
Зв'язатися з нами

Оперативна інженерія

Від нуля до розширеної оперативної розробки з Langchain у Python

mm
оновлений on

Важливим аспектом великих мовних моделей (LLM) є кількість параметрів, які ці моделі використовують для навчання. Чим більше параметрів має модель, тим краще вона може зрозуміти зв’язок між словами та фразами. Це означає, що моделі з мільярдами параметрів можуть генерувати різноманітні креативні текстові формати та інформативно відповідати на відкриті та складні запитання.

LLM, такі як ChatGPT, які використовують модель Transformer, добре розуміють і генерують людську мову, що робить їх корисними для програм, які вимагають розуміння природної мови. Однак вони не позбавлені своїх обмежень, які включають застарілі знання, нездатність взаємодіяти із зовнішніми системами, відсутність розуміння контексту та інколи створення правдоподібних, але неправильних або безглуздих відповідей, серед іншого.

Усунення цих обмежень вимагає інтеграції LLM із зовнішніми джерелами даних і можливостями, що може спричинити складності та вимагати значних навичок кодування та обробки даних. Це, у поєднанні з труднощами розуміння концепцій ШІ та складних алгоритмів, сприяє кривій навчання, пов’язаній із розробкою програм із використанням LLM.

Тим не менш, інтеграція LLM з іншими інструментами для створення додатків на базі LLM може змінити наш цифровий ландшафт. Потенціал таких програм величезний, включаючи підвищення ефективності та продуктивності, спрощення завдань, покращення процесу прийняття рішень і надання персоналізованого досвіду.

У цій статті ми глибше заглибимося в ці питання, досліджуючи передові методи оперативного проектування з Langchain, пропонуючи чіткі пояснення, практичні приклади та покрокові інструкції щодо їх впровадження.

Langchain, найсучасніша бібліотека, забезпечує зручність і гнучкість у розробці, реалізації та налаштуванні підказок. Коли ми розкриваємо принципи та методи швидкого проектування, ви дізнаєтеся, як використовувати потужні функції Langchain, щоб використовувати сильні сторони моделей SOTA Generative AI, таких як GPT-4.

Розуміння підказок

Перш ніж занурюватися в технічну інженерію підказок, важливо зрозуміти концепцію підказок та їхнє значення.

А 'підказка' — це послідовність токенів, які використовуються як вхідні дані для мовної моделі, вказуючи їй генерувати певний тип відповіді. Підказки відіграють вирішальну роль у керуванні поведінкою моделі. Вони можуть вплинути на якість створеного тексту, а якщо їх правильно сформувати, можуть допомогти моделі надати точні, точні та контекстно-залежні результати.

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

Складність розробки підказок варіюється від простих прийомів, таких як подача моделі релевантних ключових слів, до більш просунутих методів, що передбачають розробку складних, структурованих підказок, які використовують внутрішню механіку моделі в своїх інтересах.

Langchain: найшвидше зростаючий інструмент підказок

LangChain, запущений у жовтні 2022 року Гаррісон Чейз, став одним із найбільш високо оцінені фреймворки з відкритим кодом на GitHub у 2023 році. Він пропонує спрощений і стандартизований інтерфейс для включення великих мовних моделей (LLM) у програми. Він також надає багатофункціональний інтерфейс для оперативного проектування, дозволяючи розробникам експериментувати з різними стратегіями та оцінювати їхні результати. Використовуючи Langchain, ви можете виконувати оперативні інженерні завдання більш ефективно та інтуїтивно зрозуміло.

LangFlow служить інтерфейсом користувача для оркестровки компонентів LangChain у виконувану блок-схему, що дозволяє швидко створювати прототипи та експериментувати.

LangChain заповнює вирішальну прогалину в розробці ШІ для мас. Він дає змогу використовувати низку додатків NLP, таких як віртуальні помічники, генератори контенту, системи відповідей на запитання тощо, для вирішення ряду проблем реального світу.

Замість того, щоб бути окремою моделлю чи постачальником, LangChain спрощує взаємодію з різноманітними моделями, розширюючи можливості програм LLM за межі обмежень простого виклику API.

Архітектура LangChain

 

Основні компоненти LangChain включають модель вводу-виводу, шаблони підказок, пам’ять, агенти та ланцюги.

Модель I/O

LangChain забезпечує плавне з’єднання з різними мовними моделями, обгортаючи їх стандартизованим інтерфейсом, відомим як Model I/O. Це полегшує перемикання моделі для оптимізації або підвищення продуктивності. LangChain підтримує різні постачальники мовних моделей, у тому числі OpenAI, HuggingFace, Лазурний, ФеєрверкІ багато іншого.

Шаблони підказок

Вони використовуються для керування та оптимізації взаємодії з LLM шляхом надання стислих інструкцій або прикладів. Оптимізація підказок покращує продуктивність моделі, а їх гнучкість значно сприяє процесу введення.

Простий приклад шаблону запиту:

from langchain.prompts import PromptTemplate
prompt = PromptTemplate(input_variables=["subject"],
template="What are the recent advancements in the field of {subject}?")
print(prompt.format(subject="Natural Language Processing"))

У міру ускладнення ми стикаємося з більш складними шаблонами в LangChain, такими як шаблон «Розумни і дій» (ReAct). ReAct — це життєво важливий шаблон для виконання дії, коли агент призначає завдання відповідному інструменту, налаштовує для нього вхідні дані та аналізує його вихідні дані для виконання завдання. Наведений нижче приклад Python демонструє шаблон ReAct. Він демонструє, як підказка структурована в LangChain, використовуючи низку думок і дій для обґрунтування проблеми та отримання остаточної відповіді:

PREFIX = """Answer the following question using the given tools:"""
FORMAT_INSTRUCTIONS = """Follow this format:
Question: {input_question}
Thought: your initial thought on the question
Action: your chosen action from [{tool_names}]
Action Input: your input for the action
Observation: the action's outcome"""
SUFFIX = """Start!
Question: {input}
Thought:{agent_scratchpad}"""

пам'ять

Пам'ять є критично важливою концепцією в LangChain, що дозволяє LLM та інструментам зберігати інформацію з часом. Ця поведінка із збереженням стану покращує продуктивність додатків LangChain, зберігаючи попередні відповіді, дії користувачів, стан середовища та цілі агента. Стратегії ConversationBufferMemory і ConversationBufferWindowMemory допомагають відстежувати повну або недавню частину розмови відповідно. Для більш складного підходу стратегія ConversationKGMemory дозволяє кодувати розмову як граф знань, який можна повертати в підказки або використовувати для прогнозування відповідей без виклику LLM.

Агенти

Агент взаємодіє зі світом, виконуючи дії та завдання. У LangChain агенти поєднують інструменти та ланцюжки для виконання завдань. Він може встановити зв’язок із зовнішнім світом для пошуку інформації для розширення знань LLM, таким чином подолавши їхні властиві обмеження. Вони можуть вирішити передати обчислення калькулятору або інтерпретатору Python залежно від ситуації.

Агенти оснащені підкомпонентами:

  • Tools: Це функціональні компоненти.
  • Інструментарій: Збірники інструментів.
  • Агент Виконавці: це механізм виконання, який дозволяє вибирати між інструментами.

Агенти в LangChain також дотримуються шаблону Zero-shot ReAct, де рішення ґрунтується лише на описі інструменту. Цей механізм можна розширити пам'яттю, щоб врахувати повну історію розмов. За допомогою ReAct замість того, щоб просити магістра автозаповнити ваш текст, ви можете запропонувати йому відповісти в циклі думки/дії/спостереження.

Ланцюги

Ланцюжки, як випливає з цього терміну, — це послідовності операцій, які дозволяють бібліотеці LangChain безперебійно обробляти вхідні та вихідні дані мовної моделі. Ці невід’ємні компоненти LangChain в основному складаються з посилань, які можуть бути іншими ланцюжками, або примітивами, такими як підказки, мовні моделі або утиліти.

Уявіть собі ланцюг як конвеєр на заводі. Кожен крок на цьому поясі представляє певну операцію, якою може бути виклик мовної моделі, застосування функції Python до тексту або навіть підказка моделі певним чином.

LangChain класифікує свої ланцюжки на три типи: ланцюжки корисних, загальні ланцюжки та ланцюжки комбінованих документів. Для нашого обговорення ми зануримося в Utility і Generic ланцюжки.

  • Інженерні ланцюги спеціально розроблені для отримання точних відповідей з мовних моделей для вузько визначених завдань. Наприклад, давайте поглянемо на LLMMathChain. Цей ланцюжок утиліт дозволяє мовним моделям виконувати математичні обчислення. Він приймає запитання природною мовою, а модель мови, у свою чергу, генерує фрагмент коду Python, який потім виконується для отримання відповіді.
  • Загальні ланцюги, з іншого боку, служать будівельними блоками для інших ланцюжків, але не можуть використовуватися окремо. Ці ланцюги, такі як LLMChain, є основоположними та часто поєднуються з іншими ланцюгами для виконання складних завдань. Наприклад, LLMChain часто використовується для запиту об’єкта мовної моделі шляхом форматування вхідних даних на основі наданого шаблону запиту та передачі його в мовну модель.

Покрокове впровадження оперативного проектування з Langchain

Ми проведемо вас через процес впровадження оперативного проектування за допомогою Langchain. Перш ніж продовжити, переконайтеся, що ви встановили необхідне програмне забезпечення та пакети.

Ви можете скористатися такими популярними інструментами, як Docker, Conda, Pip і Poetry, для налаштування LangChain. Відповідні інсталяційні файли для кожного з цих методів можна знайти в репозиторії LangChain за адресою https://github.com/benman1/generative_ai_with_langchain. Це включає а Докер-файл для Docker, a вимоги.txt для Піп, а pyproject.toml для поезії та а langchain_ai.yml файл для Conda.

У нашій статті ми будемо використовувати Pip, стандартний менеджер пакунків для Python, щоб полегшити встановлення та керування бібліотеками сторонніх розробників. Якщо його немає у вашому дистрибутиві Python, ви можете встановити Pip, дотримуючись інструкцій на сторінці https://pip.pypa.io/.

Щоб установити бібліотеку з Pip, скористайтеся командою pip install library_name.

Однак Піп не керує середовищем самостійно. Для обробки різних середовищ ми використовуємо інструмент virtualenv.

У наступному розділі ми обговоримо інтеграцію моделі.

Крок 1: Налаштування Langchain

Спочатку вам потрібно встановити пакет Langchain. Ми використовуємо ОС Windows. Виконайте таку команду у вашому терміналі, щоб встановити його:

pip install langchain

Крок 2: Імпорт Langchain та інших необхідних модулів

Далі імпортуйте Langchain разом з іншими необхідними модулями. Тут ми також імпортуємо бібліотеку transformers, яка широко використовується в завданнях NLP.

import langchain
from transformers import AutoModelWithLMHead, AutoTokenizer

Крок 3: Завантажте попередньо підготовлену модель

Відкрити AI

OpenAI моделі можна зручно інтерфейсувати з бібліотекою LangChain або клієнтською бібліотекою OpenAI Python. Зокрема, OpenAI надає клас Embedding для моделей вбудованого тексту. Дві ключові моделі LLM — GPT-3.5 і GPT-4, які відрізняються головним чином довжиною токена. Ціни на кожну модель можна знайти на веб-сайті OpenAI. Поки є ще складні моделі, такі як GPT-4-32K які мають вищу прийнятність токенів, їх доступність через API не завжди гарантовано.

Для доступу до цих моделей потрібен ключ OpenAI API. Це можна зробити, створивши обліковий запис на платформі OpenAI, налаштувавши платіжну інформацію та згенерувавши новий секретний ключ.

import os
os.environ["OPENAI_API_KEY"] = 'your-openai-token'

Після успішного створення ключа ви можете встановити його як змінну середовища (OPENAI_API_KEY) або передати як параметр під час створення екземпляра класу для викликів OpenAI.

Розглянемо сценарій LangChain, щоб продемонструвати взаємодію з моделями OpenAI:

from langchain.llms import OpenAI
llm = OpenAI(model_name="text-davinci-003")
# The LLM takes a prompt as an input and outputs a completion
prompt = "who is the president of the United States of America?"
completion = llm(prompt)
The current President of the United States of America is Joe Biden.

У цьому прикладі агент ініціалізується для виконання обчислень. Агент приймає вхідні дані, просте завдання додавання, обробляє їх за допомогою наданої моделі OpenAI і повертає результат.

Обіймати обличчя

Обіймати обличчя це БЕЗКОШТОВНИЙ ДЛЯ ВИКОРИСТАННЯ Бібліотека Transformers Python, сумісна з PyTorch, TensorFlow і JAX, включає в себе реалізацію таких моделей, як БЕРТ, T5, І т.д.

Hugging Face також пропонує Hugging Face Hub, платформу для розміщення сховищ коду, моделей машинного навчання, наборів даних і веб-додатків.

Щоб використовувати Hugging Face як постачальника для своїх моделей, вам знадобиться обліковий запис і ключі API, які можна отримати на веб-сайті компанії. Маркер можна зробити доступним у вашому середовищі як HUGGINGFACEHUB_API_TOKEN.

Розглянемо наступний фрагмент Python, який використовує модель Flan-T5-XXL з відкритим кодом, розроблену Google:

from langchain.llms import HuggingFaceHub
llm = HuggingFaceHub(model_kwargs={"temperature": 0.5, "max_length": 64},repo_id="google/flan-t5-xxl")
prompt = "In which country is Tokyo?"
completion = llm(prompt)
print(completion)

Цей сценарій приймає запитання як вхідні дані та повертає відповідь, демонструючи знання та можливості прогнозування моделі.

Крок 4: базова підказка

Для початку ми згенеруємо просту підказку та подивимось, як модель відреагує.

prompt = 'Translate the following English text to French: "{0}"'
input_text = 'Hello, how are you?'
input_ids = tokenizer.encode(prompt.format(input_text), return_tensors='pt')
generated_ids = model.generate(input_ids, max_length=100, temperature=0.9)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=True))

У наведеному вище фрагменті коду ми надаємо підказку для перекладу англійського тексту на французьку. Потім мовна модель намагається перекласти заданий текст на основі підказки.

Крок 5: розширена швидка інженерія

Хоча наведений вище підхід працює нормально, він не використовує повною мірою переваги оперативного проектування. Давайте вдосконалимо його, ввівши кілька складніших структур підказок.

prompt = 'As a highly proficient French translator, translate the following English text to French: "{0}"'
input_text = 'Hello, how are you?'
input_ids = tokenizer.encode(prompt.format(input_text), return_tensors='pt')
generated_ids = model.generate(input_ids, max_length=100, temperature=0.9)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=True))

У цьому фрагменті коду ми змінюємо підказку, щоб припустити, що переклад виконує «висококваліфікований французький перекладач». Зміни в підказці можуть призвести до покращення перекладів, оскільки модель тепер передбачає роль експерта.

Створення системи запитань і відповідей з академічної літератури за допомогою Langchain

Ми створимо систему запитань і відповідей з академічної літератури за допомогою LangChain, яка зможе відповідати на запитання щодо нещодавно опублікованих наукових робіт.

По-перше, щоб налаштувати наше середовище, ми встановлюємо необхідні залежності.

pip install langchain arxiv openai transformers faiss-cpu

Після встановлення ми створюємо новий блокнот Python та імпортуємо необхідні бібліотеки:

from langchain.llms import OpenAI
from langchain.chains.qa_with_sources import load_qa_with_sources_chain
from langchain.docstore.document import Document
import arxiv

Основою нашої системи запитань і відповідей є можливість отримувати релевантні академічні роботи, пов’язані з певною галуззю, тут ми розглядаємо обробку природної мови (NLP), використовуючи академічну базу даних arXiv. Для цього ми визначаємо функцію get_arxiv_data(max_results=10). Ця функція збирає найновіші резюме документів NLP з arXiv і інкапсулює їх в об’єкти LangChain Document, використовуючи резюме як вміст і унікальний ідентифікатор запису як джерело.

Ми використаємо arXiv API, щоб отримати останні статті, пов’язані з НЛП:

def get_arxiv_data(max_results=10):
    search = arxiv.Search(
        query="NLP",
        max_results=max_results,
        sort_by=arxiv.SortCriterion.SubmittedDate,
    )
   
    documents = []
   
    for result in search.results():
        documents.append(Document(
            page_content=result.summary,
            metadata={"source": result.entry_id},
        ))
    return documents

Ця функція отримує резюме найновіших документів NLP з arXiv і перетворює їх на об’єкти LangChain Document. Ми використовуємо резюме статті та її унікальний ідентифікатор запису (URL-адреса статті) як вміст і джерело відповідно.

def print_answer(question):
    print(
        chain(
            {
                "input_documents": sources,
                "question": question,
            },
            return_only_outputs=True,
        )["output_text"]
    )                 

Давайте визначимо наш корпус і налаштуємо LangChain:

sources = get_arxiv_data(2)
chain = load_qa_with_sources_chain(OpenAI(temperature=0))

Оскільки наша академічна система запитань і відповідей уже готова, ми можемо перевірити її, поставивши запитання:

print_answer("What are the recent advancements in NLP?")

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

Recent advancements in NLP include Retriever-augmented instruction-following models and a novel computational framework for solving alternating current optimal power flow (ACOPF) problems using graphics processing units (GPUs).
SOURCES: http://arxiv.org/abs/2307.16877v1, http://arxiv.org/abs/2307.16830v1

Ви можете легко перемикати моделі або змінювати систему відповідно до ваших потреб. Наприклад, тут ми переходимо до GPT-4, що в результаті дає нам набагато кращу та детальну відповідь.

sources = get_arxiv_data(2)
chain = load_qa_with_sources_chain(OpenAI(model_name="gpt-4",temperature=0))
Recent advancements in Natural Language Processing (NLP) include the development of retriever-augmented instruction-following models for information-seeking tasks such as question answering (QA). These models can be adapted to various information domains and tasks without additional fine-tuning. However, they often struggle to stick to the provided knowledge and may hallucinate in their responses. Another advancement is the introduction of a computational framework for solving alternating current optimal power flow (ACOPF) problems using graphics processing units (GPUs). This approach utilizes a single-instruction, multiple-data (SIMD) abstraction of nonlinear programs (NLP) and employs a condensed-space interior-point method (IPM) with an inequality relaxation strategy. This strategy allows for the factorization of the KKT matrix without numerical pivoting, which has previously hampered the parallelization of the IPM algorithm.
SOURCES: http://arxiv.org/abs/2307.16877v1, http://arxiv.org/abs/2307.16830v1

Маркер у GPT-4 може бути коротким, як один символ, або одним словом. Наприклад, GPT-4-32K може обробляти до 32,000 4 токенів за один запуск, а GPT-8-3.5K і GPT-8,000-turbo підтримують 4,000 XNUMX і XNUMX XNUMX токенів відповідно. Однак важливо зазначити, що кожна взаємодія з цими моделями пов’язана з вартістю, яка прямо пропорційна кількості оброблених токенів, будь то введення чи вихід.

У контексті нашої системи запитань і відповідей, якщо фрагмент наукової літератури перевищує максимальний ліміт маркерів, система не зможе обробити його повністю, що вплине на якість і повноту відповідей. Щоб вирішити цю проблему, текст можна розбити на менші частини, які відповідають обмеженню маркерів.

FAISS (Пошук схожості на Facebook) допомагає швидко знаходити найбільш релевантні фрагменти тексту, пов’язані із запитом користувача. Він створює векторне представлення кожного фрагмента тексту та використовує ці вектори для ідентифікації та отримання фрагментів, найбільш схожих на векторне представлення певного запитання.

Важливо пам’ятати, що навіть за використання таких інструментів, як FAISS, необхідність розділити текст на менші фрагменти через обмеження маркерів іноді може призвести до втрати контексту, що вплине на якість відповідей. Тому під час роботи з цими великими мовними моделями вирішальними є ретельне керування та оптимізація використання токенів.

 
pip install faiss-cpu langchain CharacterTextSplitter

Переконавшись, що зазначені вище бібліотеки встановлені, запустіть

 
from langchain.embeddings.openai import OpenAIEmbeddings 
from langchain.vectorstores.faiss import FAISS 
from langchain.text_splitter import CharacterTextSplitter 
documents = get_arxiv_data(max_results=10) # We can now use feed more data
document_chunks = []
splitter = CharacterTextSplitter(separator=" ", chunk_size=1024, chunk_overlap=0)
for document in documents:
    for chunk in splitter.split_text(document.page_content):
        document_chunks.append(Document(page_content=chunk, metadata=document.metadata))
search_index = FAISS.from_documents(document_chunks, OpenAIEmbeddings())
chain = load_qa_with_sources_chain(OpenAI(temperature=0))
def print_answer(question):
    print(
        chain(
            {
                "input_documents": search_index.similarity_search(question, k=4),
                "question": question,
            },
            return_only_outputs=True,
        )["output_text"]
    )

Після завершення коду у нас є потужний інструмент для запиту найновішої академічної літератури в галузі НЛП.

 
Recent advancements in NLP include the use of deep neural networks (DNNs) for automatic text analysis and natural language processing (NLP) tasks such as spell checking, language detection, entity extraction, author detection, question answering, and other tasks. 
SOURCES: http://arxiv.org/abs/2307.10652v1, http://arxiv.org/abs/2307.07002v1, http://arxiv.org/abs/2307.12114v1, http://arxiv.org/abs/2307.16217v1 

Висновок

Інтеграція великих мовних моделей (LLM) у програми прискорила впровадження кількох областей, зокрема мовного перекладу, аналізу настроїв та пошуку інформації. Швидке проектування є потужним інструментом для максимального використання потенціалу цих моделей, і Langchain є лідером у спрощенні цього складного завдання. Його стандартизований інтерфейс, гнучкі шаблони підказок, надійна інтеграція моделі та інноваційне використання агентів і ланцюжків забезпечують оптимальні результати для роботи LLM.

Однак, незважаючи на ці досягнення, є кілька порад, про які слід пам’ятати. Коли ви використовуєте Langchain, важливо розуміти, що якість результату значною мірою залежить від формулювання підказки. Експериментування з різними стилями та структурами підказок може дати кращі результати. Крім того, пам’ятайте, що хоча Langchain підтримує різноманітні мовні моделі, кожна з них має свої сильні та слабкі сторони. Вибір правильного для вашого конкретного завдання має вирішальне значення. Нарешті, важливо пам’ятати, що використання цих моделей пов’язане з витратами, оскільки обробка токенів безпосередньо впливає на вартість взаємодії.

Як показано в покроковому посібнику, Langchain може працювати з надійними програмами, такими як система запитань і відповідей з академічної літератури. Зі зростаючою спільнотою користувачів і зростаючою популярністю в середовищі відкритого коду Langchain обіцяє стати ключовим інструментом у використанні повного потенціалу LLM, як-от GPT-4.

Останні п’ять років я провів, занурюючись у захоплюючий світ машинного та глибокого навчання. Моя пристрасть і досвід допомогли мені внести свій внесок у понад 50 різноманітних проектів розробки програмного забезпечення, зосередивши особливу увагу на ШІ/ML. Моя постійна цікавість також привела мене до обробки природної мови, галузі, яку я хочу досліджувати далі.