Prompt engineering
Od nuly k pokročilému inženýrství promptů s Langchain v Pythonu

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 může pochopit vztah mezi slovy a frázemi. To znamená, že modely s miliardami parametrů mají kapacitu generovat různé kreativní textové formáty a odpovídat na otevřené a náročné otázky informovaným způsobem.
LLM, jako je ChatGPT, který využívá model Transformer, jsou způsobilé pochopit a generovat lidský jazyk, což je činí užitečnými pro aplikace, které vyžadují porozumění přirozenému jazyku. Nicméně, nejsou bez omezení, která zahrnují zastaralé znalosti, neschopnost interagovat s externími systémy, nedostatek porozumění kontextu a někdy generování pravděpodobně znějících, ale nesprávných nebo nesmyslných odpovědí, mezi jinými.
Vyřešení těchto omezení vyžaduje integraci LLM s externími datovými zdroji a schopnostmi, což může představovat komplexity a vyžadovat rozsáhlé kódování a zpracování dat. To, spolu s výzvami spojenými s porozuměním konceptům AI a složitým algoritmům, přispívá k učební křivce spojené s vývojem aplikací pomocí LLM.
Přestože, integrace LLM s ostatními nástroji pro vytvoření aplikací poháněných LLM by mohla předefinovat náš digitální krajinný ráz. Potenciál těchto aplikací je obrovský, včetně zlepšení efektivity a produktivity, zjednodušení úkolů, zlepšení rozhodování a poskytování personalizovaných zkušeností.
V tomto článku, budeme hlouběji zkoumat tyto problémy, zkoumáním pokročilých technik inženýrství promptů s Langchain, nabízejícím jasné vysvětlení, praktické příklady a krok za krokem instrukce, jak je implementovat.
Langchain, knihovna na úrovni státu, přináší pohodlí a flexibilitu při navrhování, implementaci a ladění promptů. Jak budeme rozbalovat principy a postupy inženýrství promptů, budete se učit, jak využít výkonné funkce Langchain k využití silných stránek SOTA Generativních modelů AI, jako je GPT-4.
Porozumění promptům
Předtím, než se ponoříme do technických detailů inženýrství promptů, je důležité pochopit koncept promptů a jejich význam.
Prompt je sekvence tokenů, které se používají jako vstup do jazykového modelu, instruující ho k vygenerování konkrétního typu odpovědi. Prompty hrají zásadní roli při směrování chování modelu. Mohou mít vliv na kvalitu vygenerovaného textu a když jsou vytvořeny správně, mohou pomoci modelu poskytnout hluboké, přesné a kontextově specifické výsledky.
Inženýrství promptů je umění a věda navrhování účinných promptů. Cílem je získat požadovanou výstup z jazykového modelu. Péčí o výběr a strukturování promptů lze model směrovat k vygenerování přesnějších a relevantnějších odpovědí. V praxi to zahrnuje jemné ladění vstupních frází, aby se přizpůsobily modelovým a strukturním偏見.
Sophistikovanost inženýrství promptů sahá od jednoduchých technik, jako je krmení modelu relevantními klíčovými slovy, až po pokročilejší metody, které zahrnují návrh komplexních, strukturovaných promptů, které využívají vnitřní mechaniku modelu k jeho prospěchu.
Langchain: Nejrychleji rostoucí nástroj pro prompt
LangChain, spuštěný v říjnu 2022 Harrisonem Chasem, se stal jedním z nejvyšším open-source frameworkem na GitHubu v roce 2023. Nabízí zjednodušený a standardizovaný rozhraní pro začlenění velkých jazykových modelů (LLM) do aplikací. Také poskytuje funkcionalitu pro inženýrství promptů, umožňující vývojářům experimentovat s různými strategiemi a hodnotit jejich výsledky. Používáním Langchainu můžete provádět úkoly inženýrství promptů účinněji a intuitivněji.
LangFlow slouží jako uživatelské rozhraní pro orchestraci komponent LangChain do spustitelného flowchartu, umožňující rychlé prototypování a experimentování.

LangChain vyplňuje kritickou mezeru ve vývoji AI pro masy. Umožňuje řadu aplikací NLP, jako jsou virtuální asistenti, generátory obsahu, systémy otázek a odpovědí a další, pro řešení řady reálných problémů.
Není to samostatný model nebo poskytovatel, LangChain zjednodušuje interakci s různými modely, rozšiřuje schopnosti aplikací LLM za hranice jednoduchého API volání.
Architektura LangChain
Hlavní komponenty LangChain zahrnují Model I/O, Prompt Templates, Paměť, Agenty a Řetězce.
Model I/O
LangChain usnadňuje bezproblémové propojení s různými jazykovými modely obalením je standardizovaným rozhraním nazývaným Model I/O. To usnadňuje bezproblémovou výměnu modelu pro optimalizaci nebo lepší výkon. LangChain podporuje různé poskytovatele jazykových modelů, včetně OpenAI, HuggingFace, Azure, Fireworks a další.
Prompt Templates
Tyto jsou používány pro správu a optimalizaci interakcí s LLM, poskytující stručné instrukce nebo příklady. Optimalizace promptů zlepšuje výkon modelu a jejich flexibilita přispívá významně k procesu vstupu.
Jednoduchý příklad prompt šablony:
<p>from langchain.prompts import PromptTemplate
prompt = PromptTemplate(input_variables=["subject"],
template="Jaké jsou nedávné pokroky v oblasti {subject}?")
print(prompt.format(subject="Přírodní jazykové zpracování"))</p>
Jak postupujeme v komplexitě, setkáváme se s více sofistikovanými vzory v LangChain, jako je vzor Reason a Act (ReAct). ReAct je zásadní vzor pro provádění akcí, kde agent přiřazuje úkol vhodnému nástroji, přizpůsobuje vstup pro něj a analyzuje jeho výstup, aby splnil úkol. Níže uvedený Python příklad ukazuje vzor ReAct. Demonструje, jak je prompt strukturován v LangChain, pomocí série myšlenek a akcí k prozkoumání problému a vygenerování konečné odpovědi:
PREFIX = """Odpovězte na následující otázku pomocí daných nástrojů:"""
FORMAT_INSTRUCTIONS = """Sledujte tento formát:
Otázka: {input_question}
Myšlenka: vaše počáteční myšlenka na otázku
Akce: vaše zvolená akce z [{tool_names}]
Akce Vstup: váš vstup pro akci
Observace: výsledek akce"""
SUFFIX = """Začněte!
Otázka: {input}
Myšlenka:{agent_scratchpad}"""
Paměť
Paměť je kritickým konceptem v LangChain, umožňujícím LLM a nástrojům uchovávat informace v čase. Tento stavový chování zlepšuje výkon aplikací LangChain, uchováváním předchozích odpovědí, interakcí uživatelů, stavu prostředí a cílů agenta. Strategie ConversationBufferMemory a ConversationBufferWindowMemory pomáhají sledovat plné nebo nedávné části konverzace. Pro více sofistikovaný přístup, strategie ConversationKGMemory umožňuje kódování konverzace jako znalostní graf, který lze vrátit zpět do promptů nebo použít k předpovědi odpovědí bez volání LLM.
Agenty
Agent interaguje se světem, prováděním akcí a úkolů. V LangChain, agenty kombinují nástroje a řetězce pro provádění úkolů. Může navázat spojení s vnějším světem pro získání informací, aby doplnil znalosti LLM, překonávající tak jejich vrozená omezení. Mohou se rozhodnout předat výpočty kalkulačce nebo Python interpreteru, v závislosti na situaci.
Agenty jsou vybaveny subkomponenty:
- Nástroje: Tyto jsou funkční komponenty.
- Nástrojové sady: Sbírky nástrojů.
- Agent Executors: Toto je mechanismus pro výběr mezi nástroji.
Agenty v LangChain také následují vzor Zero-shot ReAct, kde je rozhodnutí založeno pouze na popisu nástroje. Tento mechanismus lze rozšířit o paměť, aby se zohlednil celý historie konverzace. S ReAct, místo aby se požadovalo, aby LLM dokončoval váš text, můžete jej požádat, aby odpověděl v cyklu myšlení/akce/observace.
Řetězce
Řetězce, jak název napovídá, jsou sekvence operací, které umožňují knihovně LangChain zpracovávat vstupy a výstupy jazykových modelů bezproblémově. Tyto integrované komponenty LangChain jsou fundamentálně složeny z odkazů, které mohou být další řetězce nebo prvky, jako jsou prompty, jazykové modely nebo utility.
Představte si řetězec jako dopravní pás v továrně. Každý krok na tomto pásu reprezentuje určitou operaci, která může být voláním jazykového modelu, aplikací Python funkce na text nebo dokonce promptingem modelu určitým způsobem.
LangChain kategorizuje své řetězce do tří typů: Utility řetězce, Generic řetězce a Combine Documents řetězce. Pro naše diskusi se budeme zabývat Utility a Generic řetězci.
- Utility Řetězce jsou speciálně navrženy pro extrakci přesných odpovědí z jazykových modelů pro úzce definované úkoly. Například, podívejme se na LLMMathChain. Tento utility řetězec 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 generuje Python kód, který je poté spuštěn pro produkci odpovědi.
- Generic Řetězce, na druhé straně, slouží jako stavební bloky pro ostatní řetězce, ale nemohou být použity samostatně. Tyto řetězce, jako je LLMChain, jsou základem a jsou často kombinovány s jinými řetězci pro dosažení složitých úkolů. Například, LLMChain je často používán pro dotazování jazykového modelu, formátováním vstupu na základě poskytnuté prompt šablony a poté předáním do jazykového modelu.
Krok za krokem implementace inženýrství promptů s Langchain
Provedeme vás procesem implementace inženýrství promptů pomocí Langchain. Předtím, než budete pokračovat, zajistěte, že máte nainstalované nezbytné software a balíčky.
Můžete využít populární nástroje, jako je Docker, Conda, Pip a Poetry, pro nastavení LangChain. Relevantní instalační soubory pro každou z těchto metod lze nalézt v repozitáři LangChain na https://github.com/benman1/generative_ai_with_langchain. To zahrnuje Dockerfile pro Docker, requirements.txt pro Pip, pyproject.toml pro Poetry a langchain_ai.yml pro Condu.
V našem článku budeme používat Pip, standardní správce balíčků pro Python, pro usnadnění instalace a správy třetích stran. Pokud není zahrnut ve vaší distribuci Pythonu, můžete Pip nainstalovat následujícím způsobem: https://pip.pypa.io/.
Pro instalaci knihovny pomocí Pipu, použijte příkaz pip install název_knihovny.
Avšak, Pip sám o sobě neřídí prostředí. Pro zvládnutí různých prostředí používáme nástroj virtualenv.
V další části budeme diskutovat o integraci modelů.
Krok 1: Nastavení Langchain
Prvním krokem je instalace balíčku Langchain. Používáme operační systém Windows. Spusťte následující příkaz v terminálu pro instalaci:
pip install langchain
Krok 2: Import Langchain a dalších nezbytných modulů
Dalším krokem je import Langchain spolu s dalšími nezbytnými moduly. Zde také importujeme knihovnu transformers, která se široce používá pro úkoly NLP.
<p>import langchain from transformers import AutoModelWithLMHead, AutoTokenizer
Krok 3: Načtení předtrénovaného modelu
Open AI
OpenAI modely lze pohodlně rozhranit s knihovnou LangChain nebo knihovnou OpenAI Python klienta. Známé je, že OpenAI poskytuje třídu Embedding pro textové modely embedding. Dva klíčové modely LLM jsou GPT-3.5 a GPT-4, lišící se hlavně délkou tokenu. Ceny pro každý model lze nalézt na webu OpenAI. Zatímco existují sofistikovanější modely, jako je GPT-4-32K, které mají vyšší přijetí tokenu, jejich dostupnost přes API není vždy zajištěna.

Přístup k těmto modelům vyžaduje klíč API OpenAI. To lze provést vytvořením účtu na platformě OpenAI, nastavením informací o fakturaci a vygenerováním nového tajného klíče.
<p>import os os.environ["OPENAI_API_KEY"] = "váš-openai-token"
Po úspěšném vytvoření klíče, můžete jej nastavit jako proměnnou prostředí (OPENAI_API_KEY) nebo jej předat jako parametr během inicializace třídy pro volání OpenAI.
Zvažte LangChain skript pro demonstraci interakce s modely OpenAI:
from langchain.llms import OpenAI llm = OpenAI(model_name="text-davinci-003") # LLM bere prompt jako vstup a produkuje dokončení prompt = "Kdo je prezidentem Spojených států amerických?" completion = llm(prompt)
<p>Prezidentem Spojených států amerických je Joe Biden.</p>
V tomto příkladu je inicializován agent pro provádění výpočtů. Agent bere vstup, jednoduchý úkol sčítání, zpracovává jej pomocí poskytnutého modelu OpenAI a vrací výsledek.
Hugging
Hugging Face je BEZPLATNÁ knihovna Transformers pro Python, kompatibilní s PyTorch, TensorFlow a JAX, a zahrnuje implementace modelů, jako je BERT, T5 a další.
Hugging Face také nabízí Hugging Face Hub, platformu pro hostování repozitářů kódu, modelů strojového učení, dat a webových aplikací.
Pro použití Hugging Face jako poskytovatele modelů, budete potřebovat účet a API klíče, které lze získat z jejich webu. Token lze zpřístupnit ve vašem prostředí jako HUGGINGFACEHUB_API_TOKEN.
Zvažte následující Python skript, který využívá open-source model vyvinutý Googlem, model Flan-T5-XXL:
from langchain.llms import HuggingFaceHub
<p>llm = HuggingFaceHub(model_kwargs={"temperature": 0.5, "max_length": 64}, repo_id="google/flan-t5-xxl")
prompt = "V jaké zemi je Tokio?"
completion = llm(prompt)
print(completion)
Tento skript bere otázku jako vstup a vrací odpověď, demonstrující znalosti a predikční schopnosti modelu.
Krok 4: Základní inženýrství promptů
Začneme generováním jednoduchého promptu a uvidíme, jak model reaguje.
prompt = "Přeložte následující anglický text do francouzštiny: {0}"
input_text = "Ahoj, jak se máte?"
input_ids = tokenizer.encode(prompt.format(input_text), return_tensors="pt")
<p>generated_ids = model.generate(input_ids, max_length=100, temperature=0.9)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=True))
V tomto kódu poskytujeme prompt pro překlad anglického textu do francouzštiny. Jazykový model se pak pokusí o překlad zadaného textu na základě promptu.
Krok 5: Pokročilé inženýrství promptů
Zatímco výše uvedený přístup funguje dobře, nevyužívá plnou sílu inženýrství promptů. Zlepšeme ho, představíme některé komplexnější struktury promptů.
prompt = "Jako vysoce kvalifikovaný francouzský překladatel, přeložte následující anglický text do francouzštiny: {0}"
input_text = "Ahoj, jak se máte?"
input_ids = tokenizer.encode(prompt.format(input_text), return_tensors="pt")
<p>generated_ids = model.generate(input_ids, max_length=100, temperature=0.9)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=True))
V tomto kódu modifikujeme prompt, aby naznačoval, že překlad je prováděn “vysoce kvalifikovaným francouzským překladatelem”. Změna promptu může vést k lepšímu překladu, protože model nyní předpokládá osobu odborníka.
Vytvoření akademického literárního Q&A systému s Langchain
Vytvoříme akademický literární Q&A systém pomocí LangChain, který může odpovědět na otázky týkající se nedávno publikovaných akademických článků.

Prvním krokem je nastavení našeho prostředí, instalujeme nezbytné závislosti.
pip install langchain arxiv openai transformers faiss-cpu
Po instalaci, vytváříme nový Python notebook a importujeme nezbytné 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ádro našeho Q&A systému je schopnost získat relevantní akademické články související s určitým oborem, zde zvažujeme Přírodní jazykové zpracování (NLP), pomocí akademické databáze arXiv. Pro provedení tohoto, definujeme funkci get_arxiv_data(max_results=10). Tato funkce shromažďuje nejnovější souhrny článků NLP z arXiv a zabalí je do objektů Document LangChain, používajíc souhrn jako obsah a jedinečný vstupní ID jako zdroj.
Budeme používat API arXiv pro získání nedávných článků souvisejících s NLP:
<p>def get_arxiv_data(max_results=10):
search = arxiv.Search(
query="NLP",
max_results=max_results,
sort_by=arxiv.SortCriterion.SubmittedDate,
)</p>
documents = []
<p>for result in search.results():
documents.append(Document(
page_content=result.summary,
metadata={"source": result.entry_id},
))</p>
return documents
Tato funkce získá souhrny nejnovějších článků NLP z arXiv a převede je na objekty Document LangChain. Používáme souhrn článku a jeho jedinečné vstupní ID (URL článku) jako obsah a zdroj, resp.
def print_answer(question):
print(
chain(
{
"input_documents": sources,
"question": question,
},
return_only_outputs=True,
)["output_text"]
)
Nyní nastavíme náš korpus a nastavíme LangChain:
sources = get_arxiv_data(2) chain = load_qa_with_sources_chain(OpenAI(temperature=0))
S naším akademickým Q&A systémem nyní připraveným, můžeme jej otestovat, položíme otázku:
print_answer("Jaké jsou nedávné pokroky v NLP?")
Výstup bude odpověď na vaši otázku, citující zdroje, ze kterých byla informace získána. Například:
<p>Nedávné pokroky v NLP zahrnují modely Retriever-augmented instruction-following a novou výpočetní architekturu pro řešení problémů s proudem střídavého proudu (ACOPF) pomocí grafických procesorů (GPU). ZDROJE: http://arxiv.org/abs/2307.16877v1, http://arxiv.org/abs/2307.16830v1
Můžete snadno přepnout modely nebo upravit systém podle vašich potřeb. Například, zde přepínáme na GPT-4, který nám poskytne mnohem lepší a podrobnější odpověď.
sources = get_arxiv_data(2) chain = load_qa_with_sources_chain(OpenAI(model_name="gpt-4", temperature=0))
<p>Nedávné pokroky v Přírodním jazykovém zpracování (NLP) zahrnují vývoj modelů Retriever-augmented instruction-following pro úkoly, jako je hledání informací. Tyto modely lze přizpůsobit různým informačním doménám a úkolům bez dalšího jemného ladění. Nicméně, často mají potíže s dodržováním poskytnutých znalostí a mohou halucinovat ve svých odpovědích. Další pokrok je zavedení výpočetní architektury pro řešení problémů s proudem střídavého proudu (ACOPF) pomocí grafických procesorů (GPU). Tento přístup využívá single-instruction, multiple-data (SIMD) abstrakci nelineárních programů (NLP) a používá zhuštěný prostorový interior-point method (IPM) se strategií nerovnosti. Tato strategie umožňuje faktorizaci matic KKT bez numerického pivota, což dříve bránilo paralelizaci algoritmu IPM. ZDROJE: http://arxiv.org/abs/2307.16877v1, http://arxiv.org/abs/2307.16830v1
Token v GPT-4 může být tak krátký jako jeden znak nebo tak dlouhý jako jedno slovo. Například, GPT-4-32K, může zpracovat až 32 000 tokenů v jednom běhu, zatímco GPT-4-8K a GPT-3.5-turbo podporují 8 000 a 4 000 tokenů, resp. Nicméně, je důležité si uvědomit, že každá interakce s těmito modely přichází s náklady, které jsou přímo úměrné počtu zpracovaných tokenů, ať už vstupních nebo výstupních.
V kontextu našeho Q&A systému, pokud akademická literatura překročí maximální limit tokenů, systém nebude schopen zpracovat ji v celém rozsahu, což ovlivní kvalitu a úplnost odpovědí. Chcete-li obejít tuto problematiku, text lze rozdělit na menší části, které splňují limit tokenů.
FAISS (Facebook AI Similarity Search) (META ) pomáhá rychle najít nejrelevantnější textové části související s uživatelským dotazem. Vytvoří vektorovou reprezentaci každé textové části a používá tyto vektory k identifikaci a načtení částí nejvíce podobných vektorové reprezentaci zadané otázky.
Je důležité si uvědomit, že i s použitím nástrojů, jako je FAISS, nutnost rozdělit text na menší části z důvodu limitu tokenů může někdy vést ke ztrátě kontextu, ovlivňující kvalitu odpovědí. Proto je pečlivé řízení a optimalizace využití tokenů zásadní při práci s těmito velkými jazykovými modely.
pip install faiss-cpu langchain CharacterTextSplitter
Po zajištění instalace výše uvedených knihoven, 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) # Nyní můžeme použít více dat
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))
<p>search_index = FAISS.from_documents(document_chunks, OpenAIEmbeddings())</p>
<p>chain = load_qa_with_sources_chain(OpenAI(temperature=0))</p>
<p>def print_answer(question):
print(
chain(
{
"input_documents": search_index.similarity_search(question, k=4),
"question": question,
},
return_only_outputs=True,
)["output_text"]
)
S dokončeným kódem, nyní máme silný nástroj pro dotazování nejnovější akademické literatury v oblasti NLP.
Nedávné pokroky v NLP zahrnují použití hlubokých neuronových sítí (DNN) pro automatickou analýzu textu a úkoly NLP, jako je kontrola pravopisu, detekce jazyka, extrakce entit, detekce autora, odpovědi na otázky a další. ZDROJE: http://arxiv.org/abs/2307.10652v1, http://arxiv.org/abs/2307.07002v1, http://arxiv.org/abs/2307.12114v1, http://arxiv.org/abs/2307.16217v1
Závěr
Integrace velkých jazykových modelů (LLM) do aplikací urychluje přijetí v několika oblastech, včetně překladu jazyka, analýzy sentimentu a vyhledávání informací. Inženýrství promptů je mocným nástrojem pro maximalizaci potenciálu těchto modelů a Langchain je na čele zjednodušování tohoto komplexního úkolu. Jeho standardizované rozhraní, flexibilní prompt šablony, robustní integrace modelů a inovativní použití agentů a řetězců zajišťují optimální výsledky pro výkon LLM.
Nicméně, navzdory těmto pokrokům, je několik tipů, které je třeba mít na paměti. Při používání Langchain je důležité si uvědomit, že kvalita výstupu závisí silně na formulaci promptu. Experimentování s různými styly a strukturami promptů může vést k lepšímu výsledku. Také je důležité si uvědomit, že Langchain podporuje řadu jazykových modelů, každý s jeho silnými a slabými stránkami. Výběr správného modelu pro váš konkrétní úkol je zásadní. Nakonec, je důležité si uvědomit, že používání těchto modelů přichází s náklady, protože zpracování tokenů přímo ovlivňuje náklady na interakce.
Jak je ukázáno v našem krok za krokem průvodci, Langchain může pohánět robustní aplikace, jako je akademický literární Q&A systém. S rostoucí komunitou uživatelů a rostoucím významem v otevřeném softwarovém prostředí, Langchain slibuje být zásadním nástrojem pro využití plného potenciálu LLM, jako je GPT-4.














