AI Engineering Academy · Oppitunti

Ketjujen rakentaminen LCEL:llä

Käytätte pipe-operaattoria prompt-templaten, LLM:n ja output parserin ketjuttamiseen Runnable-sekvenssiksi, kutsutte sitä synkronisesti ja asynkronisesti sekä tarkastelette välituloksia.

Oppitunti 2/413 vaihetta

Ketjujen rakentaminen LCEL:llä on ilmainen AI Engineering Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu AI Engineering Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. AI Engineering Academy-kurssilla on yhteensä 4 oppituntia.

Mikä LCEL on?

LCEL (LangChain Expression Language) on deklaratiivinen tapa yhdistää LangChain-komponentteja putkiksi. Sen sijaan, että alustaisit monisanaisia Chain-luokkia, yhdistät Runnable-komponentit |-operaattorilla. LCEL-ketjut tukevat automaattisesti suoratoistoa, asynkronisuutta, eräkäsittelyä ja varamenettelyjä — saat kaikki nämä ominaisuudet käyttöösi pelkästään putkisyntaksia käyttämällä.

Ensimmäinen LCEL-ketjusi

Yksinkertaisin LCEL-ketju yhdistää PromptTemplate-komponentin, ChatModel-komponentin ja OutputParser-komponentin. Jokainen komponentti on Runnable, ja putkioperaattori yhdistää ne. Kun kutsut chain.invoke()-metodia, syöte kulkee peräkkäin jokaisen vaiheen läpi ja kunkin vaiheen tulosteesta tulee seuraavan vaiheen syöte.

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

prompt = ChatPromptTemplate.from_template(
    'Write a product description for: {product}'
)
model = ChatOpenAI(model='gpt-4o-mini', temperature=0.7)
parser = StrOutputParser()

chain = prompt | model | parser

result = chain.invoke({'product': 'noise-cancelling headphones'})
print(result)

Ketjun sisäisen rakenteen tarkastelu

LCEL-ketjut paljastavat rakenteensa läpinäkyvästi. chain.steps luettelee komponentit järjestyksessä. Voit kutsua chain.input_schema- ja chain.output_schema-määritteitä tarkastellaksesi, minkätyyppinen data kulkee sisään ja ulos. invoke()-kutsu hyväksyy myös config-parametrin, jonka avulla voit välittää ajon nimen, tunnisteet ja callbackit yksittäiseen kutsuun ketjun määritelmää muuttamatta.

# Inspect chain structure
print('Steps:', chain.steps)
print('Input schema:', chain.input_schema.schema())
print('Output schema:', chain.output_schema.schema())

# Named run for observability
result = chain.invoke(
    {'product': 'coffee maker'},
    config={'run_name': 'product-desc-run', 'tags': ['production']}
)

Synkroninen ja asynkroninen invoke

LCEL-ketjut tarjoavat kaikista metodeista sekä synkroniset että asynkroniset versiot. invoke() estää kutsuvan säikeen suorituksen jatkumisen. ainvoke() on asynkroninen vastine, jota tulee käyttää FastAPI-käsittelijöissä ja muissa asynkronisissa yhteyksissä tapahtumasilmukan estämisen välttämiseksi. Asynkronisen version semantiikka on sama — rajapintojen ainoa ero on await.

import asyncio
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

chain = ChatPromptTemplate.from_template('Explain {topic}') | ChatOpenAI() | StrOutputParser()

async def main():
    # Async invocation
    result = await chain.ainvoke({'topic': 'quantum computing'})
    print(result)

asyncio.run(main())

Tokenien suoratoisto ketjun läpi

LCEL-ketjut välittävät suoratoiston koko ketjun läpi. Kutsu chain.stream()-metodia saadaksesi tokenit sitä mukaa kuin malli tuottaa niitä. StrOutputParser tunnistaa suoratoiston ja välittää yksittäiset merkkijonon osat eteenpäin odottamatta koko vastausta. Näin käyttäjä saa välitöntä palautetta pitkän tauon ja vasta sen jälkeen saapuvan kokonaisen vastauksen sijaan.

chain = (
    ChatPromptTemplate.from_template('Tell me about {topic} in detail.')
    | ChatOpenAI(model='gpt-4o-mini')
    | StrOutputParser()
)

# Print each token as it arrives
for chunk in chain.stream({'topic': 'neural networks'}):
    print(chunk, end='', flush=True)
print()  # newline at end

# Async streaming
async def stream_async():
    async for chunk in chain.astream({'topic': 'transformers'}):
        print(chunk, end='', flush=True)

Useiden syötteiden eräkäsittely

chain.batch() hyväksyy luettelon syötesanakirjoja ja käsittelee ne määritettävällä samanaikaisuudella. LangChain suorittaa kutsut sisäisesti rinnakkaisissa säikeissä, joten batch on huomattavasti nopeampi kuin invoke()-metodin kutsuminen silmukassa. max_concurrency-parametri rajoittaa rinnakkaisten API-kutsujen määrää, jotta nopeusrajoja ei ylitetä. Tulokset palautetaan samassa järjestyksessä kuin syötteet.

products = [
    {'product': 'laptop'},
    {'product': 'tablet'},
    {'product': 'smartwatch'},
    {'product': 'earbuds'},
]

# Process all 4 concurrently
results = chain.batch(products, config={'max_concurrency': 4})

for product, description in zip(products, results):
    print(f'{product["product"]}: {description[:80]}...')

RunnablePassthrough ja RunnableLambda

RunnablePassthrough välittää syötteen muuttamattomana eteenpäin — tämä on hyödyllistä, kun alkuperäinen konteksti halutaan välittää muunnetun datan rinnalla. RunnableLambda käärii minkä tahansa Python-funktion Runnable-komponentiksi, joten voit lisätä mielivaltaista logiikkaa LCEL-ketjuun. Yhdessä nämä mahdollistavat datan käsittelyn ketjun vaiheiden välillä ilman kokonaan mukautetun Runnable-luokan kirjoittamista.

from langchain_core.runnables import RunnablePassthrough, RunnableLambda

def word_count(text: str) -> str:
    count = len(text.split())
    return f'{text}\n\n[Word count: {count}]'

chain = (
    ChatPromptTemplate.from_template('Write about {topic}')
    | ChatOpenAI(model='gpt-4o-mini')
    | StrOutputParser()
    | RunnableLambda(word_count)  # Add word count to output
)

result = chain.invoke({'topic': 'climate change'})
print(result)

Lisäkontekstin välittäminen RunnablePassthroughilla

RAG-järjestelmissä on tavallista välittää lopulliseen kehotteeseen sekä haetut dokumentit että käyttäjän kysymys. Lisää RunnablePassthrough.assign()-metodilla syotesanakirjaan laskettuja kenttiä menettämättä alkuperäisiä avaimia. Näin kontekstiobjekti rikastuu ketjun läpi kulkiessaan ja kaikki data on käytettävissä kehotemallille.

from langchain_core.runnables import RunnablePassthrough

# Fake retriever for illustration
def retrieve_docs(question: str):
    return ['Doc 1 content', 'Doc 2 content']

retriever = RunnableLambda(retrieve_docs)

rag_chain = (
    RunnablePassthrough.assign(context=retriever)  # adds 'context' key
    | ChatPromptTemplate.from_template(
        'Context: {context}\n\nAnswer: {question}'
    )
    | ChatOpenAI()
    | StrOutputParser()
)

result = rag_chain.invoke({'question': 'What is machine learning?'})

Varamenettelyjen lisääminen ketjuihin

LCEL-ketjut tukevat varamenettelyjä — vaihtoehtoisia ketjuja, joita kokeillaan ensisijaisen ketjun aiheuttaessa poikkeuksen. Kutsu chain.with_fallbacks([backup_chain]) rekisteröidäksesi yhden tai useamman varaketjun. LangChain kokeilee ensin ensisijaista ketjua, ottaa poikkeuksen kiinni ja kokeilee sitten jokaista varaketjua järjestyksessä. Tämä on vakiintunut tapa käsitellä palveluntarjoajan käyttökatkoja tai mallivirheitä hallitusti.

from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic

primary_chain = (
    ChatPromptTemplate.from_template('Answer: {question}')
    | ChatOpenAI(model='gpt-4o')
    | StrOutputParser()
)

fallback_chain = (
    ChatPromptTemplate.from_template('Answer: {question}')
    | ChatAnthropic(model='claude-3-haiku-20240307')
    | StrOutputParser()
)

robust_chain = primary_chain.with_fallbacks([fallback_chain])
# If OpenAI fails, automatically tries Anthropic

Virheenkorjaus intermediate_steps-toiminnolla

LCEL-ketjujen virheenkorjaus on helpompaa invoke()-metodin config-asetusten ja verbose=True-valinnan avulla. Voit myös käyttää .with_config({'verbose': True})-määritystä missä tahansa ketjussa kirjataksesi jokaisen vaiheen syötteen ja tulosteen. Jäsenneltyä virheenkorjausta varten voit kääriä ketjun maailmanlaajuisesti set_verbose(True)-asetuksella tai käyttää LangSmith-jäljitystä kaikkien väliarvojen tallentamiseen visuaaliseen jäljitysnäkymään.

from langchain.globals import set_verbose, set_debug

# Verbose: logs LLM inputs/outputs
set_verbose(True)

# Debug: logs everything including prompts, parsers, and runnables
set_debug(True)

result = chain.invoke({'product': 'smart watch'})

# Or per-chain verbose config
chain_debug = chain.with_config({'verbose': True})
result = chain_debug.invoke({'product': 'laptop'})

Ajonaikana määritettävät ketjut

LCEL-ketjut tukevat ajonaikaista määritystä ConfigurableField-kentän avulla. Voit asettaa mallin parametrit — lämpötilan, mallin nimen ja max_tokens-arvon — määritettäviksi vaihtoehdoiksi ilman kovakoodausta. Välitä kutsuhetkellä Configurable-määritys oletusarvojen ohittamiseksi. Näin yksi ketju voi palvella useita käyttäjiä eri asetuksilla tai mahdollistaa mallimääritysten A/B-testauksen.

from langchain_core.runnables import ConfigurableField

llm = ChatOpenAI(model='gpt-4o-mini').configurable_fields(
    temperature=ConfigurableField(
        id='temperature',
        name='LLM Temperature',
        description='Controls output creativity'
    )
)

chain = ChatPromptTemplate.from_template('Write about {topic}') | llm | StrOutputParser()

# Low temperature for factual output
factual = chain.invoke(
    {'topic': 'history of Rome'},
    config={'configurable': {'temperature': 0.0}}
)

Pikatesti

Testaa ymmärrystäsi ketjujen rakentamisesta LCEL:n avulla.

Oppitunnin yhteenveto

Tässä oppitunnissa opit, että LCEL:n putkikoostaminen yhdistää Runnables-komponentit | -operaattorilla selkeiksi ja luettaviksi putkiksi, RunnablePassthrough ja RunnableLambda mahdollistavat datan käsittelyvaiheiden lisäämisen LCEL-mallin sisällä ja varamenettelyt tekevät ketjuista vikasietoisia kokeilemalla automaattisesti varaketjuja virhetilanteissa. Seuraavaksi tutustumme haarautuviin ja rinnakkaisiin ketjuihin monimutkaisempaa reitityslogiikkaa varten.

Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
30
Oppitunnit
120

Usein kysytyt kysymykset

Onko oppitunti ”Ketjujen rakentaminen LCEL:llä” ilmainen?

Kyllä – oppitunnin ”Ketjujen rakentaminen LCEL:llä” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko AI Engineering Academy-kurssin, päivitä CoddyKit PROhon. AI Engineering Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Ketjujen rakentaminen LCEL:llä”?

Käytätte pipe-operaattoria prompt-templaten, LLM:n ja output parserin ketjuttamiseen Runnable-sekvenssiksi, kutsutte sitä synkronisesti ja asynkronisesti sekä tarkastelette välituloksia. Harjoittelet AI Engineering Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni AI Engineering Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin AI Engineering Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Ketjujen rakentaminen LCEL:llä”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä AI Engineering Academy-oppitunnilla?

Kyllä. Jokainen AI Engineering Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. LangChain-arkkitehtuuri ja keskeiset abstraktiot
  2. Ketjujen rakentaminen LCEL:llä
  3. Haarautuvat ja rinnakkaiset ketjut
  4. Tulosteen suoratoisto LangChainissa
← Takaisin: AI Engineering Academy