Susisiekti su mumis

Greita inžinerija

Optimizuokite LLM naudodami DSPy : nuoseklus AI sistemų kūrimo, optimizavimo ir įvertinimo vadovas

mm

paskelbta

 on

DSPy yra sistema, skirta algoritminiam LM raginimų ir svorių optimizavimui

Kadangi didelių kalbų modelių (LLM) galimybės ir toliau plečiasi, kurti tvirtas AI sistemas, kurios išnaudoja jų potencialą, tampa vis sudėtingiau. Įprasti metodai dažnai apima sudėtingus raginimo būdus, duomenų generavimą koregavimui ir rankinį nurodymą, kad būtų laikomasi konkrečios srities apribojimų. Tačiau šis procesas gali būti varginantis, galintis sukelti klaidų ir labai priklausyti nuo žmogaus įsikišimo.

įeiti DSPy, revoliucinė sistema, skirta supaprastinti AI sistemų, kurias maitina LLM, kūrimą. DSPy pristato sistemingą LM raginimų ir svarmenų optimizavimo metodą, leidžiantį kūrėjams kurti sudėtingas programas su minimaliomis rankinėmis pastangomis.

Šiame išsamiame vadove išnagrinėsime pagrindinius DSPy principus, jo modulinę architektūrą ir daugybę galingų funkcijų. Taip pat pasinersime į praktinius pavyzdžius, parodydami, kaip DSPy gali pakeisti AI sistemų kūrimo būdą su LLM.

Kas yra DSPy ir kodėl jums to reikia?

DSPy yra sistema, kuri atskiria jūsų programos srautą (modules) iš kiekvieno žingsnio parametrų (LM raginimų ir svarmenų). Šis atskyrimas leidžia sistemingai optimizuoti LM raginimus ir svorius, leidžiančius kurti sudėtingesnes AI sistemas, pasižyminčias didesniu patikimumu, nuspėjamumu ir konkrečių domeno apribojimų laikymusi.

Tradiciškai kuriant dirbtinio intelekto sistemas su LLM, buvo sunku suskaidyti problemą į žingsnius, kiekvienam žingsniui sukurti sudėtingus raginimus, generuoti sintetinius pavyzdžius, skirtus tiksliam derinimui, ir rankiniu būdu nukreipti LM laikytis konkrečių apribojimų. Šis metodas ne tik užtruko daug laiko, bet ir buvo linkęs į klaidas, nes net ir nedideliems konvejerio, LM ar duomenų pakeitimams gali prireikti iš esmės pertvarkyti raginimus ir koreguoti veiksmus.

DSPy sprendžia šiuos iššūkius pristatydama naują paradigmą: optimizatoriai. Šie LM pagrįsti algoritmai gali sureguliuoti jūsų LM skambučių raginimus ir svorį, atsižvelgiant į metriką, kurią norite maksimaliai padidinti. Automatizuodamas optimizavimo procesą, DSPy įgalina kūrėjus sukurti patikimas AI sistemas su minimaliu rankiniu įsikišimu, padidindamas LM išėjimų patikimumą ir nuspėjamumą.

DSPy modulinė architektūra

DSPy esmė yra modulinė architektūra, palengvinanti sudėtingų AI sistemų sudėtį. Sistema suteikia integruotų modulių rinkinį, kuris abstrahuoja įvairius raginimo būdus, pvz dspy.ChainOfThought ir dspy.ReAct. Šiuos modulius galima sujungti ir sudaryti į didesnes programas, todėl kūrėjai gali sukurti sudėtingus vamzdynus, pritaikytus jų specifiniams reikalavimams.

Kiekvienas modulis apima išmokstamus parametrus, įskaitant instrukcijas, kelių kadrų pavyzdžius ir LM svarmenis. Kai iškviečiamas modulis, DSPy optimizatoriai gali tiksliai sureguliuoti šiuos parametrus, kad maksimaliai padidintų norimą metriką, užtikrinant, kad LM išėjimai atitiktų nurodytus apribojimus ir reikalavimus.

Optimizavimas naudojant DSPy

DSPy pristato daugybę galingų optimizatorių, skirtų pagerinti jūsų AI sistemų našumą ir patikimumą. Šie optimizatoriai naudoja LM pagrįstus algoritmus, kad sureguliuotų jūsų LM skambučių raginimus ir svorį, maksimaliai padidindami nurodytą metriką, laikydamiesi konkrečiam domenui taikomų apribojimų.

Kai kurie pagrindiniai DSPy optimizatoriai yra šie:

  1. BootstrapFewShot: Šis optimizavimo įrankis išplečia parašą automatiškai generuodamas ir įtraukdamas optimizuotus pavyzdžius į modeliui siunčiamą raginimą, įgyvendindamas kelių kadrų mokymąsi.
  2. BootstrapFewShotWithRandomSearch: Taikoma BootstrapFewShot kelis kartus su atsitiktine paieška per sugeneruotas demonstracijas, pasirenkant geriausią programą per optimizavimą.
  3. MIPRO: kiekviename žingsnyje generuoja instrukcijas ir kelių kadrų pavyzdžius, o instrukcijos generuoja duomenis ir demonstruoja. Jis naudoja Bajeso optimizavimą, kad efektyviai ieškotų generavimo instrukcijų ir demonstracijų tarp jūsų modulių.
  4. BootstrapFinetune: Distiliuoja skubiai pagrįstą DSPy programą į mažesnių LM svorio atnaujinimus, leidžiančius tiksliai sureguliuoti pagrindinį (-ius) LLM, kad būtų padidintas efektyvumas.

Naudodami šiuos optimizavimo įrankius, kūrėjai gali sistemingai optimizuoti savo AI sistemas, užtikrindami aukštos kokybės rezultatus, laikydamiesi konkrečiam domenui taikomų apribojimų ir reikalavimų.

Darbo su DSPy pradžia

Norėdami iliustruoti DSPy galią, pažvelkime į praktinį pavyzdį, kaip sukurti atsakymų į klausimus sistemos (RAG) sukūrimą.

1 veiksmas: Kalbos modelio ir paieškos modelio nustatymas

Pirmasis žingsnis apima kalbos modelio (LM) ir paieškos modelio (RM) konfigūravimą DSPy.

Norėdami įdiegti DSPy paleiskite:

pip install dspy-ai

DSPy palaiko kelias LM ir RM API, taip pat vietinį modelių prieglobą, todėl lengva integruoti pageidaujamus modelius.

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)

2 veiksmas: įkelkite duomenų rinkinį

Tada įkelsime „HotPotQA“ duomenų rinkinį, kuriame yra sudėtingų klausimų ir atsakymų porų, į kurias paprastai atsakoma kelių šuolių būdu, rinkinys.

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]

3 veiksmas: parašų kūrimas

DSPy naudoja parašus modulių veikimui apibrėžti. Šiame pavyzdyje apibrėžsime atsakymo generavimo užduoties parašą, nurodydami įvesties laukus (kontekstą ir klausimą) ir išvesties lauką (atsakymą).

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

4 žingsnis: vamzdyno tiesimas

Mes sukursime savo RAG dujotiekį kaip DSPy modulį, kurį sudaro inicijavimo metodas (__init__) submoduliams deklaruoti (dspy.Retrieve ir dspy.ChainOfThought) ir pirmyn metodas (persiųsti), skirtas aprašyti atsakymo valdymo srautą. Klausimas naudojant šiuos modulius.

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)

5 veiksmas: vamzdyno optimizavimas

Apibrėžę dujotiekį, dabar galime jį optimizuoti naudodami DSPy optimizatorius. Šiame pavyzdyje naudosime „BootstrapFewShot“ optimizavimo priemonę, kuri generuoja ir atrenka efektyvius raginimus mūsų moduliams pagal mokymo rinkinį ir patvirtinimo metriką.

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)

6 veiksmas: vamzdyno įvertinimas

Sukūrus programą, būtina įvertinti jos veikimą kūrimo rinkinyje, siekiant užtikrinti, kad ji atitiktų pageidaujamą tikslumą ir patikimumą.

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

7 veiksmas: modelio istorijos patikrinimas

Norėdami geriau suprasti modelio sąveiką, galite peržiūrėti naujausias kartas, peržiūrėję modelio istoriją.

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

8 veiksmas: numatykite

Optimizavus ir įvertinus dujotiekį, dabar galite jį naudoti norėdami numatyti naujų klausimų.

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

Minimalus darbo pavyzdys su DSPy

Dabar pažiūrėkime per kitą minimalų darbo pavyzdį naudojant GSM8K duomenų rinkinys ir OpenAI GPT-3.5-turbo modelis, skirtas imituoti raginimo užduotis DSPy.

Sąrankos

Pirmiausia įsitikinkite, kad jūsų aplinka yra tinkamai sukonfigūruota:

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)

Šios gsm8k_trainset ir gsm8k_devset duomenų rinkiniuose yra pavyzdžių sąrašas, kiekviename pavyzdyje yra klausimų ir atsakymų laukai.

Apibrėžkite modulį

Tada apibrėžkite pasirinktinę programą naudodami ChainOfThought modulį, kad galėtumėte nuosekliai samprotauti:

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

Sudarykite ir įvertinkite modelį

Dabar sukompiliuokite jį su BootstrapFewShot teleprompteris:

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)

Šiame pavyzdyje parodyta, kaip nustatyti aplinką, apibrėžti pasirinktinį modulį, sudaryti modelį ir tiksliai įvertinti jo našumą naudojant pateiktą duomenų rinkinį ir teleprompterio konfigūracijas.

Duomenų valdymas DSPy

DSPy veikia su mokymo, kūrimo ir bandymų rinkiniais. Kiekvienam duomenų pavyzdžiui paprastai turite trijų tipų vertes: įvestis, tarpines ir galutines etiketes. Nors tarpinės arba galutinės etiketės yra neprivalomos, būtina turėti keletą įvesties pavyzdžių.

Pavyzdinių objektų kūrimas

DSPy objektų pavyzdžiai yra panašūs į Python žodynus, tačiau juose yra naudingų paslaugų:

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)

Rezultatas:

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

Nurodykite įvesties klavišus

DSPy pavyzdiniai objektai turi with_inputs() metodą, skirtą pažymėti konkrečius laukus kaip įvestis:

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

Vertes galima pasiekti naudojant taško operatorių, o tokie metodai kaip inputs() ir labels() pateikia naujus pavyzdinius objektus, kuriuose atitinkamai yra tik įvesties arba ne įvesties raktai.

Optimizatoriai DSPy

DSPy optimizatorius derina DSPy programos parametrus (ty raginimus ir (arba) LM svarmenis), kad maksimaliai padidintų nurodytą metriką. DSPy siūlo įvairius integruotus optimizatorius, kurių kiekvienas naudoja skirtingas strategijas.

Galimos optimizavimo priemonės

  • BootstrapFewShot: generuoja kelių kadrų pavyzdžius naudojant pateiktus pažymėtus įvesties ir išvesties duomenų taškus.
  • BootstrapFewShotWithRandomSearch: Taiko BootstrapFewShot kelis kartus su atsitiktine paieška per sugeneruotas demonstracijas.
  • COPRO: generuoja ir tobulina naujas kiekvieno žingsnio instrukcijas, optimizuodama jas koordinatės kilimu.
  • MIPRO: optimizuoja instrukcijas ir kelių kadrų pavyzdžius naudojant Bajeso optimizavimą.

Optimizavimo priemonės pasirinkimas

Jei nesate tikri, nuo ko pradėti, naudokite BootstrapFewShotWithRandomSearch:

Jei norite gauti labai mažai duomenų (10 pavyzdžių), naudokite BootstrapFewShot.
Norėdami gauti šiek tiek daugiau duomenų (50 pavyzdžių), naudokite BootstrapFewShotWithRandomSearch.
Didesniems duomenų rinkiniams (300 ir daugiau pavyzdžių) naudokite MIPRO.

Štai kaip naudoti 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)

Optimizuotų programų išsaugojimas ir įkėlimas

Paleidę programą per optimizavimo priemonę, išsaugokite ją būsimam naudojimui:

optimizuota_programa.save(YOUR_SAVE_PATH)

Įkelti išsaugotą programą:

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

Išplėstinės funkcijos: DSPy teiginiai

DSPy teiginiai automatizuoja LM skaičiavimo apribojimų vykdymą, padidindami LM išvesties patikimumą, nuspėjamumą ir teisingumą.

Naudojant teiginius

Apibrėžkite patvirtinimo funkcijas ir deklaruokite tvirtinimus po atitinkamo modelio generavimo. Pavyzdžiui:

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

Programų transformavimas su teiginiais

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

Arba suaktyvinkite tvirtinimus tiesiogiai programoje:

baleen_with_assertions = SimplifiedBaleenAssertions().activate_assertions()

Teiginiais pagrįsti optimizavimai

DSPy tvirtinimai veikia su DSPy optimizavimu, ypač su BootstrapFewShotWithRandomSearch, įskaitant nustatymus, tokius kaip:

  • Kompiliacija su teiginiais
  • Kompiliacija + išvados su teiginiais

Išvada

DSPy siūlo galingą ir sistemingą požiūrį į kalbos modelių ir jų raginimų optimizavimą. Vykdydami šiuose pavyzdžiuose aprašytus veiksmus galite lengvai kurti, optimizuoti ir įvertinti sudėtingas AI sistemas. DSPy modulinis dizainas ir pažangūs optimizatoriai leidžia efektyviai ir efektyviai integruoti įvairius kalbų modelius, todėl tai yra vertingas įrankis visiems, dirbantiems NLP ir AI srityje.

Nesvarbu, ar kuriate paprastą atsakymo į klausimus sistemą, ar sudėtingesnį vamzdyną, DSPy suteikia lankstumo ir tvirtumo, reikalingo aukštam našumui ir patikimumui pasiekti.

Pastaruosius penkerius metus praleidau pasinerdamas į žavų mašininio mokymosi ir giluminio mokymosi pasaulį. Mano aistra ir patirtis paskatino mane prisidėti prie daugiau nei 50 įvairių programinės įrangos inžinerijos projektų, ypatingą dėmesį skiriant AI/ML. Mano nuolatinis smalsumas taip pat patraukė mane į natūralios kalbos apdorojimą – sritį, kurią noriu tyrinėti toliau.