Brzi inženjering
Zero to Advanced Prompt Engineering s Langchainom u Pythonu

Važan aspekt velikih jezičnih modela (LLM) je broj parametara koje ti modeli koriste za učenje. Što više parametara model ima, to bolje može razumjeti odnos između riječi i fraza. To znači da modeli s milijardama parametara imaju kapacitet za generiranje različitih formata kreativnog teksta i odgovore na otvorena i izazovna pitanja na informativan način.
LLM kao što je ChatGPT, koji koristi model Transformer, vješt je u razumijevanju i generiranju ljudskog jezika, što ih čini korisnim za aplikacije koje zahtijevaju razumijevanje prirodnog jezika. Međutim, oni nisu bez svojih ograničenja, koja uključuju zastarjelo znanje, nemogućnost interakcije s vanjskim sustavima, nedostatak razumijevanja konteksta i ponekad generiranje uvjerljivih, ali netočnih ili besmislenih odgovora, između ostalog.
Rješavanje ovih ograničenja zahtijeva integraciju LLM-a s vanjskim izvorima podataka i mogućnostima, što može predstavljati složenost i zahtijevati opsežne vještine kodiranja i rukovanja podacima. To, zajedno s izazovima razumijevanja koncepata umjetne inteligencije i složenih algoritama, pridonosi krivulji učenja povezanoj s razvojem aplikacija koje koriste LLM.
Unatoč tome, integracija LLM-a s drugim alatima za izradu aplikacija koje pokreću LLM mogla bi redefinirati naš digitalni krajolik. Potencijal takvih aplikacija je golem, uključujući poboljšanje učinkovitosti i produktivnosti, pojednostavljivanje zadataka, poboljšanje donošenja odluka i pružanje personaliziranih iskustava.
U ovom članku dublje ćemo se pozabaviti ovim pitanjima, istražujući napredne tehnike brzog inženjeringa s Langchainom, nudeći jasna objašnjenja, praktične primjere i upute korak po korak o tome kako ih implementirati.
Langchain, najsuvremenija biblioteka, donosi praktičnost i fleksibilnost u dizajniranju, implementaciji i podešavanju upita. Dok otkrivamo principe i prakse brzog inženjeringa, naučit ćete kako koristiti moćne značajke Langchaina da biste iskoristili snage SOTA Generative AI modela kao što je GPT-4.
Razumijevanje upita
Prije nego što se upustimo u tehničke detalje brzog inženjeringa, bitno je shvatiti koncept upita i njihovo značenje.
A 'brz' je niz tokena koji se koriste kao ulaz u jezični model, dajući mu upute za generiranje određene vrste odgovora. Upute igraju ključnu ulogu u upravljanju ponašanjem modela. Oni mogu utjecati na kvalitetu generiranog teksta, a kada su pravilno izrađeni, mogu pomoći modelu da pruži pronicljive, točne rezultate specifične za kontekst.
Brzo inženjerstvo je umjetnost i znanost dizajniranja učinkovitih brzih poruka. Cilj je izvući željeni rezultat iz jezičnog modela. Pažljivim odabirom i strukturiranjem upita, može se voditi model prema generiranju točnijih i relevantnijih odgovora. U praksi to uključuje fino ugađanje ulaznih izraza kako bi se zadovoljila obuka modela i strukturne pristranosti.
Sofisticiranost brzog inženjeringa kreće se od jednostavnih tehnika, kao što je hranjenje modela relevantnim ključnim riječima, do naprednijih metoda koje uključuju dizajn složenih, strukturiranih upita koji koriste unutarnju mehaniku modela u svoju korist.
Langchain: najbrže rastući brzi alat
LangChain, pokrenut u listopadu 2022 Harrison Chase, postao je jedan od najviše ocijenjeni okviri otvorenog koda na GitHubu 2023. Nudi pojednostavljeno i standardizirano sučelje za uključivanje velikih jezičnih modela (LLM) u aplikacije. Također pruža sučelje bogato značajkama za brzi inženjering, omogućujući programerima da eksperimentiraju s različitim strategijama i procijene svoje rezultate. Korištenjem Langchaina možete učinkovitije i intuitivnije obavljati brze inženjerske zadatke.
LangFlow služi kao korisničko sučelje za orkestriranje LangChain komponenti u izvršni dijagram toka, omogućujući brzu izradu prototipa i eksperimentiranje.

LangChain popunjava ključnu prazninu u razvoju umjetne inteligencije za mase. Omogućuje niz NLP aplikacija kao što su virtualni pomoćnici, generatori sadržaja, sustavi za odgovaranje na pitanja i više, za rješavanje niza problema iz stvarnog svijeta.
Umjesto da bude samostalni model ili pružatelj usluga, LangChain pojednostavljuje interakciju s različitim modelima, proširujući mogućnosti LLM aplikacija izvan ograničenja jednostavnog API poziva.
Arhitektura LangChaina
Glavne komponente LangChaina uključuju model I/O, prompt predloške, memoriju, agente i lance.
Model I/O
LangChain olakšava besprijekornu vezu s različitim jezičnim modelima tako što ih oblaže standardiziranim sučeljem poznatim kao Model I/O. To olakšava promjenu modela bez napora za optimizaciju ili bolje performanse. LangChain podržava razne pružatelje jezičnih modela, uključujući OpenAI, HuggingFace, Plavetnilo, Vatromet, I više.
Predlošci upita
Koriste se za upravljanje i optimizaciju interakcija s LLM-ima pružanjem sažetih uputa ili primjera. Optimiziranje upita poboljšava izvedbu modela, a njihova fleksibilnost značajno doprinosi procesu unosa.
Jednostavan primjer predloška upita:
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"))
Kako napredujemo u složenosti, susrećemo se sa sofisticiranijim uzorcima u LangChainu, kao što je obrazac Razumi i djeluj (ReAct). ReAct je vitalni obrazac za izvršenje akcije gdje agent dodjeljuje zadatak odgovarajućem alatu, prilagođava ulaz za njega i analizira njegov izlaz kako bi izvršio zadatak. Python primjer u nastavku prikazuje obrazac ReAct. Pokazuje kako je upit strukturiran u LangChainu, koristeći niz misli i radnji za razmišljanje o problemu i stvaranje konačnog odgovora:
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}"""
memorija
Memorija je ključni koncept u LangChainu, koji omogućuje LLM-ima i alatima da zadrže informacije tijekom vremena. Ovo ponašanje s praćenjem stanja poboljšava izvedbu LangChain aplikacija pohranjivanjem prethodnih odgovora, interakcija korisnika, stanja okoline i ciljeva agenta. Strategije ConversationBufferMemory i ConversationBufferWindowMemory pomažu u praćenju cijelih ili nedavnih dijelova razgovora. Za sofisticiraniji pristup, strategija ConversationKGMemory omogućuje kodiranje razgovora kao grafikona znanja koji se može vratiti u upite ili koristiti za predviđanje odgovora bez pozivanja LLM-a.
Agenti
Agent je u interakciji sa svijetom obavljanjem radnji i zadataka. U LangChainu, agenti kombiniraju alate i lance za izvršenje zadatka. Može uspostaviti vezu s vanjskim svijetom za pronalaženje informacija za povećanje LLM znanja, čime se prevladavaju njihova inherentna ograničenja. Oni mogu odlučiti proslijediti izračune kalkulatoru ili Python tumaču, ovisno o situaciji.
Agenti su opremljeni podkomponentama:
- Alati: Ovo su funkcionalne komponente.
- Setovi: Zbirke alata.
- Agent Izvršitelji: Ovo je mehanizam izvršenja koji omogućuje odabir između alata.
Agenti u LangChainu također slijede obrazac Zero-shot ReAct, gdje se odluka temelji samo na opisu alata. Ovaj mehanizam se može proširiti memorijom kako bi se uzela u obzir cijela povijest razgovora. Uz ReAct, umjesto da tražite od LLM-a da automatski dovrši vaš tekst, možete ga potaknuti da odgovori u petlji misao/djelo/promatranje.
Lanci
Lanci, kao što izraz sugerira, su nizovi operacija koji omogućuju biblioteci LangChain neometanu obradu ulaza i izlaza jezičnog modela. Ove integralne komponente LangChaina temeljno se sastoje od veza, koje mogu biti drugi lanci ili primitivi kao što su upute, jezični modeli ili uslužni programi.
Zamislite lanac kao pokretnu traku u tvornici. Svaki korak na ovoj traci predstavlja određenu operaciju, koja može biti pozivanje jezičnog modela, primjena Python funkcije na tekst ili čak pokretanje modela na određeni način.
LangChain kategorizira svoje lance u tri vrste: uslužne lance, generičke lance i lance kombiniranih dokumenata. Zaronit ćemo u uslužne i generičke lance za našu raspravu.
- Komunalni lanci su posebno dizajnirani za izdvajanje preciznih odgovora iz jezičnih modela za usko definirane zadatke. Na primjer, pogledajmo LLMMathChain. Ovaj uslužni lanac omogućuje jezičnim modelima izvođenje matematičkih izračuna. Prihvaća pitanje na prirodnom jeziku, a jezični model zauzvrat generira Python isječak koda koji se zatim izvršava kako bi proizveo odgovor.
- Generički lanci, s druge strane, služe kao građevni blokovi za druge lance, ali se ne mogu izravno koristiti samostalno. Ti su lanci, kao što je LLMChain, temeljni i često se kombiniraju s drugim lancima kako bi se izvršili zamršeni zadaci. Na primjer, LLMChain se često koristi za postavljanje upita objektu jezičnog modela formatiranjem unosa na temelju dostavljenog predloška upita i zatim prosljeđivanjem jezičnom modelu.
Implementacija brzog inženjeringa s Langchainom korak po korak
Provest ćemo vas kroz proces implementacije brzog inženjeringa pomoću Langchaina. Prije nastavka provjerite jeste li instalirali potreban softver i pakete.
Možete iskoristiti popularne alate kao što su Docker, Conda, Pip i Poetry za postavljanje LangChaina. Relevantne instalacijske datoteke za svaku od ovih metoda mogu se pronaći unutar LangChain repozitorija na https://github.com/benman1/generative_ai_with_langchain. To uključuje a dockerfile za Docker, a zahtjevi.txt za Pipa, a pyproject.toml za poeziju i a langchain_ai.yml datoteka za Condu.
U našem članku koristit ćemo Pip, standardni upravitelj paketa za Python, kako bismo olakšali instalaciju i upravljanje bibliotekama trećih strana. Ako nije uključen u vašu distribuciju Pythona, možete instalirati Pip slijedeći upute na https://pip.pypa.io/.
Da biste instalirali biblioteku s Pipom, koristite naredbu pip install library_name
.
Međutim, Pip ne upravlja okruženjima sam. Za rukovanje različitim okruženjima koristimo alat virtualenv.
U sljedećem odjeljku raspravljat ćemo o integracijama modela.
Korak 1: Postavljanje Langchaina
Prvo morate instalirati Langchain paket. Koristimo Windows OS. Pokrenite sljedeću naredbu na svom terminalu da biste ga instalirali:
pip install langchain
Korak 2: Uvoz Langchaina i ostalih potrebnih modula
Zatim uvezite Langchain zajedno s ostalim potrebnim modulima. Ovdje također uvozimo biblioteku transformatora, koja se intenzivno koristi u NLP zadacima.
import langchain from transformers import AutoModelWithLMHead, AutoTokenizer
Korak 3: Učitajte prethodno obučeni model
Otvori AI
OpenAI modeli se mogu jednostavno povezati s bibliotekom LangChain ili klijentskom bibliotekom OpenAI Python. Značajno, OpenAI nudi klasu ugradnje za modele ugradnje teksta. Dva ključna LLM modela su GPT-3.5 i GPT-4, koji se razlikuju uglavnom u duljini tokena. Cijene za svaki model mogu se pronaći na web stranici OpenAI-ja. Dok ih je više sofisticirani modeli poput GPT-4-32K koji imaju veće prihvaćanje tokena, njihova dostupnost putem API-ja je nije uvijek zajamčeno.

Pristup ovim modelima zahtijeva OpenAI API ključ. To se može učiniti stvaranjem računa na OpenAI platformi, postavljanjem podataka o naplati i generiranjem novog tajnog ključa.
import os os.environ["OPENAI_API_KEY"] = 'your-openai-token'
Nakon uspješnog kreiranja ključa, možete ga postaviti kao varijablu okruženja (OPENAI_API_KEY) ili ga proslijediti kao parametar tijekom instanciranja klase za OpenAI pozive.
Razmotrite LangChain skriptu za prikaz interakcije s OpenAI modelima:
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.
U ovom primjeru, agent je inicijaliziran za izvođenje izračuna. Agent uzima unos, jednostavan zadatak zbrajanja, obrađuje ga pomoću dostavljenog OpenAI modela i vraća rezultat.
Zagrljeno lice
Zagrljeno lice je BESPLATNO ZA UPOTREBU Transformers Python biblioteka, kompatibilna s PyTorch, TensorFlow i JAX, i uključuje implementacije modela kao što su BERTI, T5, Itd
Hugging Face također nudi Hugging Face Hub, platformu za hosting repozitorija kodova, modela strojnog učenja, skupova podataka i web aplikacija.
Da biste koristili Hugging Face kao pružatelja usluga za svoje modele, trebat će vam račun i API ključevi koji se mogu nabaviti na njihovoj web stranici. Token može biti dostupan u vašem okruženju kao HUGGINGFACEHUB_API_TOKEN.
Razmotrite sljedeći Python isječak koji koristi model otvorenog koda koji je razvio 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)
Ova skripta uzima pitanje kao ulaz i vraća odgovor, prikazujući znanje i mogućnosti predviđanja modela.
Korak 4: Osnovni brzi inženjering
Za početak ćemo generirati jednostavan upit i vidjeti kako model reagira.
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))
U gornjem isječku koda nudimo upit za prijevod engleskog teksta na francuski. Jezični model zatim pokušava prevesti zadani tekst na temelju upita.
Korak 5: Napredni brzi inženjering
Iako gornji pristup dobro funkcionira, ne iskorištava u potpunosti snagu brzog inženjeringa. Poboljšajmo ga uvođenjem nekih složenijih brzih struktura.
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))
U ovom isječku koda mijenjamo upit kako bismo sugerirali da prijevod radi "vrlo vješt francuski prevoditelj". Promjena u upitu može dovesti do poboljšanih prijevoda, budući da model sada pretpostavlja personu stručnjaka.
Izgradnja sustava pitanja i odgovora akademske literature s Langchainom
Izgradit ćemo sustav pitanja i odgovora iz akademske literature koristeći LangChain koji može odgovoriti na pitanja o nedavno objavljenim akademskim radovima.

Prvo, da bismo postavili naše okruženje, instaliramo potrebne ovisnosti.
pip install langchain arxiv openai transformers faiss-cpu
Nakon instalacije stvaramo novu Python bilježnicu i uvozimo potrebne biblioteke:
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
Srž našeg sustava pitanja i odgovora je mogućnost dohvaćanja relevantnih akademskih radova koji se odnose na određeno područje, ovdje razmatramo obradu prirodnog jezika (NLP), koristeći arXiv akademsku bazu podataka. Da bismo to izveli, definiramo funkciju get_arxiv_data(max_results=10)
. Ova funkcija prikuplja najnovije sažetke NLP papira iz arXiva i enkapsulira ih u objekte LangChain Document, koristeći sažetak kao sadržaj i jedinstveni ID unosa kao izvor.
Koristit ćemo arXiv API za dohvaćanje nedavnih radova koji se odnose na 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
Ova funkcija dohvaća sažetke najnovijih NLP radova iz arXiva i pretvara ih u objekte LangChain Document. Koristimo sažetak rada i njegov jedinstveni ID unosa (URL do rada) kao sadržaj i izvor.
def print_answer(question): print( chain( { "input_documents": sources, "question": question, }, return_only_outputs=True, )["output_text"] )
Definirajmo naš korpus i postavimo LangChain:
sources = get_arxiv_data(2) chain = load_qa_with_sources_chain(OpenAI(temperature=0))
S našim akademskim sustavom pitanja i odgovora koji je sada spreman, možemo ga testirati postavljanjem pitanja:
print_answer("What are the recent advancements in NLP?")
Ishod će biti odgovor na vaše pitanje, uz navođenje izvora iz kojih je informacija izvučena. Na primjer:
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
Možete jednostavno mijenjati modele ili mijenjati sustav prema svojim potrebama. Na primjer, ovdje prelazimo na GPT-4 što nam na kraju daje puno bolji i detaljniji odgovor.
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 u GPT-4 može biti kratak kao jedan znak ili dugačak kao jedna riječ. Na primjer, GPT-4-32K može obraditi do 32,000 tokena u jednom pokretanju, dok GPT-4-8K i GPT-3.5-turbo podržavaju 8,000 odnosno 4,000 tokena. Međutim, važno je napomenuti da svaka interakcija s ovim modelima dolazi s troškom koji je izravno proporcionalan broju obrađenih tokena, bilo da se radi o ulazu ili izlazu.
U kontekstu našeg sustava pitanja i odgovora, ako dio akademske literature premašuje maksimalno ograničenje tokena, sustav ga neće uspjeti obraditi u cijelosti, što utječe na kvalitetu i potpunost odgovora. Da biste zaobišli ovaj problem, tekst se može rastaviti na manje dijelove koji su u skladu s ograničenjem tokena.
FAISS (Facebook AI Similarity Search) pomaže u brzom pronalaženju najrelevantnijih dijelova teksta koji se odnose na korisnikov upit. Stvara vektorski prikaz svakog dijela teksta i koristi te vektore za prepoznavanje i dohvaćanje dijelova koji su najsličniji vektorskom prikazu danog pitanja.
Važno je upamtiti da čak i uz korištenje alata kao što je FAISS, potreba da se tekst podijeli na manje dijelove zbog ograničenja tokena ponekad može dovesti do gubitka konteksta, što utječe na kvalitetu odgovora. Stoga su pažljivo upravljanje i optimizacija upotrebe tokena presudni pri radu s ovim velikim jezičnim modelima.
pip install faiss-cpu langchain CharacterTextSplitter
Nakon što provjerite jesu li gornje biblioteke instalirane, pokrenite
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"] )
S dovršenim kodom, sada imamo moćan alat za traženje najnovije akademske literature u području NLP-a.
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
Zaključak
Integracija velikih jezičnih modela (LLM) u aplikacije ubrzala je usvajanje nekoliko domena, uključujući prijevod jezika, analizu mišljenja i pronalaženje informacija. Brzi inženjering moćan je alat za maksimiziranje potencijala ovih modela, a Langchain prednjači u pojednostavljivanju ovog složenog zadatka. Njegovo standardizirano sučelje, fleksibilni promptni predlošci, robusna integracija modela i inovativna upotreba agenata i lanaca osiguravaju optimalne rezultate za izvedbu LLM-a.
Međutim, unatoč ovom napretku, ima nekoliko savjeta koje treba imati na umu. Dok koristite Langchain, važno je razumjeti da kvaliteta izlaza uvelike ovisi o izrazu upita. Eksperimentiranje s različitim stilovima i strukturama upita može dati bolje rezultate. Također, zapamtite da iako Langchain podržava različite jezične modele, svaki od njih ima svoje prednosti i slabosti. Odabir pravog za vaš specifični zadatak je ključan. Na kraju, važno je zapamtiti da korištenje ovih modela uključuje razmatranje troškova jer obrada tokena izravno utječe na cijenu interakcija.
Kao što je prikazano u vodiču korak po korak, Langchain može pokretati robusne aplikacije, kao što je sustav pitanja i odgovora akademske literature. S rastućom zajednicom korisnika i sve većom istaknutošću u okruženju otvorenog koda, Langchain obećava da će biti ključni alat u iskorištavanju punog potencijala LLM-a kao što je GPT-4.