кочан Zero to Advanced Prompt Engineering с Langchain в Python - Unite.AI
Свържете се с нас

Бърз инженеринг

Zero to Advanced Prompt Engineering с Langchain в Python

mm
Обновено on

Важен аспект на големите езикови модели (LLM) е броят на параметрите, които тези модели използват за обучение. Колкото повече параметри има един модел, толкова по-добре той може да разбере връзката между думи и фрази. Това означава, че моделите с милиарди параметри имат капацитета да генерират различни творчески текстови формати и да отговарят на отворени и предизвикателни въпроси по информативен начин.

LLM като ChatGPT, които използват модела Transformer, са опитни в разбирането и генерирането на човешки език, което ги прави полезни за приложения, които изискват разбиране на естествен език. Те обаче не са лишени от своите ограничения, които включват остарели знания, неспособност за взаимодействие с външни системи, липса на разбиране на контекста и понякога генериране на правдоподобно звучащи, но неправилни или безсмислени отговори, наред с други.

Справянето с тези ограничения изисква интегриране на LLM с външни източници на данни и възможности, което може да представлява сложност и да изисква задълбочени умения за кодиране и работа с данни. Това, съчетано с предизвикателствата на разбирането на AI концепции и сложни алгоритми, допринася за кривата на обучение, свързана с разработването на приложения, използващи LLM.

Независимо от това, интегрирането на LLMs с други инструменти за формиране на базирани на LLM приложения може да предефинира нашия цифров пейзаж. Потенциалът на такива приложения е огромен, включително подобряване на ефективността и производителността, опростяване на задачите, подобряване на вземането на решения и предоставяне на персонализирани изживявания.

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

Langchain, най-съвременна библиотека, носи удобство и гъвкавост при проектиране, внедряване и настройка на подкани. Докато разопаковаме принципите и практиките на бързото инженерство, ще научите как да използвате мощните функции на Langchain, за да се възползвате от силните страни на SOTA Generative AI модели като GPT-4.

Разбиране на подканите

Преди да се потопите в техническите аспекти на бързото инженерство, важно е да разберете концепцията за подканите и тяхното значение.

Абърз' е поредица от токени, които се използват като входни данни към езиков модел, инструктирайки го да генерира определен тип отговор. Подканите играят решаваща роля в управлението на поведението на модела. Те могат да повлияят на качеството на генерирания текст и когато са изработени правилно, могат да помогнат на модела да осигури проницателни, точни и контекстно-специфични резултати.

Бързото инженерство е изкуството и науката за проектиране на ефективни подкани. Целта е да се извлече желания резултат от езиков модел. Чрез внимателно подбиране и структуриране на подкани, човек може да насочи модела към генериране на по-точни и подходящи отговори. На практика това включва фина настройка на входните фрази, за да се погрижат за обучението на модела и структурните отклонения.

Сложността на бързото инженерство варира от прости техники, като захранване на модела с подходящи ключови думи, до по-усъвършенствани методи, включващи проектиране на сложни, структурирани подсказки, които използват вътрешната механика на модела в своя полза.

Langchain: Най-бързо развиващият се инструмент за подсказки

LangChain, стартирана през октомври 2022 г. от Харисън Чейс, се превърна в един от най-високо оценените рамки с отворен код на GitHub през 2023 г. Той предлага опростен и стандартизиран интерфейс за включване на големи езикови модели (LLM) в приложения. Той също така предоставя богат на функции интерфейс за бързо инженерство, което позволява на разработчиците да експериментират с различни стратегии и да оценят техните резултати. Използвайки Langchain, можете да изпълнявате бързи инженерни задачи по-ефективно и интуитивно.

LangFlow служи като потребителски интерфейс за оркестриране на компоненти на LangChain в изпълнима блок-схема, което позволява бързо създаване на прототипи и експериментиране.

LangChain запълва решаваща празнина в развитието на AI за масите. Той позволява набор от NLP приложения, като виртуални асистенти, генератори на съдържание, системи за отговаряне на въпроси и други, за решаване на редица проблеми от реалния свят.

Вместо да бъде самостоятелен модел или доставчик, LangChain опростява взаимодействието с различни модели, разширявайки възможностите на LLM приложенията отвъд ограниченията на обикновено API извикване.

Архитектурата на LangChain

 

Основните компоненти на LangChain включват I/O модел, шаблони за подсказки, памет, агенти и вериги.

Модел 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, като модела Reason and Act (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 в зависимост от ситуацията.

Агентите са оборудвани с подкомпоненти:

  • Инструменти: Това са функционални компоненти.
  • Пособия: Сборници инструменти.
  • Агент-изпълнители: Това е механизмът за изпълнение, който позволява избор между инструменти.

Агентите в LangChain също следват модела Zero-shot ReAct, където решението се основава само на описанието на инструмента. Този механизъм може да бъде разширен с памет, за да се вземе предвид пълната история на разговорите. С ReAct, вместо да поискате LLM да допълни автоматично вашия текст, можете да го подканите да отговори в цикъл мисъл/действие/наблюдение.

Окови

Веригите, както подсказва терминът, са последователности от операции, които позволяват на библиотеката 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.

Pip обаче не управлява сам среди. За да се справим с различни среди, ние използваме инструмента virtualenv.

В следващия раздел ще обсъдим интеграциите на модела.

Стъпка 1: Настройване на Langchain

Първо, трябва да инсталирате пакета Langchain. Ние използваме Windows OS. Изпълнете следната команда във вашия терминал, за да го инсталирате:

pip install langchain

Стъпка 2: Импортиране на Langchain и други необходими модули

След това импортирайте Langchain заедно с други необходими модули. Тук също импортираме библиотеката transformers, която се използва широко в NLP задачи.

import langchain
from transformers import AutoModelWithLMHead, AutoTokenizer

Стъпка 3: Заредете предварително обучен модел

Отворете AI

OpenAI моделите могат да бъдат удобно свързани с библиотеката LangChain или клиентската библиотека OpenAI Python. По-специално, OpenAI предоставя клас за вграждане за модели за вграждане на текст. Два ключови 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, който използва модел с отворен код, разработен от Google, моделът Flan-T5-XXL:

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 AI Similarity Search) помага за бързото намиране на най-подходящите текстови части, свързани със заявката на потребителя. Той създава векторно представяне на всяка текстова част и използва тези вектори за идентифициране и извличане на частите, които са най-сходни с векторното представяне на даден въпрос.

Важно е да запомните, че дори при използването на инструменти като 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 е водеща в опростяването на тази сложна задача. Неговият стандартизиран интерфейс, гъвкави шаблони за подкана, стабилна интеграция на модела и иновативното използване на агенти и вериги гарантират оптимални резултати за представянето на LLMs.

Въпреки този напредък обаче има няколко съвета, които трябва да имате предвид. Когато използвате Langchain, важно е да разберете, че качеството на изхода зависи в голяма степен от формулировката на подканата. Експериментирането с различни подканващи стилове и структури може да доведе до по-добри резултати. Освен това не забравяйте, че докато Langchain поддържа различни езикови модели, всеки от тях има своите силни и слаби страни. Изборът на правилния за вашата конкретна задача е от решаващо значение. И накрая, важно е да запомните, че използването на тези модели е свързано с разходи, тъй като обработката на токени влияе пряко върху цената на взаимодействията.

Както е показано в ръководството стъпка по стъпка, Langchain може да захранва стабилни приложения, като системата за въпроси и отговори за академична литература. С нарастваща потребителска общност и нарастваща известност в пейзажа с отворен код, Langchain обещава да бъде основен инструмент за овладяване на пълния потенциал на LLM като GPT-4.

Прекарах последните пет години, потапяйки се в завладяващия свят на машинното обучение и дълбокото обучение. Моята страст и опит ме накараха да допринеса за над 50 различни проекта за софтуерно инженерство, със специален фокус върху AI/ML. Продължаващото ми любопитство също ме насочи към обработката на естествен език, област, която нямам търпение да проуча по-нататък.