Spojte se s námi

Prompt Engineering

Od nuly k pokročilému rychlému inženýrství s Langchainem v Pythonu

mm

Důležitým aspektem velkých jazykových modelů (LLM) je počet parametrů, které tyto modely používají pro učení. Čím více parametrů má model, tím lépe dokáže porozumět vztahu mezi slovy a frázemi. To znamená, že modely s miliardami parametrů mají kapacitu generovat různé kreativní textové formáty a informativním způsobem odpovídat na otevřené a náročné otázky.

LLM, jako je ChatGPT, které využívají model Transformer, jsou zdatné v porozumění a generování lidského jazyka, což je činí užitečnými pro aplikace, které vyžadují porozumění přirozenému jazyku. Nejsou však bez omezení, mezi něž patří mimo jiné zastaralé znalosti, neschopnost interagovat s externími systémy, nedostatečné porozumění kontextu a někdy generující věrohodně znějící, ale nesprávné nebo nesmyslné odpovědi.

Řešení těchto omezení vyžaduje integraci LLM s externími datovými zdroji a schopnostmi, což může představovat složitost a vyžadovat rozsáhlé dovednosti v oblasti kódování a zpracování dat. To spolu s výzvami k pochopení konceptů umělé inteligence a složitých algoritmů přispívá ke křivce učení spojené s vývojem aplikací využívajících LLM.

Nicméně integrace LLM s dalšími nástroji pro vytváření aplikací založených na LLM by mohla předefinovat naši digitální krajinu. Potenciál takových aplikací je obrovský, včetně zlepšení efektivity a produktivity, zjednodušení úkolů, zlepšení rozhodování a poskytování personalizovaných zážitků.

V tomto článku se do těchto problémů ponoříme hlouběji, prozkoumáme pokročilé techniky rychlého inženýrství s Langchainem, nabídneme jasná vysvětlení, praktické příklady a podrobné pokyny, jak je implementovat.

Langchain, nejmodernější knihovna, přináší pohodlí a flexibilitu při navrhování, implementaci a ladění výzev. Když rozbalíme principy a postupy rychlého inženýrství, naučíte se, jak využívat výkonné funkce Langchainu k využití silných stránek generativních modelů SOTA AI, jako je GPT-4.

Porozumění výzvám

Než se ponoříme do technických aspektů rychlého inženýrství, je nezbytné pochopit pojem výzvy a jejich význam.

A 'prompt' je posloupnost tokenů, které se používají jako vstup do jazykového modelu a dávají mu pokyn ke generování určitého typu odpovědi. Výzvy hrají klíčovou roli při řízení chování modelu. Mohou ovlivnit kvalitu generovaného textu, a když jsou správně vytvořeny, mohou pomoci modelu poskytovat srozumitelné, přesné a kontextově specifické výsledky.

Výzvové inženýrství je umění a věda navrhování účinných výzev. Cílem je vyvolat požadovaný výstup z jazykového modelu. Pečlivým výběrem a strukturováním výzev lze model vést ke generování přesnějších a relevantnějších odpovědí. V praxi to zahrnuje jemné doladění vstupních frází tak, aby vyhovovaly tréninkovým a strukturálním předsudkům modelu.

Sofistikovanost rychlého inženýrství sahá od jednoduchých technik, jako je zásobování modelu relevantními klíčovými slovy, až po pokročilejší metody zahrnující návrh složitých, strukturovaných výzev, které využívají vnitřní mechaniku modelu ve svůj prospěch.

Langchain: Nejrychleji rostoucí rychlý nástroj

LangChain, spuštěný v říjnu 2022 Harrison Chase, se stal jedním z nejlépe hodnocené open-source frameworky na GitHubu v roce 2023. Nabízí zjednodušené a standardizované rozhraní pro začlenění velkých jazykových modelů (LLM) do aplikací. Poskytuje také rozhraní bohaté na funkce pro rychlé inženýrství, které umožňuje vývojářům experimentovat s různými strategiemi a vyhodnocovat jejich výsledky. S využitím Langchain můžete provádět rychlé inženýrské úkoly efektivněji a intuitivně.

LangFlow slouží jako uživatelské rozhraní pro orchestraci komponent LangChain do spustitelného vývojového diagramu, což umožňuje rychlé prototypování a experimentování.

LangChain vyplňuje zásadní mezeru ve vývoji AI pro masy. Umožňuje řadě aplikací NLP, jako jsou virtuální asistenti, generátory obsahu, systémy odpovědí na otázky a další, řešit řadu problémů v reálném světě.

Namísto toho, aby byl LangChain samostatným modelem nebo poskytovatelem, zjednodušuje interakci s různými modely a rozšiřuje možnosti aplikací LLM za hranice jednoduchého volání API.

Architektura LangChain

 

Mezi hlavní komponenty LangChain patří Model I/O, Prompt Templates, Memory, Agents a Chains.

Model I/O

LangChain usnadňuje bezproblémové propojení s různými jazykovými modely tím, že je zabalí do standardizovaného rozhraní známého jako Model I/O. To umožňuje snadnou změnu modelu pro optimalizaci nebo lepší výkon. LangChain podporuje různé poskytovatele jazykových modelů, včetně OpenAI, Objímání tváře, Azure, Ohňostroj, A další.

Výzvy šablony

Ty se používají ke správě a optimalizaci interakcí s LLM poskytováním stručných pokynů nebo příkladů. Optimalizace výzev zvyšuje výkon modelu a jejich flexibilita významně přispívá k procesu zadávání.

Jednoduchý příklad šablony výzvy:

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"))

Jak postupujeme ve složitosti, setkáváme se v LangChain se sofistikovanějšími vzory, jako je vzor Reason and Act (ReAct). ReAct je zásadní vzor pro provádění akce, kdy agent přiřadí úkol vhodnému nástroji, přizpůsobí mu vstup a analyzuje jeho výstup, aby úkol splnil. Níže uvedený příklad Pythonu ukazuje vzor ReAct. Ukazuje, jak je výzva strukturována v LangChain, pomocí řady myšlenek a akcí, které zdůvodňují problém a vytvářejí konečnou odpověď:

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}"""

Memory

Paměť je kritickým konceptem LangChain, který umožňuje LLM a nástrojům uchovávat informace v průběhu času. Toto stavové chování zlepšuje výkon aplikací LangChain ukládáním předchozích odpovědí, uživatelských interakcí, stavu prostředí a cílů agenta. Strategie ConversationBufferMemory a ConversationBufferWindowMemory pomáhají udržovat přehled o celých nebo posledních částech konverzace. Pro sofistikovanější přístup umožňuje strategie ConversationKGMemory zakódovat konverzaci jako znalostní graf, který lze vložit zpět do výzev nebo použít k předpovídání odpovědí bez volání LLM.

Agenti

Agent komunikuje se světem prováděním akcí a úkolů. V LangChain agenti kombinují nástroje a řetězce pro provádění úkolů. Může vytvořit spojení s vnějším světem pro získávání informací pro rozšíření znalostí LLM, a tak překonat jejich přirozená omezení. Mohou se rozhodnout předat výpočty kalkulačce nebo interpretu Pythonu v závislosti na situaci.

Agenti jsou vybaveni dílčími komponentami:

  • Tools: Jedná se o funkční komponenty.
  • Nástroje: Sbírky nástrojů.
  • Agent Exekutoři: Toto je spouštěcí mechanismus, který umožňuje výběr mezi nástroji.

Agenti v LangChain se také řídí vzorem Zero-shot ReAct, kde je rozhodnutí založeno pouze na popisu nástroje. Tento mechanismus lze rozšířit o paměť, aby bylo možné vzít v úvahu celou historii konverzace. S ReAct místo toho, abyste požádali LLM o automatické doplňování vašeho textu, můžete jej vyzvat k reakci ve smyčce myšlenek/činů/pozorování.

Řetězy

Řetězce, jak termín napovídá, jsou sekvence operací, které umožňují knihovně LangChain bezproblémově zpracovávat vstupy a výstupy jazykového modelu. Tyto integrální součásti LangChain jsou v zásadě tvořeny odkazy, což mohou být jiné řetězce nebo primitiva, jako jsou výzvy, jazykové modely nebo nástroje.

Představte si řetěz jako dopravní pás v továrně. Každý krok na tomto pásu představuje určitou operaci, kterou může být vyvolání jazykového modelu, aplikace funkce Pythonu na text nebo dokonce vyvolání modelu určitým způsobem.

LangChain kategorizuje své řetězce do tří typů: Utility chains, Generic chains a Combine Documents chains. Pro naši diskusi se ponoříme do Utility a Generic řetězců.

  • Utility Chains jsou speciálně navrženy tak, aby extrahovaly přesné odpovědi z jazykových modelů pro úzce definované úkoly. Podívejme se například na LLMMathChain. Tento řetězec služeb umožňuje jazykovým modelům provádět matematické výpočty. Přijímá otázku v přirozeném jazyce a jazykový model zase generuje úryvek kódu Python, který se poté spustí a vytvoří odpověď.
  • Generické řetězce, na druhé straně slouží jako stavební kameny pro jiné řetězce, ale nelze je přímo používat samostatně. Tyto řetězce, jako je LLMCain, jsou základní a často se kombinují s jinými řetězci k plnění složitých úkolů. LLMChain se například často používá k dotazování na objekt jazykového modelu formátováním vstupu na základě poskytnuté šablony výzvy a jeho předáním do jazykového modelu.

Implementace rychlého inženýrství krok za krokem s Langchainem

Provedeme vás procesem implementace rychlého inženýrství pomocí Langchainu. Než budete pokračovat, ujistěte se, že jste nainstalovali potřebný software a balíčky.

Pro nastavení LangChain můžete využít oblíbené nástroje jako Docker, Conda, Pip a Poetry. Příslušné instalační soubory pro každou z těchto metod lze nalézt v úložišti LangChain na adrese https://github.com/benman1/generative_ai_with_langchain. To zahrnuje a dockerfile pro společnost Docker, a požadavky.txt pro Pip, a pyproject.toml pro poezii a langchain_ai.yml soubor pro Conda.

V našem článku použijeme Pip, standardního správce balíčků pro Python, k usnadnění instalace a správy knihoven třetích stran. Pokud není součástí vaší distribuce Pythonu, můžete Pip nainstalovat podle pokynů na adrese https://pip.pypa.io/.

Chcete-li nainstalovat knihovnu pomocí Pip, použijte příkaz pip install library_name.

Pip však nespravuje prostředí sám. Tento nástroj používáme ke zvládnutí různých prostředí virtualenv.

V další části se budeme zabývat integrací modelů.

Krok 1: Nastavení Langchainu

Nejprve je třeba nainstalovat balíček Langchain. Používáme OS Windows. Spusťte ve svém terminálu následující příkaz a nainstalujte jej:

pip install langchain

Krok 2: Import Langchainu a dalších potřebných modulů

Dále importujte Langchain spolu s dalšími potřebnými moduly. Zde také importujeme knihovnu transformátorů, která se široce používá v úlohách NLP.

import langchain
from transformers import AutoModelWithLMHead, AutoTokenizer

Krok 3: Načtěte předtrénovaný model

Otevřete AI

OpenAI modely lze pohodlně propojit s knihovnou LangChain nebo klientskou knihovnou OpenAI Python. OpenAI zejména poskytuje třídu Embedding pro modely vkládání textu. Dva klíčové modely LLM jsou GPT-3.5 a GPT-4, které se liší především délkou tokenu. Ceny jednotlivých modelů najdete na webu OpenAI. Zatímco je jich víc sofistikované modely jako GPT-4-32K které mají vyšší akceptaci tokenů, jejich dostupnost přes API je ne vždy zaručeno.

Přístup k těmto modelům vyžaduje klíč API OpenAI. Toho lze dosáhnout vytvořením účtu na platformě OpenAI, nastavením fakturačních údajů a vygenerováním nového tajného klíče.

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

Po úspěšném vytvoření klíče jej můžete nastavit jako proměnnou prostředí (OPENAI_API_KEY) nebo jej předat jako parametr během vytváření instance třídy pro volání OpenAI.

Zvažte skript LangChain, který předvede interakci s modely 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.

V tomto příkladu je agent inicializován k provádění výpočtů. Agent vezme vstup, jednoduchý úkol přidání, zpracuje jej pomocí poskytnutého modelu OpenAI a vrátí výsledek.

Objímání obličeje

Objímání obličeje je ZDARMA Transformers Python knihovna, kompatibilní s PyTorch, TensorFlow a JAX a zahrnuje implementace modelů jako BERTI, T5, Etc.

Hugging Face také nabízí Hugging Face Hub, platformu pro hostování úložišť kódu, modelů strojového učení, datových sad a webových aplikací.

Chcete-li používat Hugging Face jako poskytovatele pro své modely, budete potřebovat účet a klíče API, které lze získat na jejich webových stránkách. Token lze zpřístupnit ve vašem prostředí jako HUGGINGFACEHUB_API_TOKEN.

Zvažte následující úryvek Pythonu, který využívá model s otevřeným zdrojovým kódem vyvinutý společností Google, model 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)

Tento skript vezme otázku jako vstup a vrátí odpověď, čímž předvede znalosti a předpovědní schopnosti modelu.

Krok 4: Základní promptní inženýrství

Pro začátek vygenerujeme jednoduchou výzvu a uvidíme, jak model reaguje.

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))

Ve výše uvedeném úryvku kódu poskytujeme výzvu k překladu anglického textu do francouzštiny. Jazykový model se pak na základě výzvy snaží daný text přeložit.

Krok 5: Advanced Prompt Engineering

I když výše uvedený přístup funguje dobře, plně nevyužívá sílu rychlého inženýrství. Pojďme to zlepšit zavedením některých složitějších struktur příkazů.

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))

V tomto úryvku kódu upravujeme výzvu tak, aby naznačovala, že překlad provádí „vysoce zdatný francouzský překladatel. Změna ve výzvě může vést ke zlepšení překladů, protože model nyní předpokládá osobnost odborníka.

Budování systému otázek a odpovědí akademické literatury s Langchainem

Vybudujeme systém otázek a odpovědí z akademické literatury pomocí LangChain, který dokáže odpovídat na otázky týkající se nedávno publikovaných akademických prací.

Nejprve pro nastavení našeho prostředí nainstalujeme potřebné závislosti.

pip install langchain arxiv openai transformers faiss-cpu

Po instalaci vytvoříme nový notebook Python a importujeme potřebné knihovny:

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

Jádrem našeho systému Q&A je schopnost získávat relevantní akademické práce týkající se určitého oboru, zde uvažujeme o zpracování přirozeného jazyka (NLP), pomocí akademické databáze arXiv. Abychom to provedli, definujeme funkci get_arxiv_data(max_results=10). Tato funkce shromažďuje nejnovější souhrny papíru NLP z arXiv a zapouzdřuje je do objektů dokumentu LangChain s použitím souhrnu jako obsahu a jedinečného ID položky jako zdroje.

Použijeme arXiv API k načtení posledních dokumentů souvisejících s 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

Tato funkce získává souhrny nejnovějších dokumentů NLP z arXiv a převádí je na objekty LangChain Document. Jako obsah a zdroj používáme shrnutí příspěvku a jeho jedinečné ID záznamu (URL k příspěvku).

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

Pojďme definovat náš korpus a nastavit LangChain:

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

S naším akademickým systémem Q&A nyní připraveným jej můžeme otestovat položením otázky:

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

Výstupem bude odpověď na vaši otázku s uvedením zdrojů, ze kterých byly informace získány. Například:

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

Můžete snadno měnit modely nebo měnit systém podle svých potřeb. Například zde přecházíme na GPT-4, což nám nakonec poskytne mnohem lepší a podrobnější odezvu.

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

Token v GPT-4 může být krátký jako jeden znak nebo dlouhý jako jedno slovo. Například GPT-4-32K dokáže zpracovat až 32,000 4 tokenů v jednom běhu, zatímco GPT-8-3.5K a GPT-8,000-turbo podporují 4,000 XNUMX a XNUMX XNUMX tokenů. Je však důležité poznamenat, že každá interakce s těmito modely je spojena s náklady, které jsou přímo úměrné počtu zpracovaných tokenů, ať už jde o vstup nebo výstup.

V kontextu našeho systému otázek a odpovědí platí, že pokud kus akademické literatury překročí maximální tokenový limit, systém jej nezpracuje jako celek, což ovlivní kvalitu a úplnost odpovědí. Chcete-li tento problém vyřešit, lze text rozdělit na menší části, které splňují limit tokenů.

FAISS (Facebook AI podobnostní vyhledávání) pomáhá rychle najít nejrelevantnější části textu související s dotazem uživatele. Vytvoří vektorovou reprezentaci každého kusu textu a použije tyto vektory k identifikaci a načtení částí, které se nejvíce podobají vektorové reprezentaci dané otázky.

Je důležité si uvědomit, že i při použití nástrojů, jako je FAISS, může nutnost rozdělit text na menší části kvůli omezení tokenů někdy vést ke ztrátě kontextu, což má vliv na kvalitu odpovědí. Proto je při práci s těmito velkými jazykovými modely zásadní pečlivá správa a optimalizace využití tokenů.

 
pip install faiss-cpu langchain CharacterTextSplitter

Poté, co se ujistíte, že jsou nainstalovány výše uvedené knihovny, spusťte

 
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"]
    )

Po dokončení kódu nyní máme výkonný nástroj pro dotazování na nejnovější akademickou literaturu v oblasti NLP.

 
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 

Proč investovat do čističky vzduchu?

Integrace velkých jazykových modelů (LLM) do aplikací urychlila přijetí několika domén, včetně jazykového překladu, analýzy sentimentu a vyhledávání informací. Prompt engineering je mocným nástrojem pro maximalizaci potenciálu těchto modelů a Langchain je v čele zjednodušování tohoto složitého úkolu. Jeho standardizované rozhraní, flexibilní šablony výzev, robustní integrace modelu a inovativní použití agentů a řetězců zajišťují optimální výsledky pro výkon LLM.

Navzdory těmto pokrokům však existuje několik tipů, které je třeba mít na paměti. Při používání Langchainu je důležité pochopit, že kvalita výstupu do značné míry závisí na frázování výzvy. Experimentování s různými styly a strukturami výzev může přinést lepší výsledky. Pamatujte také, že zatímco Langchain podporuje různé jazykové modely, každý z nich má své silné a slabé stránky. Výběr správného pro váš konkrétní úkol je zásadní. Nakonec je důležité si uvědomit, že používání těchto modelů je spojeno s náklady, protože zpracování tokenů přímo ovlivňuje náklady na interakce.

Jak je ukázáno v průvodci krok za krokem, Langchain může pohánět robustní aplikace, jako je systém otázek a odpovědí akademické literatury. S rostoucí uživatelskou komunitou a rostoucím významem v open-source prostředí Langchain slibuje, že bude klíčovým nástrojem při využití plného potenciálu LLM, jako je GPT-4.

Posledních pět let jsem strávil ponořením se do fascinujícího světa strojového učení a hlubokého učení. Moje vášeň a odborné znalosti mě vedly k tomu, abych se podílel na více než 50 různých projektech softwarového inženýrství se zvláštním zaměřením na AI/ML. Moje neustálá zvědavost mě také přivedla ke zpracování přirozeného jazyka, což je obor, který bych rád dále prozkoumal.