никулец Од нула до напредно брзо инженерство со Langchain во Python - Unite.AI
Поврзете се со нас

Брзо инженерство

Од нула до напредно брзо инженерство со Langchain во Python

mm
Ажурирани on

Важен аспект на големите јазични модели (LLM) е бројот на параметри што овие модели ги користат за учење. Колку повеќе параметри има моделот, толку подобро може да ја разбере врската помеѓу зборовите и фразите. Ова значи дека моделите со милијарди параметри имаат капацитет да генерираат различни креативни формати на текст и да одговараат на отворени и предизвикувачки прашања на информативен начин.

LLM како што е ChatGPT, кои го користат моделот Transformer, се умешни во разбирање и генерирање на човечки јазик, што ги прави корисни за апликации кои бараат разбирање на природен јазик. Сепак, тие не се без нивните ограничувања, кои вклучуваат застарено знаење, неможност за интеракција со надворешни системи, недостаток на разбирање на контекстот, а понекогаш и генерирање на веродостојни, но неточни или бесмислени одговори, меѓу другото.

Решавањето на овие ограничувања бара интегрирање на LLM со надворешни извори и способности на податоци, што може да претставува сложеност и да бара обемни вештини за кодирање и ракување со податоци. Ова, заедно со предизвиците за разбирање на концептите за вештачка интелигенција и сложените алгоритми, придонесува за кривата на учење поврзана со развојот на апликации со користење на LLM.

Како и да е, интеграцијата на LLM со други алатки за формирање апликации напојувани со LLM може да го редефинира нашиот дигитален пејзаж. Потенцијалот на таквите апликации е огромен, вклучувајќи подобрување на ефикасноста и продуктивноста, поедноставување на задачите, подобрување на донесувањето одлуки и обезбедување персонализирани искуства.

Во оваа статија, ќе навлеземе подлабоко во овие прашања, истражувајќи ги напредните техники на брзо инженерство со Langchain, нудејќи јасни објаснувања, практични примери и чекор-по-чекор инструкции како да ги имплементирате.

Langchain, најсовремена библиотека, носи погодност и флексибилност за дизајнирање, имплементирање и подесување на инструкциите. Додека ги отпакуваме принципите и практиките на брзото инженерство, ќе научите како да ги користите моќните карактеристики на Langchain за да ги искористите силните страни на моделите со генеративна вештачка интелигенција SOTA како GPT-4.

Разбирање на инструкции

Пред да се нурне во техничките карактеристики на брзото инженерство, од суштинско значење е да се сфати концептот на инструкциите и нивното значење.

А 'брза' е низа од токени кои се користат како влез во јазичниот модел, наложувајќи му да генерира одреден тип на одговор. Потсетите играат клучна улога во управувањето со однесувањето на моделот. Тие можат да влијаат на квалитетот на генерираниот текст и кога се правилно изработени, може да му помогнат на моделот да обезбеди проникливи, точни и специфични резултати за контекстот.

Брзото инженерство е уметност и наука за дизајнирање ефективни инструкции. Целта е да се извлече саканиот излез од јазичниот модел. Со внимателно избирање и структуирање на потсетници, може да се води моделот кон генерирање попрецизни и релевантни одговори. Во пракса, ова вклучува дотерување на влезните фрази за да се задоволи обуката и структурните предрасуди на моделот.

Софистицираноста на брзото инженерство се движи од едноставни техники, како што е хранење на моделот со релевантни клучни зборови, до понапредни методи кои вклучуваат дизајнирање на сложени, структурирани потсетници кои ја користат внатрешната механика на моделот во негова корист.

Langchain: Најбрзо растечката брза алатка

LangChain, лансиран во октомври 2022 година од Харисон Чејс, стана еден од највисоко оценети рамки со отворен код на GitHub во 2023 година. Тој нуди поедноставен и стандардизиран интерфејс за инкорпорирање на големи јазични модели (LLM) во апликациите. Исто така, обезбедува интерфејс богат со карактеристики за брзо инженерство, дозволувајќи им на програмерите да експериментираат со различни стратегии и да ги проценат нивните резултати. Со користење на Langchain, можете поефективно и поинтуитивно да ги извршувате брзите инженерски задачи.

ЛангФлоу служи како кориснички интерфејс за оркестрирање на компонентите на LangChain во извршна шема на текови, овозможувајќи брзо прототипирање и експериментирање.

LangChain пополнува клучна празнина во развојот на вештачката интелигенција за масите. Овозможува низа NLP апликации како што се виртуелни асистенти, генератори на содржина, системи за одговарање прашања и многу повеќе, за решавање на низа реални проблеми.

Наместо да биде самостоен модел или провајдер, LangChain ја поедноставува интеракцијата со различни модели, проширувајќи ги можностите на LLM апликациите надвор од ограничувањата на едноставен повик API.

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

 

Главните компоненти на LangChain вклучуваат Model I/O, Prompt Templates, Memory, Agents и Chains.

Модел I/O

LangChain го олеснува беспрекорното поврзување со различни јазични модели така што ги обвиткува со стандардизиран интерфејс познат како Model I/O. Ова го олеснува прекинувачот за модел без напор за оптимизација или подобри перформанси. LangChain поддржува различни даватели на јазични модели, вклучително и OpenAI, Лице гушкање, Сино, Огномет, И многу повеќе.

Промптни шаблони

Тие се користат за управување и оптимизирање на интеракциите со 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 кој потоа се извршува за да се добие одговорот.
  • Генерички синџири, од друга страна, служат како градежни блокови за други синџири, но не можат директно да се користат самостојно. Овие синџири, како што е LLMCchain, се основни и често се комбинираат со други синџири за да се постигнат сложени задачи. На пример, LLMChain често се користи за пребарување на објект на јазичен модел со форматирање на влезот врз основа на обезбеден шаблон за промпт и потоа пренесување на јазичниот модел.

Чекор-по-чекор имплементација на брзо инженерство со Langchain

Ќе ве водиме низ процесот на спроведување на брзо инженерство со користење на Langchain. Пред да продолжите, проверете дали сте го инсталирале потребниот софтвер и пакети.

Можете да ги искористите популарните алатки како Docker, Conda, Pip и Poetry за поставување на LangChain. Релевантните датотеки за инсталација за секој од овие методи може да се најдат во складиштето LangChain на https://github.com/benman1/generative_ai_with_langchain. Ова вклучува а dockerfile за Докер, а барања.txt за Пип, а pyproject.toml за поезија, и а langchain_ai.yml поднесе за Конда.

Во нашата статија ќе го користиме Pip, стандардниот менаџер на пакети за Python, за да го олесниме инсталирањето и управувањето со библиотеки од трети страни. Ако не е вклучена во вашата дистрибуција на Python, можете да го инсталирате Pip следејќи ги упатствата на https://pip.pypa.io/.

За да инсталирате библиотека со Pip, користете ја командата pip install library_name.

Сепак, Pip не управува сам со околините. За да се справиме со различни средини, ја користиме алатката виртуелен.

Во следниот дел, ќе разговараме за интеграциите на моделите.

Чекор 1: Поставување Langchain

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

pip install langchain

Чекор 2: Увоз на Langchain и други потребни модули

Следно, увезете Langchain заедно со другите потребни модули. Овде, ние исто така ја увезуваме библиотеката за трансформатори, која интензивно се користи во задачите на НЛП.

import langchain
from transformers import AutoModelWithLMHead, AutoTokenizer

Чекор 3: Вчитајте го претходно обучениот модел

Отворете вештачка интелигенција

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 за да преземеме неодамнешни трудови поврзани со NLP:

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. Го користиме резимето на трудот и неговиот уникатен влезен ID (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 токени во едно возење додека GPT-4-8K и GPT-3.5-turbo поддржуваат 8,000 и 4,000 токени соодветно. Сепак, важно е да се забележи дека секоја интеракција со овие модели доаѓа со трошок кој е директно пропорционален на бројот на обработени токени, било да е тоа влезен или излез.

Во контекст на нашиот систем за прашања и одговори, ако парче академска литература ја надмине максималната граница на токен, системот нема да успее да го обработи во целост, што ќе влијае на квалитетот и комплетноста на одговорите. За да се реши ова прашање, текстот може да се расчлени на помали делови кои се во согласност со ограничувањето на токен.

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 е водечки во поедноставувањето на оваа сложена задача. Неговиот стандардизиран интерфејс, флексибилните шаблони за брзи информации, робусната интеграција на моделите и иновативната употреба на агенти и синџири обезбедуваат оптимални резултати за перформансите на LLM.

Сепак, и покрај овие достигнувања, има неколку совети што треба да ги имате на ум. Како што користите Langchain, од суштинско значење е да разберете дека квалитетот на излезот во голема мера зависи од фразата на известувањето. Експериментирањето со различни брзи стилови и структури може да даде подобри резултати. Исто така, запомнете дека иако Langchain поддржува различни јазични модели, секој од нив има свои силни и слаби страни. Клучно е да се избере вистинскиот за вашата специфична задача. И на крај, важно е да се запамети дека користењето на овие модели доаѓа со размислувања за трошоците, бидејќи обработката на токени директно влијае на цената на интеракциите.

Како што е прикажано во водичот чекор-по-чекор, Langchain може да напојува робусни апликации, како што е системот за прашања и одговори за академска литература. Со растечката заедница на корисници и зголемената важност во пејзажот со отворен код, Langchain ветува дека ќе биде клучна алатка за искористување на целосниот потенцијал на LLM како GPT-4.

Изминатите пет години ги поминав потопувајќи се во фасцинантниот свет на машинското учење и длабокото учење. Мојата страст и експертиза ме наведоа да придонесам за над 50 различни проекти за софтверско инженерство, со посебен фокус на AI/ML. Мојата постојана љубопитност, исто така, ме привлече кон Обработка на природни јазици, поле кое јас сум желен да го истражам понатаму.