|
|
1 month ago | |
|---|---|---|
| .. | ||
| solution | 4 months ago | |
| README.md | 1 month ago | |
README.md
Okvir za umetno inteligenco
Ste se kdaj počutili preobremenjene, ko ste poskušali zgraditi aplikacije umetne inteligence od začetka? Niste sami! Okviri za umetno inteligenco so kot švicarski nož za razvoj UI - so zmogljiva orodja, ki vam lahko prihranijo čas in glavobole pri gradnji inteligentnih aplikacij. Okvir za umetno inteligenco si predstavljajte kot dobro organizirano knjižnico: zagotavlja vnaprej izdelane komponente, standardizirane API-je in pametne abstrakcije, tako da se lahko osredotočite na reševanje problemov, namesto da se ukvarjate s podrobnostmi implementacije.
V tej lekciji bomo raziskali, kako lahko okviri, kot je LangChain, kompleksne naloge integracije umetne inteligence spremenijo v čisto, berljivo kodo. Odkrijte, kako se lotiti izzivov iz resničnega sveta, kot so sledenje pogovorom, izvajanje klicev orodij in upravljanje različnih modelov UI prek enotnega vmesnika.
Do konca lekcije boste vedeli, kdaj se je bolje obrniti na okvire namesto neposrednih API klicev, kako učinkovito uporabljati njihove abstrakcije in kako graditi aplikacije umetne inteligence, pripravljene za uporabo v resničnem svetu. Raziščimo, kaj lahko okviri za umetno inteligenco storijo za vaše projekte.
⚡ Kaj lahko storite v naslednjih 5 minutah
Hiter začetek za zaposlene razvijalce
flowchart LR
A[⚡ 5 minut] --> B[Namesti LangChain]
B --> C[Ustvari ChatOpenAI odjemalca]
C --> D[Pošlji prvi poziv]
D --> E[Oglej si moč ogrodja]
- 1. minuta: Namestite LangChain:
pip install langchain langchain-openai - 2. minuta: Nastavite svoj GitHub žeton in uvozite klienta ChatOpenAI
- 3. minuta: Ustvarite preprost pogovor s sporočili sistema in človeka
- 4. minuta: Dodajte osnovno orodje (npr. funkcijo seštevanja) in si oglejte klic orodij UI
- 5. minuta: Izkusite razliko med surovo API klici in abstrakcijo okvira
Hitri testni koda:
from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage
llm = ChatOpenAI(
api_key=os.environ["GITHUB_TOKEN"],
base_url="https://models.github.ai/inference",
model="openai/gpt-4o-mini"
)
response = llm.invoke([
SystemMessage(content="You are a helpful coding assistant"),
HumanMessage(content="Explain Python functions briefly")
])
print(response.content)
Zakaj je to pomembno: V 5 minutah boste izkusili, kako okviri UI preoblikujejo kompleksno integracijo umetne inteligence v preproste metode. To je temelj, ki poganja produkcijske AI aplikacije.
Zakaj izbrati okvir?
Torej ste pripravljeni zgraditi aplikacijo umetne inteligence - super! A tukaj je stvar: obstaja več različnih poti, ki jih lahko ubrates, vsaka s svojimi prednostmi in slabostmi. To je kot izbirati med hojo, kolesarjenjem ali vožnjo - vse vas bodo pripeljale do cilja, a izkušnja (in trud) bosta povsem različna.
Oglejmo si tri glavne načine, kako lahko integrirate UI v svoje projekte:
| Pristop | Prednosti | Najbolj primerno za | Premisleki |
|---|---|---|---|
| Neposredni HTTP pozivi | Poln nadzor, brez odvisnosti | Preprosti poizvedki, učenje osnov | Bolj obsežna koda, ročno upravljanje napak |
| SDK integracija | Manj pisanja podvojenega koda, optimizacija za specifične modele | Aplikacije z enim modelom | Omejeno na določene ponudnike |
| Okviri UI | Enoten API, vgrajene abstrakcije | Aplikacije z več modeli, kompleksni delovni tokovi | Učna krivulja, potencialna pretirana abstrakcija |
Prednosti okvirjev v praksi
graph TD
A[Vaša aplikacija] --> B[Okvir za AI]
B --> C[OpenAI GPT]
B --> D[Anthropic Claude]
B --> E[GitHub modeli]
B --> F[Lokalni modeli]
B --> G[Vgrajena orodja]
G --> H[Upravljanje spomina]
G --> I[Zgodovina pogovorov]
G --> J[Klic funkcij]
G --> K[Ravnanje z napakami]
Zakaj so okviri pomembni:
- Združujejo več ponudnikov umetne inteligence pod enim vmesnikom
- Samodejno upravljajo pomnjenje pogovorov
- Nudijo že pripravljena orodja za običajne naloge, kot so vdelave in klici funkcij
- Upravljajo ravnanje z napakami in logiko ponovitve
- Spremenijo kompleksne delovne tokove v berljive klice metod
💡 Nasvet: Uporabljajte okvire, ko menjate med različnimi modeli umetne inteligence ali gradite kompleksne funkcije, kot so agenti, pomnjenje ali klic orodij. Pri učenju osnov ali gradnji preprostih, osredotočenih aplikacij pa se držite neposrednih API-jev.
Zaključek: Tako kot izbirate med specializiranimi orodji obrtnika in celotno delavnico, je pomembno, da orodje ujemate z nalogo. Okviri se odlično obnesejo pri kompleksnih, bogatih aplikacijah, medtem ko neposredni API-ji dobro delujejo za bolj enostavne primere uporabe.
🗺️ Vaša učna pot do mojstrstva okvirov UI
journey
title Od surovih API-jev do produkcijskih AI aplikacij
section Osnove ogrodja
Razumi koristi abstrakcije: 4: You
Obvladaj osnove LangChain: 6: You
Primerjaj pristope: 7: You
section Sistem pogovorov
Ustvari klepetalna vmesnika: 5: You
Uvedi vzorce pomnilnika: 7: You
Obvladaj pretočne odzive: 8: You
section Napredne funkcije
Ustvari prilagojena orodja: 6: You
Obvladaj strukturiran izhod: 8: You
Ustvari dokumentarne sisteme: 8: You
section Produkcijske aplikacije
Združi vse funkcije: 7: You
Obvladaj scenarije napak: 8: You
Namesti celovite sisteme: 9: You
Cilj vaše poti: Do konca te lekcije boste obvladali razvoj okvirov UI in znali zgraditi sofisticirane, produkcijsko pripravljene UI aplikacije, ki konkurirajo komercialnim AI asistentom.
Uvod
V tej lekciji se bomo naučili:
- Uporabljati običajen okvir umetne inteligence.
- Reševati pogoste težave, kot so pogovori, uporaba orodij, pomnjenje in kontekst.
- Izkoristiti to za gradnjo UI aplikacij.
🧠 Ekosistem razvoja okvirov umetne inteligence
mindmap
root((Okviri umetne inteligence))
Abstraction Benefits
Poenostavitev kode
Enotni API-ji
Vgrajena obravnava napak
Dosledni vzorci
Zmanjšana količina ponavljajoče se kode
Multi-Model Support
Neodvisno od ponudnika
Enostavno preklapljanje
Nadomestne možnosti
Optimizacija stroškov
Core Components
Upravljanje pogovorov
Vrste sporočil
Sistemi pomnilnika
Sledenje kontekstu
Ohranjanje zgodovine
Integracija orodij
Klic funkcij
API povezave
Prilagojena orodja
Avtomatizacija delovnih tokov
Advanced Features
Strukturiran izhod
Pydantic modeli
JSON sheme
Varnost tipov
Pravila potrjevanja
Obdelava dokumentov
Vdelave
Vektorjske zbirke
Iskanje podobnosti
RAG sistemi
Production Patterns
Arhitektura aplikacij
Modularna zasnova
Meje za napake
Asinhrone operacije
Upravljanje stanja
Strategije uvajanja
Prilagodljivost
Nadzor
Zmogljivost
Varnost
Temeljno načelo: Okviri UI abstraktno poenostavljajo kompleksnost, hkrati pa nudijo močne abstrakcije za upravljanje pogovorov, integracijo orodij in obdelavo dokumentov, kar razvijalcem omogoča gradnjo sofisticiranih UI aplikacij s čisto, vzdrževalno kodo.
Vaš prvi AI poziv
Začnimo z osnovami tako, da ustvarimo svojo prvo aplikacijo umetne inteligence, ki pošlje vprašanje in prejme odgovor nazaj. Tako kot je Arhimed odkril princip potiska v svoji kopeli, včasih najpreprostejši opaznosti privedejo do najbolj močnih spoznanj - in okviri naredijo ta spoznanja dostopna.
Nastavitev LangChain z GitHub modeli
Uporabili bomo LangChain za povezavo z GitHub modeli, kar je super, saj vam omogoča brezplačen dostop do različnih modelov UI. Najboljše? Potrebujete le nekaj preprostih konfiguracijskih parametrov za začetek:
from langchain_openai import ChatOpenAI
import os
llm = ChatOpenAI(
api_key=os.environ["GITHUB_TOKEN"],
base_url="https://models.github.ai/inference",
model="openai/gpt-4o-mini",
)
# Pošlji preprost poziv
response = llm.invoke("What's the capital of France?")
print(response.content)
Razčlenimo, kaj se tukaj dogaja:
- Ustvari LangChain klienta z uporabo razreda
ChatOpenAI- to je vaša vstopna točka v UI! - Nastavi povezavo z GitHub modeli z vašim avtentikacijskim žetonom
- Določi kateri model UI se uporablja (
gpt-4o-mini) - to je kot izbira vašega pomočnika UI - Pošlje vprašanje z metodo
invoke()- tu se zgodi magija - Izvleče in prikaže odgovor - voilà, klepetate z UI!
🔧 Opomba pri nastavitvi: Če uporabljate GitHub Codespaces, imate srečo -
GITHUB_TOKENje že nastavljen za vas! Delate lokalno? Nič hudega, potrebovali boste ustvariti osebni dostopni žeton z ustreznimi dovoljenji.
Pričakovan izhod:
The capital of France is Paris.
sequenceDiagram
participant App as Vaša Python aplikacija
participant LC as LangChain
participant GM as GitHub modeli
participant AI as GPT-4o-mini
App->>LC: llm.invoke("Kaj je glavno mesto Francije?")
LC->>GM: HTTP zahteva z pozivom
GM->>AI: Obdelaj poziv
AI->>GM: Generiran odgovor
GM->>LC: Vrni odgovor
LC->>App: response.content
Gradnja pogovorne umetne inteligence
Prvi primer prikazuje osnove, toda to je le enkratni izmenjava - postavite vprašanje, prejmete odgovor in to je to. V realnih aplikacijah želite, da si vaša UI zapomni, o čem ste govorili, kot Watson in Holmes, ki sta skozi čas gradila svoje raziskovalne pogovore.
Tukaj LangChain postane še posebej uporaben. Ponuja različne tipe sporočil, ki pomagajo strukturirati pogovore in omogočajo, da svoji UI dodate osebnost. Gradili boste klepetalne izkušnje, ki ohranjajo kontekst in značaj.
Razumevanje vrst sporočil
Te tipe sporočil si predstavljajte kot različne "kape", ki jih udeleženci nosijo v pogovoru. LangChain uporablja različne razrede sporočil, da spremlja, kdo kaj pravi:
| Vrsta sporočila | Namen | Primer uporabe |
|---|---|---|
SystemMessage |
Določa osebnost in vedenje UI | "Si prijazen pomočnik za kodiranje" |
HumanMessage |
Predstavlja uporabnikov vnos | "Pojasni, kako delujejo funkcije" |
AIMessage |
Shranjuje odgovore UI | Prejšnji odgovori UI v pogovoru |
Ustvarjanje prvega pogovora
Ustvarimo pogovor, kjer naša UI prevzame določeno vlogo. Naj bo to kapitan Picard – lik, znan po svoji diplomatski modrosti in vodstvu:
messages = [
SystemMessage(content="You are Captain Picard of the Starship Enterprise"),
HumanMessage(content="Tell me about you"),
]
Razčlenitev nastavitve pogovora:
- Določi vlogo in osebnost UI prek
SystemMessage - Doda začetno uporabniško vprašanje skozi
HumanMessage - Ustvari osnovo za večkratni pogovor
Celotna koda za ta primer izgleda tako:
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_openai import ChatOpenAI
import os
llm = ChatOpenAI(
api_key=os.environ["GITHUB_TOKEN"],
base_url="https://models.github.ai/inference",
model="openai/gpt-4o-mini",
)
messages = [
SystemMessage(content="You are Captain Picard of the Starship Enterprise"),
HumanMessage(content="Tell me about you"),
]
# deluje
response = llm.invoke(messages)
print(response.content)
Rezultat bi moral biti podoben:
I am Captain Jean-Luc Picard, the commanding officer of the USS Enterprise (NCC-1701-D), a starship in the United Federation of Planets. My primary mission is to explore new worlds, seek out new life and new civilizations, and boldly go where no one has gone before.
I believe in the importance of diplomacy, reason, and the pursuit of knowledge. My crew is diverse and skilled, and we often face challenges that test our resolve, ethics, and ingenuity. Throughout my career, I have encountered numerous species, grappled with complex moral dilemmas, and have consistently sought peaceful solutions to conflicts.
I hold the ideals of the Federation close to my heart, believing in the importance of cooperation, understanding, and respect for all sentient beings. My experiences have shaped my leadership style, and I strive to be a thoughtful and just captain. How may I assist you further?
Da ohranite kontinuiteto pogovora (namesto da vsakokrat ponastavite kontekst), morate še naprej dodajati odgovore na seznam sporočil. Tako kot so ustne tradicije ohranjale zgodbe skozi generacije, ta pristop gradi trajni spomin:
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_openai import ChatOpenAI
import os
llm = ChatOpenAI(
api_key=os.environ["GITHUB_TOKEN"],
base_url="https://models.github.ai/inference",
model="openai/gpt-4o-mini",
)
messages = [
SystemMessage(content="You are Captain Picard of the Starship Enterprise"),
HumanMessage(content="Tell me about you"),
]
# deluje
response = llm.invoke(messages)
print(response.content)
print("---- Next ----")
messages.append(response)
messages.append(HumanMessage(content="Now that I know about you, I'm Chris, can I be in your crew?"))
response = llm.invoke(messages)
print(response.content)
Kar lepo, kajne? Tukaj se dogaja to, da LLM kličemo dvakrat - najprej le z našima začetnima dvema sporočiloma, nato pa še z celotno zgodovino pogovora. Kot da UI dejansko spremlja naš klepet!
Ko zaženete to kodo, boste dobili drugi odgovor, ki zveni približno takole:
Welcome aboard, Chris! It's always a pleasure to meet those who share a passion for exploration and discovery. While I cannot formally offer you a position on the Enterprise right now, I encourage you to pursue your aspirations. We are always in need of talented individuals with diverse skills and backgrounds.
If you are interested in space exploration, consider education and training in the sciences, engineering, or diplomacy. The values of curiosity, resilience, and teamwork are crucial in Starfleet. Should you ever find yourself on a starship, remember to uphold the principles of the Federation: peace, understanding, and respect for all beings. Your journey can lead you to remarkable adventures, whether in the stars or on the ground. Engage!
sequenceDiagram
participant User
participant App
participant LangChain
participant AI
User->>App: "Povej mi o sebi"
App->>LangChain: [SystemMessage, HumanMessage]
LangChain->>AI: Oblikovano pogovor
AI->>LangChain: Odgovor kapitana Picarda
LangChain->>App: AIMessage objekt
App->>User: Prikaži odgovor
Note over App: Dodaj AIMessage v pogovor
User->>App: "Se lahko pridružim tvoji posadki?"
App->>LangChain: [SystemMessage, HumanMessage, AIMessage, HumanMessage]
LangChain->>AI: Celoten kontekst pogovora
AI->>LangChain: Kontekstualni odgovor
LangChain->>App: Nov AIMessage
App->>User: Prikaži kontekstualni odgovor
To bom vzel kot morda ;)
Pretakanje odgovorov
Ste že opazili, kako ChatGPT "tipka" svoje odgovore v realnem času? To je pretakanje v akciji. Kot gledati veščega kaligrafa pri delu – opazovati, kako se črke pojavijo zamah za zamahom namesto, da materializirajo naenkrat – pretakanje naredi interakcijo bolj naravno in omogoča takojšnjo povratno informacijo.
Izvedba pretakanja z LangChain
from langchain_openai import ChatOpenAI
import os
llm = ChatOpenAI(
api_key=os.environ["GITHUB_TOKEN"],
base_url="https://models.github.ai/inference",
model="openai/gpt-4o-mini",
streaming=True
)
# Tokovno predvajajte odgovor
for chunk in llm.stream("Write a short story about a robot learning to code"):
print(chunk.content, end="", flush=True)
Zakaj je pretakanje super:
- Prikaže vsebino, medtem ko nastaja – ni več nerodnega čakanja!
- Uporabnikom daje občutek, da se nekaj dejansko dogaja
- Deluje hitreje, tudi če tehnično ni
- Uporabnikom omogoča, da začnejo brati, medtem ko UI še "razmišlja"
💡 Nasvet za uporabniško izkušnjo: Pretakanje je zlate vredno pri daljših odgovorih, kot so razlage kode, ustvarjalno pisanje ali podrobni vodiči. Vaši uporabniki bodo uživali v opazovanju napredka namesto občudovanja praznega zaslona!
🎯 Pedagoška kontrola: Koristi abstrakcije okvirjev
Ustavite se in premislite: Pravkar ste izkusili moč abstrakcij AI okvirjev. Primerjajte to s surovimi API klici iz predhodnih lekcij.
Hitra samoevalvacija:
- Ali lahko pojasnite, kako LangChain poenostavi upravljanje pogovorov v primerjavi z ročnim sledenjem sporočil?
- Kaj je razlika med metodama
invoke()instream(), in kdaj bi uporabili katero? - Kako sistem tipov sporočil okvira izboljša organizacijo kode?
Povezava z resničnim svetom: Abstrakcijski vzorci, ki ste jih spoznali (tipi sporočil, pretakanje, pomnjenje pogovorov), se uporabljajo v vseh velikih UI aplikacijah - od vmesnika ChatGPT do pomoči pri kodi GitHub Copilot. Mojstrsko obvladujete iste arhitekturne vzorce, ki jih uporabljajo profesionalne ekipe za razvoj UI.
Izziv: Kako bi oblikovali abstrakcijo okvirja za upravljanje različnih ponudnikov modelov UI (OpenAI, Anthropic, Google) z enim samim vmesnikom? Premislite o prednostih in kompromisih.
Predloge pozivov
Predloge pozivov delujejo kot retorične strukture, uporabljene v klasični govorici - pomislite, kako je Ciceron prilagajal vzorce svojih govorov različnim občinstvom, medtem ko je ohranil isto prepričljivo strukturo. Omogočajo vam ustvarjanje ponovno uporabnih pozivov, kjer lahko preprosto zamenjate različne dele informacij, ne da bi vse prepisovali. Ko nastavite predlogo, le napolnite spremenljivke z vrednostmi, ki jih potrebujete.
Ustvarjanje ponovno uporabnih pozivov
from langchain_core.prompts import ChatPromptTemplate
# Določite predlogo za razlage kode
template = ChatPromptTemplate.from_messages([
("system", "You are an expert programming instructor. Explain concepts clearly with examples."),
("human", "Explain {concept} in {language} with a practical example for {skill_level} developers")
])
# Uporabite predlogo z različnimi vrednostmi
questions = [
{"concept": "functions", "language": "JavaScript", "skill_level": "beginner"},
{"concept": "classes", "language": "Python", "skill_level": "intermediate"},
{"concept": "async/await", "language": "JavaScript", "skill_level": "advanced"}
]
for question in questions:
prompt = template.format_messages(**question)
response = llm.invoke(prompt)
print(f"Topic: {question['concept']}\n{response.content}\n---\n")
Zakaj boste oboževali predloge:
- Ohranjajo doslednost vaših pozivov v celotni aplikaciji
- Nič več zapletenega združevanja nizov – zgolj čiste, preproste spremenljivke
- Vaša UI deluje predvidljivo, ker struktura ostaja enaka
- Posodobitve so hitro izvedljive – spremenite predlogo enkrat in je urejeno povsod
Strukturiran izhod
Ste se že kdaj razburjali, ko ste poskušali razčleniti odgovore UI, ki pridejo kot nestrukturirano besedilo? Strukturiran izhod je kot učenje vaše UI, da sledi sistematičnemu pristopu, ki ga je Linne uporabljal za biološko klasifikacijo – organizirano, predvidljivo in enostavno za delo. Lahko zahtevate JSON, specifične podatkovne strukture ali kateri koli format, ki ga potrebujete.
Določanje shem izhoda
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import JsonOutputParser
from pydantic import BaseModel, Field
class CodeReview(BaseModel):
score: int = Field(description="Code quality score from 1-10")
strengths: list[str] = Field(description="List of code strengths")
improvements: list[str] = Field(description="List of suggested improvements")
overall_feedback: str = Field(description="Summary feedback")
# Nastavite razčlenjevalnik
parser = JsonOutputParser(pydantic_object=CodeReview)
# Ustvarite poziv z navodili za format
prompt = ChatPromptTemplate.from_messages([
("system", "You are a code reviewer. {format_instructions}"),
("human", "Review this code: {code}")
])
# Oblikujte poziv z navodili
chain = prompt | llm | parser
# Pridobite strukturiran odgovor
code_sample = """
def calculate_average(numbers):
return sum(numbers) / len(numbers)
"""
result = chain.invoke({
"code": code_sample,
"format_instructions": parser.get_format_instructions()
})
print(f"Score: {result['score']}")
print(f"Strengths: {', '.join(result['strengths'])}")
Zakaj je strukturiran izhod prava revolucija:
- Nič več ugibanja, kakšen format boste prejeli – vedno je dosleden
- Neposredno se poveže z vašimi bazami podatkov in API-ji brez dodatnega dela
- Zajame nenavadne odgovore UI, preden pokvarijo vašo aplikacijo
- Pojasni vašo kodo, ker točno veste, s čim delate
Klic orodij
Zdaj pridemo do ene najmočnejših funkcij: orodja. Tako svoji UI daste praktične zmožnosti onkraj samega pogovora. Tako kot so srednjeveške cehi razvili specializirana orodja za specifične obrti, lahko svojo UI opremite s ciljanimi instrumenti. Opisujete, katera orodja so na voljo, in ko nekdo zahteva nekaj, kar ustreza, lahko vaša UI ukrepa.
Uporaba Pythona
Dodajmo nekaj orodij tako:
from typing_extensions import Annotated, TypedDict
class add(TypedDict):
"""Add two integers."""
# Oznake morajo imeti tip in lahko po možnosti vključujejo privzeto vrednost in opis (v tem vrstnem redu).
a: Annotated[int, ..., "First integer"]
b: Annotated[int, ..., "Second integer"]
tools = [add]
functions = {
"add": lambda a, b: a + b
}
Kaj se tukaj dogaja? Ustvarjamo načrt za orodje imenovano add. Z dedovanjem od TypedDict in uporabo naprednih tipov Annotated za a in b dajemo LLM jasen pogled, kaj orodje počne in kaj potrebuje. Slovar functions je kot naša škatla z orodji - natančno pove kodo, kaj naj naredi, ko se UI odloči uporabiti določeno orodje.
Poglejmo, kako naslednjič kličemo LLM s tem orodjem:
llm = ChatOpenAI(
api_key=os.environ["GITHUB_TOKEN"],
base_url="https://models.github.ai/inference",
model="openai/gpt-4o-mini",
)
llm_with_tools = llm.bind_tools(tools)
Tukaj kličemo bind_tools z našim poljem tools in s tem LLM llm_with_tools dobi znanje o tem orodju.
Za uporabo tega novega LLM lahko napišemo naslednjo kodo:
query = "What is 3 + 12?"
res = llm_with_tools.invoke(query)
if(res.tool_calls):
for tool in res.tool_calls:
print("TOOL CALL: ", functions[tool["name"]](../../../10-ai-framework-project/**tool["args"]))
print("CONTENT: ",res.content)
Zdaj, ko kličemo invoke na tem novem LLmu, ki ima orodja, je mogoče lastnost tool_calls zapolnjena. Če je tako, ima vsako identificirano orodje lastnost name in args, ki opredeljujeta, katero orodje naj se pokliče in s kakšnimi argumenti. Celotna koda izgleda tako:
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_openai import ChatOpenAI
import os
from typing_extensions import Annotated, TypedDict
class add(TypedDict):
"""Add two integers."""
# Oznake morajo imeti tip in lahko opcijsko vključujejo privzeto vrednost ter opis (v tem vrstnem redu).
a: Annotated[int, ..., "First integer"]
b: Annotated[int, ..., "Second integer"]
tools = [add]
functions = {
"add": lambda a, b: a + b
}
llm = ChatOpenAI(
api_key=os.environ["GITHUB_TOKEN"],
base_url="https://models.github.ai/inference",
model="openai/gpt-4o-mini",
)
llm_with_tools = llm.bind_tools(tools)
query = "What is 3 + 12?"
res = llm_with_tools.invoke(query)
if(res.tool_calls):
for tool in res.tool_calls:
print("TOOL CALL: ", functions[tool["name"]](../../../10-ai-framework-project/**tool["args"]))
print("CONTENT: ",res.content)
Ob zagonu te kode bi morali videti izhod, podoben temu:
TOOL CALL: 15
CONTENT:
UI je pregledala "Kaj je 3 + 12" in prepoznala nalogo za orodje add. Tako kot vešč knjižničar ve, kateri vir posvetovati glede na vrsto vprašanja, je to odločitev sprejela na podlagi imena orodja, opisa in specifikacije polj. Rezultat 15 prinaša naš slovar functions, ki izvrši orodje:
print("TOOL CALL: ", functions[tool["name"]](../../../10-ai-framework-project/**tool["args"]))
Malo bolj zanimivo orodje, ki kliče spletni API
Dodajanje številk ponazarja koncept, vendar imajo resnična orodja običajno bolj zapletene operacije, na primer klicanje spletnih API-jev. Razširimo naš primer, da bo AI pridobil vsebino iz interneta – podobno kot so telegrafisti nekoč povezovali oddaljene lokacije:
class joke(TypedDict):
"""Tell a joke."""
# Oznake morajo imeti tip in lahko po želji vključujejo privzeto vrednost ter opis (v tem vrstnem redu).
category: Annotated[str, ..., "The joke category"]
def get_joke(category: str) -> str:
response = requests.get(f"https://api.chucknorris.io/jokes/random?category={category}", headers={"Accept": "application/json"})
if response.status_code == 200:
return response.json().get("value", f"Here's a {category} joke!")
return f"Here's a {category} joke!"
functions = {
"add": lambda a, b: a + b,
"joke": lambda category: get_joke(category)
}
query = "Tell me a joke about animals"
# preostali del kode je enak
Če zdaj zaženete to kodo, boste dobili odziv, ki bo nekaj takega:
TOOL CALL: Chuck Norris once rode a nine foot grizzly bear through an automatic car wash, instead of taking a shower.
CONTENT:
flowchart TD
A[Uporabniška poizvedba: "Povej mi vic o živalih"] --> B[Analiza LangChain]
B --> C{Orodje na voljo?}
C -->|Da| D[Izberi orodje za vice]
C -->|Ne| E[Ustvari neposreden odgovor]
D --> F[Izvleci parametre]
F --> G[Kliči vic(kategorija="živali")]
G --> H[Zahteva API na chucknorris.io]
H --> I[Vrnitev vsebine vica]
I --> J[Prikaz uporabniku]
E --> K[AI-generiran odgovor]
K --> J
subgraph "Plast definicije orodja"
L[Shema TypedDict]
M[Implementacija funkcije]
N[Preverjanje parametrov]
end
D --> L
F --> N
G --> M
Tukaj je koda v celoti:
from langchain_openai import ChatOpenAI
import requests
import os
from typing_extensions import Annotated, TypedDict
class add(TypedDict):
"""Add two integers."""
# Oznake morajo imeti tip in lahko neobvezno vključujejo privzeto vrednost ter opis (v tem vrstnem redu).
a: Annotated[int, ..., "First integer"]
b: Annotated[int, ..., "Second integer"]
class joke(TypedDict):
"""Tell a joke."""
# Oznake morajo imeti tip in lahko neobvezno vključujejo privzeto vrednost ter opis (v tem vrstnem redu).
category: Annotated[str, ..., "The joke category"]
tools = [add, joke]
def get_joke(category: str) -> str:
response = requests.get(f"https://api.chucknorris.io/jokes/random?category={category}", headers={"Accept": "application/json"})
if response.status_code == 200:
return response.json().get("value", f"Here's a {category} joke!")
return f"Here's a {category} joke!"
functions = {
"add": lambda a, b: a + b,
"joke": lambda category: get_joke(category)
}
llm = ChatOpenAI(
api_key=os.environ["GITHUB_TOKEN"],
base_url="https://models.github.ai/inference",
model="openai/gpt-4o-mini",
)
llm_with_tools = llm.bind_tools(tools)
query = "Tell me a joke about animals"
res = llm_with_tools.invoke(query)
if(res.tool_calls):
for tool in res.tool_calls:
# print("POKLIC ORODJA: ", tool)
print("TOOL CALL: ", functions[tool["name"]](../../../10-ai-framework-project/**tool["args"]))
print("CONTENT: ",res.content)
Vstavljanja (embeddings) in obdelava dokumentov
Vstavljanja predstavljajo eno najbolj elegantnih rešitev v sodobni umetni inteligenci. Predstavljajte si, da bi lahko kateri koli kos besedila pretvorili v numerične koordinate, ki zajamejo njegov pomen. To natančno počnejo vstavljanja – pretvorijo besedilo v točke v večdimenzionalnem prostoru, kjer se podobni koncepti združujejo. To je kot imeti koordinatni sistem za ideje, ki spominja na to, kako je Mendelejev organiziral periodni sistem glede na atomske lastnosti.
Ustvarjanje in uporaba vstavljanj
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
# Inicializiraj vgradnje
embeddings = OpenAIEmbeddings(
api_key=os.environ["GITHUB_TOKEN"],
base_url="https://models.github.ai/inference",
model="text-embedding-3-small"
)
# Naloži in razdeli dokumente
loader = TextLoader("documentation.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
# Ustvari vektorsko skladišče
vectorstore = FAISS.from_documents(texts, embeddings)
# Izvedi iskanje podobnosti
query = "How do I handle user authentication?"
similar_docs = vectorstore.similarity_search(query, k=3)
for doc in similar_docs:
print(f"Relevant content: {doc.page_content[:200]}...")
Nalagalniki dokumentov za različne formate
from langchain_community.document_loaders import (
PyPDFLoader,
CSVLoader,
JSONLoader,
WebBaseLoader
)
# Naloži različne vrste dokumentov
pdf_loader = PyPDFLoader("manual.pdf")
csv_loader = CSVLoader("data.csv")
json_loader = JSONLoader("config.json")
web_loader = WebBaseLoader("https://example.com/docs")
# Obdelaj vse dokumente
all_documents = []
for loader in [pdf_loader, csv_loader, json_loader, web_loader]:
docs = loader.load()
all_documents.extend(docs)
Kaj lahko naredite z vstavljanji:
- Ustvarite iskanje, ki res razume, kaj mislite, ne samo ujemanje ključnih besed
- Naredite AI, ki lahko odgovarja na vprašanja o vaših dokumentih
- Izdelate priporočilne sisteme, ki predlagajo res relevantno vsebino
- Samodejno organizirate in kategorizirate vašo vsebino
flowchart LR
A[Dokumenti] --> B[Razdelilec besedila]
B --> C[Ustvari odtise]
C --> D[Skladišče vektorjev]
E[Uporabnikov poizvedba] --> F[Odtis poizvedbe]
F --> G[Iskanje podobnosti]
G --> D
D --> H[Ustrezni dokumenti]
H --> I[Odgovor AI]
subgraph "Vektorski prostor"
J[Dokument A: [0.1, 0.8, 0.3...]]
K[Dokument B: [0.2, 0.7, 0.4...]]
L[Poizvedba: [0.15, 0.75, 0.35...]]
end
C --> J
C --> K
F --> L
G --> J
G --> K
Gradnja celostne AI aplikacije
Zdaj bomo združili vse, kar ste se naučili, v celovito aplikacijo – pomočnika za kodiranje, ki lahko odgovarja na vprašanja, uporablja orodja in vzdržuje spomin pogovora. Tako kot je tiskarski stroj združil obstoječe tehnologije (premične črke, črnilo, papir in pritisk) v nekaj prelomnega, bomo tudi mi združili naše AI komponente v nekaj praktičnega in uporabnega.
Celovit primer aplikacije
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.messages import HumanMessage, SystemMessage, AIMessage
from langchain_community.vectorstores import FAISS
from typing_extensions import Annotated, TypedDict
import os
import requests
class CodingAssistant:
def __init__(self):
self.llm = ChatOpenAI(
api_key=os.environ["GITHUB_TOKEN"],
base_url="https://models.github.ai/inference",
model="openai/gpt-4o-mini"
)
self.conversation_history = [
SystemMessage(content="""You are an expert coding assistant.
Help users learn programming concepts, debug code, and write better software.
Use tools when needed and maintain a helpful, encouraging tone.""")
]
# Določi orodja
self.setup_tools()
def setup_tools(self):
class web_search(TypedDict):
"""Search for programming documentation or examples."""
query: Annotated[str, "Search query for programming help"]
class code_formatter(TypedDict):
"""Format and validate code snippets."""
code: Annotated[str, "Code to format"]
language: Annotated[str, "Programming language"]
self.tools = [web_search, code_formatter]
self.llm_with_tools = self.llm.bind_tools(self.tools)
def chat(self, user_input: str):
# Dodaj uporabnikovo sporočilo v pogovor
self.conversation_history.append(HumanMessage(content=user_input))
# Pridobi AI odgovor
response = self.llm_with_tools.invoke(self.conversation_history)
# Obravnava poklice orodij, če obstajajo
if response.tool_calls:
for tool_call in response.tool_calls:
tool_result = self.execute_tool(tool_call)
print(f"🔧 Tool used: {tool_call['name']}")
print(f"📊 Result: {tool_result}")
# Dodaj AI odgovor v pogovor
self.conversation_history.append(response)
return response.content
def execute_tool(self, tool_call):
tool_name = tool_call['name']
args = tool_call['args']
if tool_name == 'web_search':
return f"Found documentation for: {args['query']}"
elif tool_name == 'code_formatter':
return f"Formatted {args['language']} code: {args['code'][:50]}..."
return "Tool execution completed"
# Primer uporabe
assistant = CodingAssistant()
print("🤖 Coding Assistant Ready! Type 'quit' to exit.\n")
while True:
user_input = input("You: ")
if user_input.lower() == 'quit':
break
response = assistant.chat(user_input)
print(f"🤖 Assistant: {response}\n")
Arhitektura aplikacije:
graph TD
A[Uporabniški vnos] --> B[Pomočnik za kodiranje]
B --> C[Pogovorni pomnilnik]
B --> D[Zaznavanje orodij]
B --> E[Obdelava LLM]
D --> F[Orodje za spletno iskanje]
D --> G[Orodje za oblikovanje kode]
E --> H[Generiranje odgovora]
F --> H
G --> H
H --> I[Uporabniški vmesnik]
H --> C
Ključne funkcije, ki smo jih implementirali:
- Se spomni celoten potek pogovora za kontinuiteto konteksta
- Izvaja ukrepe preko klicanja orodij, ne samo pogovora
- Sledi predvidljivim vzorcem interakcije
- Samodejno upravlja z obravnavo napak in zapletenimi delovnimi procesi
🎯 Pedagoški pregled: Arhitektura produkcijske AI
Razumevanje arhitekture: Zgradili ste celovito AI aplikacijo, ki združuje upravljanje pogovora, klicanje orodij in strukturirane delovne tokove. To predstavlja razvoj AI aplikacij na produkcijski ravni.
Ključni osvojeni koncepti:
- Arhitektura na osnovi razredov: organizirana, vzdržna struktura AI aplikacije
- Integracija orodij: prilagojene funkcije preko orodij
- Upravljanje spomina: trajni kontekst pogovora
- Obravnava napak: robustno vedenje aplikacije
Povezava z industrijo: vzorci arhitekture, ki ste jih uporabili (razredi pogovorov, sistemi orodij, upravljanje spomina) so isti vzorci, kot jih uporabljajo podjetniške AI aplikacije, kot so Slackov AI pomočnik, GitHub Copilot in Microsoft Copilot. Zgradili ste s profesionalnim arhitekturnim pristopom.
Vprašanje za razmislek: Kako bi razširili to aplikacijo za več uporabnikov, trajno shranjevanje ali integracijo s zunanjimi podatkovnimi bazami? Razmislite o problemih razširljivosti in upravljanja stanja.
Naloga: Zgradite svojega AI pomočnika za študij
Cilj: Ustvariti AI aplikacijo, ki študentom pomaga pri učenju programskih konceptov z razlagami, primeri kode in interaktivnimi kvizi.
Zahteve
Osnovne funkcije (obvezno):
- Vmesnik za pogovor: Implementirajte klepetalni sistem, ki ohranja kontekst skozi več vprašanj
- Izobraževalna orodja: Ustvarite vsaj dve orodji za pomoč pri učenju:
- Orodje za razlago kode
- Generator konceptualnih kvizov
- Personalizirano učenje: Uporabite sistemska sporočila za prilagajanje odgovorov različnim stopnjam znanja
- Oblikovanje odgovorov: Implementirajte strukturiran izhod za vprašanja v kvizu
Koraki izvedbe
Korak 1: Nastavite okolje
pip install langchain langchain-openai
Korak 2: Osnovna funkcionalnost klepeta
- Ustvarite razred
StudyAssistant - Implementirajte spomin pogovora
- Dodajte konfiguracijo osebnosti za podporo izobraževanju
Korak 3: Dodajte izobraževalna orodja
- Razlagalec kode: Razčleni kodo v razumljive dele
- Generator kvizov: Ustvari vprašanja o programskih konceptih
- Spremljevalec napredka: Evidentira preučevane teme
Korak 4: Izboljšane funkcije (neobvezno)
- Implementirajte pretočne odgovore za boljšo uporabniško izkušnjo
- Dodajte nalaganje dokumentov za vključevanje študijskega gradiva
- Ustvarite vstavljanja za iskanje vsebin glede na podobnost
Merila ocenjevanja
| Funkcija | Odlično (4) | Dobro (3) | Zadovoljivo (2) | Potrebuje delo (1) |
|---|---|---|---|---|
| Potek pogovora | Naravni, kontekstno zavestni odgovori | Dobro ohranjanje konteksta | Osnovni pogovor | Brez shranjenega spomina med izmenjavami |
| Integracija orodij | Več uporabnih orodij deluje brezhibno | 2+ orodji pravilno implementirani | 1-2 osnovni orodji | Orodja ne delujejo |
| Kakovost kode | Čista, dobro dokumentirana, z obravnavo napak | Dobra struktura, nekaj dokumentacije | Osnovna funkcionalnost deluje | Slaba struktura, brez obravnave napak |
| Izobraževalna vrednost | Resnično pomaga pri učenju, prilagojena | Dobra podpora učenju | Osnovne razlage | Omejena izobraževalna vrednost |
Vzorec strukture kode
class StudyAssistant:
def __init__(self, skill_level="beginner"):
# Inicializirajte LLM, orodja in pomnilnik pogovora
pass
def explain_code(self, code, language):
# Orodje: Pojasnite, kako koda deluje
pass
def generate_quiz(self, topic, difficulty):
# Orodje: Ustvarite vaje vprašanja
pass
def chat(self, user_input):
# Glavni uporabniški vmesnik pogovora
pass
# Primer uporabe
assistant = StudyAssistant(skill_level="intermediate")
response = assistant.chat("Explain how Python functions work")
Bonus izzivi:
- Dodajte zvočni vnos/izhod
- Implementirajte spletni vmesnik z Streamlit ali Flask
- Ustvarite bazo znanja iz študijskega gradiva z uporabo vstavljanj
- Dodajte sledenje napredku in personalizirane učne poti
📈 Vaša časovnica obvladovanja razvoja AI ogrodja
timeline
title Pot razvoja produkcijskega OKVIRA za AI
section Osnove okvira
Razumevanje abstrakcij
: Odločitve mojstrskega okvira proti API-ju
: Spoznajte osnovne koncepte LangChain
: Implementirajte sisteme tipov sporočil
Osnovna integracija
: Povežite se z AI ponudniki
: Urejajte preverjanje pristnosti
: Upravljajte konfiguracijo
section Sistemi pogovorov
Upravljanje spomina
: Zgradite zgodovino pogovorov
: Implementirajte sledenje kontekstu
: Obravnavajte vztrajnost seje
Napredne interakcije
: Obvladujte pretočne odzive
: Ustvarite predloge pozivov
: Implementirajte strukturirano izhodno obliko
section Integracija orodij
Razvoj po meri orodij
: Oblikujte sheme orodij
: Implementirajte klicanje funkcij
: Obravnavajte zunanje API-je
Avtomatizacija delovnih tokov
: Povežite več orodij
: Ustvarite drevesa odločitev
: Zgradite vedenja agentov
section Produkcijske aplikacije
Celovita arhitektura sistema
: Združite vse funkcije okvira
: Implementirajte meje za napake
: Ustvarite vzdržen kodo
Pripravljenost za podjetja
: Obravnavajte pomisleke glede razširljivosti
: Implementirajte nadzor
: Zgradite strategije uvajanja
🎓 Mejniki diplomiranja: Uspešno ste obvladali razvoj AI ogrodij z uporabo enakih orodij in vzorcev, ki poganjajo sodobne AI aplikacije. Ti veščine predstavljajo vrh razvoja AI aplikacij in vas pripravljajo na gradnjo intelektualnih sistemov na ravni podjetij.
🔄 Naslednje sposobnosti:
- Pripravljeni za raziskovanje naprednih AI arhitektur (agenti, večagentni sistemi)
- Pripravljeni za gradnjo RAG sistemov z vektorskimi podatkovnimi bazami
- Opremljeni za izdelavo multimodalnih AI aplikacij
- Postavljen temelj za skaliranje in optimizacijo AI aplikacij
Povzetek
🎉 Zdaj ste obvladali osnove razvoja AI ogrodij in se naučili, kako zgraditi sofisticirane AI aplikacije z uporabo LangChain. Tako kot zaključek celovitega vajeništva ste pridobili obsežen nabor orodij. Preglejmo, kaj ste dosegli.
Kaj ste se naučili
Osnovni koncepti ogrodja:
- Prednosti ogrodij: Razumevanje, kdaj izbrati ogrodja namesto neposrednih klicev API-ja
- Osnove LangChaina: Namestitev in konfiguracija povezav s AI modeli
- Vrste sporočil: Uporaba
SystemMessage,HumanMessageinAIMessageza strukturirane pogovore
Napredne funkcije:
- Klicanje orodij: Ustvarjanje in integracija prilagojenih orodij za izboljšanje AI zmožnosti
- Spomin pogovora: Ohranjanje konteksta skozi več izmenjav
- Pretok odgovorov: Implementacija dostave odgovorov v realnem času
- Predloge pozivov: Gradnja večkrat uporabnih, dinamičnih pozivov
- Strukturiran izhod: Zagotavljanje doslednih, analizirnih odgovorov AI
- Vstavljanja: Ustvarjanje semantičnega iskanja in obdelave dokumentov
Praktične aplikacije:
- Gradnja celovitih aplikacij: Združevanje več funkcij v produkcijsko pripravljene aplikacije
- Upravljanje napak: Implementacija robustnega upravljanja in preverjanja napak
- Integracija orodij: Ustvarjanje prilagojenih orodij, ki širijo AI kapacitete
Ključni poudarki
🎯 Zapomnite si: AI ogrodja, kot je LangChain, so pravzaprav vaši prijatelji, ki skrivajo kompleksnost in imajo obilico funkcij. Popolni so, ko potrebujete spomin pogovora, klicanje orodij ali želite delati z več AI modeli, ne da bi izgubili razum.
Odločanje o integraciji AI:
flowchart TD
A[Potreba po integraciji AI] --> B{Preprosto enojno poizvedbo?}
B -->|Da| C[Direktni API klici]
B -->|Ne| D{Potrebujete spomin pogovora?}
D -->|Ne| E[SDK integracija]
D -->|Da| F{Potrebujete orodja ali kompleksne funkcije?}
F -->|Ne| G[Okvir z osnovno nastavitvijo]
F -->|Da| H[Polna implementacija okvira]
C --> I[HTTP zahtevki, minimalne odvisnosti]
E --> J[SDK ponudnika, specifičen za model]
G --> K[Osnovni klepet LangChain]
H --> L[LangChain z orodji, spominom, agenti]
Kam naprej?
Začnite graditi zdaj:
- Vzemite te koncepte in ustvarite nekaj, kar VAS navdušuje!
- Igrajte se z različnimi AI modeli prek LangChaina – to je kot otroško igrišče AI modelov
- Ustvarite orodja, ki rešujejo dejanske probleme, s katerimi se srečujete v delu ali projektih
Pripravljeni na naslednjo stopnjo?
- AI Agenti: Gradite AI sisteme, ki lahko sami načrtujejo in izvajajo zapletene naloge
- RAG (Retrieval-Augmented Generation): Združite AI z vašimi bazami znanja za izjemno zmogljive aplikacije
- Multimodalni AI: Delo z besedilom, slikami in zvokom skupaj – možnosti so neomejene!
- Produkcijska uporaba: Naučite se skalirati vaše AI aplikacije in jih spremljati v realnem svetu
Pridružite se skupnosti:
- Skupnost LangChain je odlična za ostati na tekočem in se učiti najboljših praks
- GitHub Models vam omogoča dostop do najsodobnejših AI zmogljivosti – kot nalašč za eksperimentiranje
- Nadaljujte z vadbo za različne primere uporabe – vsak projekt vas bo nekaj naučil
Zdaj imate znanje, da ustvarjate inteligentne, pogovorne aplikacije, ki ljudem pomagajo reševati resnične težave. Tako kot renesančni mojstri, ki so združevali umetniško vizijo s tehničnim znanjem, lahko zdaj združite AI zmogljivosti s praktično uporabo. Vprašanje je: kaj boste ustvarili? 🚀
GitHub Copilot Agent izziv 🚀
Uporabite način Agenta za izpolnitev naslednjega izziva:
Opis: Zgradite naprednega AI pomočnika za pregled kode, ki združuje več funkcij LangChain, vključno s klicanjem orodij, strukturiranim izhodom in spominom pogovora, da zagotovi celovite povratne informacije o oddajah kode.
Poziv: Ustvarite razred CodeReviewAssistant, ki implementira:
- Orodje za analizo kompleksnosti kode in predloge za izboljšave
- Orodje za preverjanje kode glede na najboljše prakse
- Strukturiran izhod z uporabo Pydantic modelov za dosleden format pregleda
- Spomin pogovora za sledenje seansam pregleda
- Glavni klepetalni vmesnik, ki lahko obravnava oddaje kode in nudi podrobne, izvedljive povratne informacije
Pomočnik mora znati pregledovati kodo v več programskih jezikih, ohraniti kontekst skozi več oddaj kode v seji in nuditi tako povzetne ocene kot podrobne predloge za izboljšave.
Več o načinu agenta si preberite tukaj.
Omejitev odgovornosti: Ta dokument je bil preveden z uporabo AI prevajalske storitve Co-op Translator. Čeprav si prizadevamo za natančnost, vas opozarjamo, da avtomatizirani prevodi lahko vsebujejo napake ali netočnosti. Izvirni dokument v izvirnem jeziku velja za avtoritativni vir. Za pomembne informacije priporočamo strokoven človeški prevod. Za morebitne nesporazume ali napačne interpretacije, ki izhajajo iz uporabe tega prevoda, ne prevzemamo odgovornosti.