Home Umela inteligencia Optimalizujte LLM pomocou DSPy: Podrobný sprievodca budovaním, optimalizáciou a vyhodnocovaním systémov AI

Optimalizujte LLM pomocou DSPy: Podrobný sprievodca budovaním, optimalizáciou a vyhodnocovaním systémov AI

by
mm

Keďže možnosti veľkých jazykových modelov (LLM) sa neustále rozširujú, vývoj robustných systémov AI, ktoré využívajú ich potenciál, je čoraz zložitejší. Konvenčné prístupy často zahŕňajú zložité techniky nabádania, generovanie údajov na jemné ladenie a manuálne vedenie na zabezpečenie dodržiavania obmedzení špecifických pre doménu. Tento proces však môže byť zdĺhavý, náchylný na chyby a vo veľkej miere závisí od ľudského zásahu.

Zadajte DSPy, revolučný rámec navrhnutý na zefektívnenie vývoja systémov AI poháňaných LLM. DSPy predstavuje systematický prístup k optimalizácii výziev a váh LM, čo umožňuje vývojárom vytvárať sofistikované aplikácie s minimálnym manuálnym úsilím.

V tejto komplexnej príručke preskúmame základné princípy DSPy, jeho modulárnu architektúru a množstvo výkonných funkcií, ktoré ponúka. Ponoríme sa aj do praktických príkladov, ktoré ukážu, ako môže DSPy zmeniť spôsob, akým vyvíjate systémy AI pomocou LLM.

Čo je DSPy a prečo ho potrebujete?

DSPy je rámec, ktorý oddeľuje tok vášho programu (modules) z parametrov (výzvy LM a váhy) každého kroku. Toto oddelenie umožňuje systematickú optimalizáciu výziev a váh LM, čo vám umožňuje vytvárať komplexné systémy AI s vyššou spoľahlivosťou, predvídateľnosťou a dodržiavaním obmedzení špecifických pre doménu.

Tradične vývoj systémov AI s LLM zahŕňal namáhavý proces rozdelenia problému na kroky, vytváranie zložitých výziev pre každý krok, generovanie syntetických príkladov na jemné ladenie a manuálne vedenie LM, aby dodržiavali špecifické obmedzenia. Tento prístup bol nielen časovo náročný, ale aj náchylný na chyby, pretože aj malé zmeny v potrubí, LM alebo údajoch si mohli vyžiadať rozsiahle prepracovanie výziev a dolaďovacích krokov.

DSPy rieši tieto výzvy zavedením novej paradigmy: optimalizátorov. Tieto algoritmy riadené LM dokážu vyladiť výzvy a váhy vašich hovorov LM podľa metriky, ktorú chcete maximalizovať. Automatizáciou procesu optimalizácie umožňuje DSPy vývojárom vytvárať robustné systémy AI s minimálnym manuálnym zásahom, čím sa zvyšuje spoľahlivosť a predvídateľnosť výstupov LM.

Modulárna architektúra DSPy

V srdci DSPy leží modulárna architektúra, ktorá uľahčuje zostavovanie komplexných systémov AI. Framework poskytuje sadu vstavaných modulov, ktoré abstrahujú rôzne techniky vyvolávania, ako napr dspy.ChainOfThought a dspy.ReAct. Tieto moduly je možné kombinovať a skladať do väčších programov, čo umožňuje vývojárom vytvárať zložité potrubia prispôsobené ich špecifickým požiadavkám.

Každý modul zapuzdruje naučiteľné parametre vrátane inštrukcií, príkladov niekoľkých záberov a závaží LM. Keď je modul vyvolaný, optimalizátori DSPy môžu jemne doladiť tieto parametre, aby maximalizovali požadovanú metriku a zabezpečili, že výstupy LM budú spĺňať špecifikované obmedzenia a požiadavky.

Optimalizácia pomocou DSPy

DSPy predstavuje rad výkonných optimalizátorov navrhnutých na zvýšenie výkonu a spoľahlivosti vašich systémov AI. Tieto optimalizátory využívajú algoritmy riadené LM na ladenie výziev a váh vašich hovorov LM, maximalizujúc špecifikovanú metriku pri dodržaní obmedzení špecifických pre doménu.

Niektoré z kľúčových optimalizátorov dostupných v DSPy zahŕňajú:

  1. BootstrapFewShot: Tento optimalizátor rozširuje podpis automatickým generovaním a zahrnutím optimalizovaných príkladov do výzvy odoslanej do modelu, pričom implementuje niekoľkonásobné učenie.
  2. BootstrapFewShotWithRandomSearch: Platí BootstrapFewShot niekoľkokrát s náhodným prehľadávaním generovaných ukážok, výberom najlepšieho programu pred optimalizáciou.
  3. MIPRO: Generuje inštrukcie a niekoľkonásobné príklady v každom kroku, pričom generovanie inštrukcií je založené na údajoch a demonštrácii. Využíva Bayesovskú optimalizáciu na efektívne vyhľadávanie v priestore generovania pokynov a ukážok vo vašich moduloch.
  4. BootstrapFinetune: Destiluje rýchly program DSPy do aktualizácií hmotnosti pre menšie LM, čo vám umožňuje jemne doladiť základné LLM pre vyššiu efektivitu.

Využitím týchto optimalizátorov môžu vývojári systematicky optimalizovať svoje systémy AI, čím zabezpečia vysokokvalitné výstupy a zároveň budú dodržiavať obmedzenia a požiadavky špecifické pre danú doménu.

Začíname s DSPy

Aby sme ilustrovali silu DSPy, prejdime si praktický príklad vytvorenia systému RAG (retrieval-augmented generation) na zodpovedanie otázok.

Krok 1: Nastavenie jazykového modelu a modelu vyhľadávania

Prvý krok zahŕňa konfiguráciu jazykového modelu (LM) a modelu vyhľadávania (RM) v rámci DSPy.

Ak chcete nainštalovať DSPy, spustite:

pip install dspy-ai

DSPy podporuje viacero rozhraní LM a RM API, ako aj hosťovanie miestnych modelov, čo uľahčuje integráciu preferovaných modelov.

import dspy
# Configure the LM and RM
turbo = dspy.OpenAI(model='gpt-3.5-turbo')
colbertv2_wiki17_abstracts = dspy.ColBERTv2(url='http://20.102.90.50:2017/wiki17_abstracts')
dspy.settings.configure(lm=turbo, rm=colbertv2_wiki17_abstracts)

Krok 2: Načítanie množiny údajov

Ďalej načítame súbor údajov HotPotQA, ktorý obsahuje zbierku komplexných párov otázok a odpovedí, ktoré sa zvyčajne odpovedajú viacskokovým spôsobom.

from dspy.datasets import HotPotQA
# Load the dataset
dataset = HotPotQA(train_seed=1, train_size=20, eval_seed=2023, dev_size=50, test_size=0)
# Specify the 'question' field as the input
trainset = (x.with_inputs('question') for x in dataset.train)
devset = (x.with_inputs('question') for x in dataset.dev)

Krok 3: Vytváranie podpisov

DSPy používa podpisy na definovanie správania modulov. V tomto príklade zadefinujeme podpis pre úlohu generovania odpovede, pričom uvedieme vstupné polia (kontext a otázka) a výstupné pole (odpoveď).

class GenerateAnswer(dspy.Signature):
"""Answer questions with short factoid answers."""
context = dspy.InputField(desc="may contain relevant facts")
question = dspy.InputField()
answer = dspy.OutputField(desc="often between 1 and 5 words")

Krok 4: Budovanie potrubia

Vybudujeme náš kanál RAG ako modul DSPy, ktorý pozostáva z inicializačnej metódy (__init__) na deklarovanie podmodulov (dspy.Retrieve a dspy.ChainOfThought) a doprednej metódy (forward) na opísanie riadiaceho toku odpovedí. pomocou týchto modulov.

class RAG(dspy.Module):
    def __init__(self, num_passages=3):
    super().__init__()
        self.retrieve = dspy.Retrieve(k=num_passages)
        self.generate_answer = dspy.ChainOfThought(GenerateAnswer)
    def forward(self, question):
        context = self.retrieve(question).passages
        prediction = self.generate_answer(context=context, question=question)
        return dspy.Prediction(context=context, answer=prediction.answer)

Krok 5: Optimalizácia potrubia

S definovaným potrubím ho teraz môžeme optimalizovať pomocou optimalizátorov DSPy. V tomto príklade použijeme optimalizátor BootstrapFewShot, ktorý generuje a vyberá efektívne výzvy pre naše moduly na základe sady školení a metriky na overenie.

from dspy.teleprompt import BootstrapFewShot
# Validation metric
def validate_context_and_answer(example, pred, trace=None):
answer_EM = dspy.evaluate.answer_exact_match(example, pred)
answer_PM = dspy.evaluate.answer_passage_match(example, pred)
return answer_EM and answer_PM
# Set up the optimizer
teleprompter = BootstrapFewShot(metric=validate_context_and_answer)
# Compile the program
compiled_rag = teleprompter.compile(RAG(), trainset=trainset)

Krok 6: Vyhodnotenie potrubia

Po skompilovaní programu je nevyhnutné vyhodnotiť jeho výkon na vývojovej súprave, aby sa zabezpečilo, že spĺňa požadovanú presnosť a spoľahlivosť.

from dspy.evaluate import Evaluate
# Set up the evaluator
evaluate = Evaluate(devset=devset, metric=validate_context_and_answer, num_threads=4, display_progress=True, display_table=0)
# Evaluate the compiled RAG program
evaluation_result = evaluate(compiled_rag)
print(f"Evaluation Result: {evaluation_result}")

Krok 7: Kontrola histórie modelu

Pre hlbšie pochopenie interakcií modelu si môžete prezrieť najnovšie generácie tak, že si pozriete históriu modelu.

# Inspect the model's history
turbo.inspect_history(n=1)

Krok 8: Vytváranie predpovedí

Vďaka optimalizovanému a vyhodnotenému kanálu ho teraz môžete použiť na predpovedanie nových otázok.

# Example question
question = "Which award did Gary Zukav's first book receive?"
# Make a prediction using the compiled RAG program
prediction = compiled_rag(question)
print(f"Question: {question}")
print(f"Answer: {prediction.answer}")
print(f"Retrieved Contexts: {prediction.context}")

Minimálny pracovný príklad s DSPy

Teraz si prejdime ďalší minimálny pracovný príklad s použitím Dátový súbor GSM8K a model OpenAI GPT-3.5-turbo na simuláciu úloh výzvy v rámci DSPy.

Nastaviť

Najprv sa uistite, že je vaše prostredie správne nakonfigurované:

import dspy
from dspy.datasets.gsm8k import GSM8K, gsm8k_metric
# Set up the LM
turbo = dspy.OpenAI(model='gpt-3.5-turbo-instruct', max_tokens=250)
dspy.settings.configure(lm=turbo)
# Load math questions from the GSM8K dataset
gsm8k = GSM8K()
gsm8k_trainset, gsm8k_devset = gsm8k.train(:10), gsm8k.dev(:10)
print(gsm8k_trainset)

The gsm8k_trainset a gsm8k_devset množiny údajov obsahujú zoznam príkladov, pričom každý príklad má pole otázky a odpovede.

Definujte modul

Ďalej definujte vlastný program využívajúci modul ChainOfThought na uvažovanie krok za krokom:

class CoT(dspy.Module):
def __init__(self):
super().__init__()
self.prog = dspy.ChainOfThought("question -> answer")
def forward(self, question):
return self.prog(question=question)

Zostavte a vyhodnoťte model

Teraz ho skompilujte s BootstrapFewShot teleprompter:

from dspy.teleprompt import BootstrapFewShot
# Set up the optimizer
config = dict(max_bootstrapped_demos=4, max_labeled_demos=4)
# Optimize using the gsm8k_metric
teleprompter = BootstrapFewShot(metric=gsm8k_metric, **config)
optimized_cot = teleprompter.compile(CoT(), trainset=gsm8k_trainset)
# Set up the evaluator
from dspy.evaluate import Evaluate
evaluate = Evaluate(devset=gsm8k_devset, metric=gsm8k_metric, num_threads=4, display_progress=True, display_table=0)
evaluate(optimized_cot)
# Inspect the model's history
turbo.inspect_history(n=1)

Tento príklad ukazuje, ako nastaviť svoje prostredie, definovať vlastný modul, zostaviť model a dôsledne vyhodnotiť jeho výkon pomocou poskytnutej množiny údajov a konfigurácií teleprompter.

Správa údajov v DSPy

DSPy pracuje s tréningovými, vývojovými a testovacími sadami. Pre každý príklad v údajoch máte zvyčajne tri typy hodnôt: vstupy, prechodné označenia a konečné označenia. Zatiaľ čo prechodné alebo konečné štítky sú voliteľné, je nevyhnutné mať niekoľko príkladov vstupov.

Vytváranie vzorových objektov

Príklady objektov v DSPy sú podobné slovníkom Pythonu, ale prichádzajú s užitočnými pomôckami:

qa_pair = dspy.Example(question="This is a question?", answer="This is an answer.")
print(qa_pair)
print(qa_pair.question)
print(qa_pair.answer)

Výkon:

Example({'question': 'This is a question?', 'answer': 'This is an answer.'}) (input_keys=None)
This is a question?
This is an answer.

Určenie vstupných kľúčov

V DSPy majú Vzorové objekty metódu with_inputs() na označenie konkrétnych polí ako vstupov:

print(qa_pair.with_inputs("question"))
print(qa_pair.with_inputs("question", "answer"))

K hodnotám je možné pristupovať pomocou bodkového operátora a metódy ako inputs() a labels() vracajú nové vzorové objekty obsahujúce iba vstupné alebo nevstupné kľúče.

Optimalizátory v DSPy

Optimalizátor DSPy vylaďuje parametre programu DSPy (tj výzvy a/alebo váhy LM), aby maximalizoval špecifikované metriky. DSPy ponúka rôzne vstavané optimalizátory, z ktorých každý využíva iné stratégie.

Dostupné optimalizátory

  • BootstrapFewShot: Generuje niekoľko záberov pomocou poskytnutých označených vstupných a výstupných dátových bodov.
  • BootstrapFewShotWithRandomSearch: Aplikuje BootstrapFewShot viackrát s náhodným vyhľadávaním vo vygenerovaných ukážkach.
  • I COPRO: Generuje a vylepšuje nové pokyny pre každý krok a optimalizuje ich pomocou súradnicového stúpania.
  • MIPRO: Optimalizuje pokyny a niekoľkonásobné príklady pomocou Bayesiánskej optimalizácie.

Výber optimalizátora

Ak si nie ste istí, kde začať, použite BootstrapFewShotWithRandomSearch:

Pre veľmi málo údajov (10 príkladov) použite BootstrapFewShot.
Pre trochu viac údajov (50 príkladov) použite BootstrapFewShotWithRandomSearch.
Pre väčšie množiny údajov (viac ako 300 príkladov) použite MIPRO.

Tu je návod, ako používať BootstrapFewShotWithRandomSearch:

from dspy.teleprompt import BootstrapFewShotWithRandomSearch
config = dict(max_bootstrapped_demos=4, max_labeled_demos=4, num_candidate_programs=10, num_threads=4)
teleprompter = BootstrapFewShotWithRandomSearch(metric=YOUR_METRIC_HERE, **config)
optimized_program = teleprompter.compile(YOUR_PROGRAM_HERE, trainset=YOUR_TRAINSET_HERE)

Ukladanie a načítanie optimalizovaných programov

Po spustení programu cez optimalizátor ho uložte pre budúce použitie:

optimalizovaný_program.uložiť(VAŠA_CESTA_ULOŽENIA)

Načítať uložený program:

loaded_program = YOUR_PROGRAM_CLASS()
loaded_program.load(path=YOUR_SAVE_PATH)

Pokročilé funkcie: Tvrdenia DSPy

Tvrdenia DSPy automatizujú presadzovanie výpočtových obmedzení na LM, čím zvyšujú spoľahlivosť, predvídateľnosť a správnosť výstupov LM.

Používanie tvrdení

Definujte overovacie funkcie a deklarujte tvrdenia po vygenerovaní príslušného modelu. Napríklad:

dspy.Suggest(
len(query) <= 100,
"Query should be short and less than 100 characters",
)
dspy.Suggest(
validate_query_distinction_local(prev_queries, query),
"Query should be distinct from: " + "; ".join(f"{i+1}) {q}" for i, q in enumerate(prev_queries)),
)

Transformácia programov s tvrdeniami

from dspy.primitives.assertions import assert_transform_module, backtrack_handler
baleen_with_assertions = assert_transform_module(SimplifiedBaleenAssertions(), backtrack_handler)

Prípadne aktivujte asercie priamo v programe:

baleen_with_assertions = SimplifiedBaleenAssertions().activate_assertions()

Optimalizácie založené na tvrdeniach

Tvrdenia DSPy pracujú s optimalizáciami DSPy, najmä s BootstrapFewShotWithRandomSearch, vrátane nastavení ako:

  • Kompilácia s tvrdeniami
  • Kompilácia + inferencia s tvrdeniami

Záver

DSPy ponúka výkonný a systematický prístup k optimalizácii jazykových modelov a ich výziev. Podľa krokov uvedených v týchto príkladoch môžete jednoducho zostavovať, optimalizovať a vyhodnocovať zložité systémy AI. Modulárny dizajn a pokročilé optimalizátory DSPy umožňujú efektívnu a efektívnu integráciu rôznych jazykových modelov, vďaka čomu je cenným nástrojom pre každého, kto pracuje v oblasti NLP a AI.

Či už vytvárate jednoduchý systém odpovedania na otázky alebo zložitejší kanál, DSPy poskytuje flexibilitu a robustnosť potrebnú na dosiahnutie vysokého výkonu a spoľahlivosti.

Source Link

Related Posts

Leave a Comment