|
|
1 month ago | |
|---|---|---|
| .. | ||
| solution | 4 months ago | |
| README.md | 1 month ago | |
README.md
AI raamistik
Kas oled kunagi tundnud end ülekoormatuna, püüdes AI-rakendusi nullist ehitada? Sa ei ole üksi! AI raamistikud on nagu Šveitsi taskunuga AI arendusele – need on võimsad tööriistad, mis säästavad aega ja peavalu nutikate rakenduste loomisel. Mõtle AI raamistikule kui hästi korraldatud raamatukogule: see pakub eelvalmisteid komponente, standardiseeritud API-sid ja nutikaid abstraktsioone, et saaksid keskenduda probleemide lahendamisele, mitte rakenduse detailide kallal rabelemisele.
Selles õppetükis uurime, kuidas raamistikud nagu LangChain muudavad kunagised keerulised AI integreerimise ülesanded puhtaks ja loetavaks koodiks. Sa õpid, kuidas lahendada päriselu väljakutseid nagu vestluste jälgimine, tööriistakõnede rakendamine ja erinevate AI mudelite haldamine ühtse liidese kaudu.
Kui me lõpetame, tead, millal haarata raamistikule mitte aga põhilähedale API-kõnedele, kuidas kasutada nende abstraktsioone efektiivselt ja kuidas ehitada AI-rakendusi, mis on valmis päriselu kasutuseks. Vaatame, mida AI raamistikud sinu projektidele teha saavad.
⚡ Mida saad teha järgmise 5 minutiga
Kiire algus hõivatud arendajatele
flowchart LR
A[⚡ 5 minutit] --> B[Paigalda LangChain]
B --> C[Loo ChatOpenAI klient]
C --> D[Saada esimene üleskutse]
D --> E[Näe raamistikku võimsust]
- 1. minut: Installi LangChain:
pip install langchain langchain-openai - 2. minut: Sea üles oma GitHub token ja impordi ChatOpenAI klient
- 3. minut: Loo lihtne vestlus süsteemi ja inimese sõnumitega
- 4. minut: Lisa põhiline tööriist (näiteks liitmistehe) ja vaata AI tööriistakõnede toimimist
- 5. minut: Koge vahet nõtmete API-kõnede ja raamistikupõhise abstraktsiooni vahel
Kiire testikood:
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)
Miks see oluline on: 5 minutiga saad kogemuse, kuidas AI raamistikud muudavad keerulise AI integreerimise lihtsate meetodikõnedeks. See on alus, mis aitab käivitada tööstuslikke AI rakendusi.
Miks valida raamistik?
Nüüd oled valmis AI rakendust ehitama – tubli! Aga siin on asi: sul on mitu erinevat teed, mida mööda minna, ning igaühel on omad plussid ja miinused. See on nagu valida, kas jala käia, rattaga sõita või autoga minna – kõik viivad kohale, aga kogemus (ja pingutus) on täiesti erinev.
Vaatame kolme peamist viisi, kuidas AI-d oma projektidesse integreerida:
| Lähenemine | Eelised | Sobib | Mõtted |
|---|---|---|---|
| Otsekohesed HTTP päringud | Täielik kontroll, pole sõltuvusi | Lihtsad päringud, fundamentide õppimine | Rohkem koodi, käsitsi veahaldus |
| SDK integratsioon | Vähem tülikat koodi, mudelispetsiifiline optimeerimine | Ühe mudeli rakendused | Piiratud konkreetsete pakkujatega |
| AI raamistikud | Ühtne API, sisseehitatud abstraktsioonid | Mitme mudeliga rakendused, keerulised töövood | Õppimiskõver, võimalik ülearune abstraktsioon |
Raamistike eelised praktikas
graph TD
A[Teie rakendus] --> B[Tehisintellekti raamistik]
B --> C[OpenAI GPT]
B --> D[Anthropic Claude]
B --> E[GitHub mudelid]
B --> F[Kohalikud mudelid]
B --> G[Sisseehitatud tööriistad]
G --> H[Mälu haldamine]
G --> I[Vestluse ajalugu]
G --> J[Funktsiooni kutsumine]
G --> K[Vigade käsitlemine]
Miks raamistikud on olulised:
- Ühendavad mitmed AI pakkujad ühe liidese alla
- Haldavad automaatselt vestluse mälu
- Pakuvad valmis tööriistu levinud ülesanneteks nagu manused ja funktsioonide kutsumine
- Juhtivad veahaldust ja taasingutuse loogikat
- Muutvad keerulised töövood loetavaks meetodikõnedeks
💡 Pro näpunäide: Kasuta raamistikku, kui vahetad AI mudeleid või ehitad keerukaid funktsioone nagu agendid, mälu või tööriistakõned. Kasuta otse API-sid, kui õpid algtõdesid või ehitad lihtsaid spetsiifilisi rakendusi.
Järeldus: Nagu valida spetsialiseeritud käsitööriistade ja täisvarustusega töökoja vahel, on oluline valida tööriist vastavalt ülesandele. Raamistikud on parimad keerukate ja funktsiooniderikaste rakenduste jaoks, otse API-d sobivad lihtsate kasutusjuhtude jaoks hästi.
🗺️ Sinu õppimise teekond AI raamistike meistriks
journey
title Toor API-dest tootmisesse AI rakendustesse
section Raamistiku alused
Mõista abstraktsiooni eeliseid: 4: You
Saa LangChaini põhiteadmiste meistriks: 6: You
Võrdle lähenemisi: 7: You
section Vestlussüsteemid
Loo jutuliideseid: 5: You
Rakenda mälumustreid: 7: You
Töötle voolutavaid vastuseid: 8: You
section Arendatud funktsioonid
Loo kohandatud tööriistu: 6: You
Saa meistriks struktureeritud väljundis: 8: You
Loo dokumendisüsteeme: 8: You
section Tootmisrakendused
Ühenda kõik funktsioonid: 7: You
Töötle vigade stsenaariume: 8: You
Juhi täielikke süsteeme: 9: You
Sinu sihtkoht: Selle õppetüki lõpuks valdad AI raamistike arendamist ja suudad luua keerukaid, tootmisklassi AI rakendusi, mis konkureerivad kommertslike AI assistentidega.
Sissejuhatus
Selles õppetükis õpid:
- Kasutama tavalist AI raamistikku.
- Lahendama tavalisi probleeme nagu vestlused, tööriistade kasutus, mälu ja kontekst.
- Kasutama seda AI rakenduste ehitamiseks.
🧠 AI raamistiku arendusökosüsteem
mindmap
root((Tehisintellekti Raamistikud))
Abstraction Benefits
Code Simplification
Unified APIs
Built-in Error Handling
Consistent Patterns
Reduced Boilerplate
Multi-Model Support
Provider Agnostic
Easy Switching
Fallback Options
Cost Optimization
Core Components
Conversation Management
Message Types
Memory Systems
Context Tracking
History Persistence
Tool Integration
Function Calling
API Connections
Custom Tools
Workflow Automation
Advanced Features
Structured Output
Pydantic Models
JSON Schemas
Type Safety
Validation Rules
Document Processing
Embeddings
Vector Stores
Similarity Search
RAG Systems
Production Patterns
Application Architecture
Modular Design
Error Boundaries
Async Operations
State Management
Deployment Strategies
Skalaarvus
Järelevalve
Jõudlus
Turvalisus
Põhiprintsiip: AI raamistikud abstraktseerivad keerukust, pakkudes võimsaid abstraktsioone vestluste haldamiseks, tööriistade integreerimiseks ja dokumentide töötlemiseks, võimaldades arendajatel luua keerukaid AI rakendusi puhta ja hooldatava koodiga.
Sinu esimene AI päring
Alustame põhialustest, luues oma esimese AI rakenduse, mis saadab küsimuse ja saab vastuse tagasi. Nagu Archimedes oma vannis avastas nihkumise printsiibi, mõnikord viivad lihtsad tähelepanekud kõige võimsamate teadmiste juurde – raamistikud teevad need teadmised kättesaadavaks.
LangChaini seadistamine GitHubi mudelitega
Kasutan LangChaini ühendamaks end GitHubi mudelitega, mis on päris vahva, sest annab sulle tasuta ligipääsu erinevatele AI mudelitele. Parim osa? Alguseks piisab vaid mõnest lihtsast konfiguratsiooniparameetrist:
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",
)
# Saada lihtne päring
response = llm.invoke("What's the capital of France?")
print(response.content)
Vaatame, mis siin toimub:
- Loo LangChain klient
ChatOpenAIklassi abil – see on su tee AI-sse! - Sea ühendus GitHubi mudelitega oma autentimistornega
- Määra, millist AI mudelit kasutada (
gpt-4o-mini) – mõtle sellele kui oma AI assistendi valikule - Saada küsimus
invoke()meetodi kaudu – siin sünnib võlu - Võta vastus ja kuva see – voilà, sa suhtled AI-ga!
🔧 Seadistamisnõuanne: Kui kasutad GitHub Codespaces, on sul vedanud –
GITHUB_TOKENon juba seadistatud! Töötad lokaalselt? Pole probleemi, pead lihtsalt looma isikliku ligipääsutokeni õige õigusega.
Oodatav väljund:
The capital of France is Paris.
sequenceDiagram
participant App as Teie Pythoni rakendus
participant LC as LangChain
participant GM as GitHub mudelid
participant AI as GPT-4o-mini
App->>LC: llm.invoke("Mis on Prantsusmaa pealinn?")
LC->>GM: HTTP päring koos promptiga
GM->>AI: Töötle prompt
AI->>GM: Genereeritud vastus
GM->>LC: Tagasta vastus
LC->>App: vastus.sisu
Vestlusliku AI ehitamine
See esimene näide näitab põhialuseid, aga see on ainult üks vahetus – sa küsid, saad vastuse ja see ongi kõik. Tõelistes rakendustes tahad, et su AI mäletaks, mida olete arutanud, nagu Watson ja Holmes ehitasid oma uurimisvestlusi aja jooksul.
Siin tuleb mängu LangChain. See pakub erinevaid sõnumitüüpe, mis aitavad vestlusi struktureerida ja lubavad anda AI-le iseloomu. Sa ehitad vestluskogemusi, mis hoiavad konteksti ja karakterit.
Sõnumitüüpide mõistmine
Mõtle sellele, et need sõnumitüübid on nagu erinevad "mütsid", mida vestlusosalistel on peas. LangChain kasutab erinevaid sõnumiklasse, et jälgida, kes mida ütleb:
| Sõnumitüüp | Eesmärk | Näide kasutusest |
|---|---|---|
SystemMessage |
Määrab AI isiksuse ja käitumise | "Sa oled abivalmis programmeerimisassistent" |
HumanMessage |
Esindab kasutaja sisendit | "Selgita, kuidas funktsioonid toimivad" |
AIMessage |
Salvestab AI vastuseid | Varasemad AI vastused vestluses |
Loo oma esimene vestlus
Loome vestluse, kus meie AI võtab kindla rolli. Anname talle Kapten Picardi iseloomu – tegelane, kes on tuntud oma diplomaatilise tarkuse ja juhtimisoskuse poolest:
messages = [
SystemMessage(content="You are Captain Picard of the Starship Enterprise"),
HumanMessage(content="Tell me about you"),
]
Vestluse seadistuse lahtimurdmine:
- Määrab AI rolli ja iseloomu läbi
SystemMessage - Sisestab algse kasutajaküsimuse
HumanMessagekaudu - Loomulikult rajab mitme vooru vestluse aluse
Siin on kogu kood selle näite jaoks:
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"),
]
# töötab
response = llm.invoke(messages)
print(response.content)
Peaksid nägema tulemust, mis näeb välja umbes nii:
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?
Vestluse järjepidevuse säilitamiseks (konteksti vaikimisi parandamise asemel) pead hoidma vastuseid oma sõnumite loendis. Nii nagu suuline traditsioon säilitas lugusid põlvest põlve, loob see meetod kestva mälu:
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"),
]
# töötab
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)
Päris lahe, eks? Siin toimub see, et kutsume LLM-i kaks korda – esmalt kahe algse sõnumiga, siis kogu vestluse looga. See on nagu AI jälgiks tahtlikult meie jutuajamist!
Kui jooksutad seda koodi, saad teise vastuse, mis kõlab ligikaudu nii:
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: "Räägi mulle endast"
App->>LangChain: [SystemMessage, HumanMessage]
LangChain->>AI: Vormindatud vestlus
AI->>LangChain: Kapten Picardi vastus
LangChain->>App: AIMessage objekt
App->>User: Kuvage vastus
Note over App: Lisa AIMessage vestlusse
User->>App: "Kas ma võin teie meeskonnaga liituda?"
App->>LangChain: [SystemMessage, HumanMessage, AIMessage, HumanMessage]
LangChain->>AI: Täielik vestluse kontekst
AI->>LangChain: Kontekstipõhine vastus
LangChain->>App: Uus AIMessage
App->>User: Kuvage kontekstipõhine vastus
Ma võtan seda kui "võib-olla" ;)
Voogedastuse vastused
Kas oled märganud, kuidas ChatGPT "tüübid" oma vastuseid reaalajas? See on voogedastus toimimas. Nagu vaadata oskuslikku kaligraafe tööl, nägid tähemärke ilmumas haru haaval, mitte korraga – voogedastus teeb suhtluse loomulikumaks ja annab kohese tagasiside.
Voogedastuse rakendamine LangChainiga
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
)
# Voogedasta vastus
for chunk in llm.stream("Write a short story about a robot learning to code"):
print(chunk.content, end="", flush=True)
Miks voogedastus on lahe:
- Näitab sisu samal ajal, kui see valmib – enam pole piinlikku ootamist!
- Paneb kasutajad tundma, et midagi toimub
- Tundub kiirem, kuigi sisuliselt ei pruugi olla
- Lubab kasutajatel hakata lugema, kui AI veel "mõtleb"
💡 Kasutajakogemuse näpunäide: Voogedastus särab eriti pikemate vastuste puhul nagu koodi selgitused, loominguline kirjutamine või üksikasjalikud juhendid. Kasutajad armastavad näha edenemist, mitte vahtida tühja ekraani!
🎯 Pedagoogiline hetk: Raamistike abstraktsioonide eelised
Peatu ja mõtiskle: Sa said kogemuse AI raamistike abstraktsioonide võimsusest. Võrdle seda seniste õppetükkide otseste API-kõnedega.
Kiire enesehindamine:
- Kas suudad selgitada, kuidas LangChain lihtsustab vestluste haldust võrreldes käsitsi sõnumite jälgimisega?
- Mis vahe on
invoke()jastream()meetoditel ning millal kumbagi kasutada? - Kuidas parandab raamistik sõnumitüüpide süsteem koodi organiseerimist?
Päriselu seos: Need abstraktsioonimustrid (sõnumitüübid, voogedastusliidesed, vestluse mälu) on kasutusel kõigis suuremates AI rakendustes – alates ChatGPT liidesest kuni GitHub Copiloti koodi abini. Sa valdad samu arhitektuurilisi mustreid, mida kasutavad professionaalsed AI meeskonnad.
Väljakutsuva küsimus: Kuidas kavandaksid raamistikulahenduse erinevate AI mudelipakkujate (OpenAI, Anthropic, Google) haldamiseks ühe liidese kaudu? Mõtle selle eelistele ja puudustele.
Pärandmallid
Pärandmallid töötavad nagu retoorilised struktuurid klassikalises kõnemeisterlikkuses – mõtle, kuidas Cicero kohandas oma kõnemustreid erinevate publikute jaoks, hoides samal ajal veenvat raamistikku. Neil on võimalik luua taaskasutatavaid pärandeid, kus saab erinevaid info tükke vahetada, ilma et peaks kõike nullist ümber kirjutama. Kui mall on loodud, täidad vaid muutujad vajalikuga.
Taaskasutatavate pärandite loomine
from langchain_core.prompts import ChatPromptTemplate
# Määra koodi selgituste mall
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")
])
# Kasuta malli erinevate väärtustega
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")
Miks sa armastad malli kasutamist:
- Hoia oma pärandid ühtsete kõigis rakenduse osades
- Pole enam segadust teksti jupidena liitmisega – lihtsalt puhased muutujad
- Sinu AI käitub ennustatavalt, sest struktuur jääb samaks
- Uuendused on lihtsad – muudad malli kord ja see kehtib kõigis kohtades
Struktureeritud väljund
Kas oled kunagi tüdinenud AI vastuste töötlemisest, mis tulevad tagasi struktureerimata tekstina? Struktureeritud väljund on nagu õpetada oma AI-l süsteemselt järgima, nagu Linnaeus kasutas bioloogilist klassifikatsiooni – organiseeritud, ennustatav ja hõlpsasti kasutatav. Sa võid nõuda JSON-i, kindlaid andmestruktuure või mis tahes vajalikku vormingut.
Väljundskeemide määratlemine
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")
# Seadista parser
parser = JsonOutputParser(pydantic_object=CodeReview)
# Loo prompt koos vormingu juhistega
prompt = ChatPromptTemplate.from_messages([
("system", "You are a code reviewer. {format_instructions}"),
("human", "Review this code: {code}")
])
# Vorminda prompt juhistega
chain = prompt | llm | parser
# Saa struktureeritud vastus
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'])}")
Miks on struktureeritud väljund läbimurre:
- Pole enam pead murda, mis vormingut saad – iga kord on see ühtlane
- Sobitub otse sinu andmebaaside ja API-dega ilma lisatööta
- Püüab kinni AI imelikke vastuseid enne, kui need rakendust rikuvad
- Teevab su koodi puhtamaks, sest tead täpselt, millega töötad
Tööriistakõned
Jõuame ühe võimsama funktsioonini: tööriistad. Nii annad oma AI-le praktilisi võimalusi, mis ületavad pelga vestluse. Nagu keskaegsed gildid arendasid spetsiaalseid tööriistu konkreetsete käsitööde jaoks, saad varustada AI fookustatud instrumendiga. Kirjeldad, millised tööriistad on saadaval, ja kui keegi soovib midagi vastavat, saab AI tegutseda.
Pythoniga kasutamine
Lisame tööriistu nii:
from typing_extensions import Annotated, TypedDict
class add(TypedDict):
"""Add two integers."""
# Märgenditel peab olema tüüp ning need võivad vabatahtlikult sisaldada vaikeväärtust ja kirjeldust (sel järjekorras).
a: Annotated[int, ..., "First integer"]
b: Annotated[int, ..., "Second integer"]
tools = [add]
functions = {
"add": lambda a, b: a + b
}
Mis siin toimub? Loome tööriista add sinise trüki. Tüübist TypedDict pärandamine ja Annotated tüüpide kasutamine a ja b jaoks annab LLM-ile selge ülevaate, mida see tööriist teeb ja mida ta vajab. functions sõnastik on nagu meie tööriistakast – see ütleb koodile täpselt, mida teha, kui AI otsustab konkreetset tööriista kasutada.
Järgmine samm: vaadata, kuidas kutsume LLM-i koos selle tööriistaga:
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)
Siin kutsume bind_tools koos tools massiiviga ja seeläbi on LLM llm_with_tools nüüd selle tööriista tundmisega.
Selle uue LLM-i kasutamiseks saame kirjutada järgmise koodi:
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)
Kui nüüd käivitame invoke sellel uuel tööriistadega llm-il, on ehk omadus tool_calls täidetud. Kui jah, siis iga tuvastatud tööriistal on name ja args omadused, mis määravad, millist tööriista kutsuda ja mis argumentidega. Kogu kood näeb välja nii:
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."""
# Anotatsioonidel peab olema tüüp ning need võivad valikuliselt sisaldada vaikimisi väärtust ja kirjeldust (selles järjekorras).
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)
Kui jooksutad seda koodi, peaksid nägema väljundit, mis sarnaneb:
TOOL CALL: 15
CONTENT:
AI uuris küsimust "Mis on 3 + 12" ja tuvastas selle kui töö add jaoks. Nagu osav raamatukoguhoidja teab, millist viidet küsida vastavalt küsimuse tüübile, tegi ta otsuse tööriista nime, kirjelduse ja välja spetsifikatsioonide põhjal. Tulemus 15 tuli meie functions sõnastiku tööriista täitmisest:
print("TOOL CALL: ", functions[tool["name"]](../../../10-ai-framework-project/**tool["args"]))
Huvitavam tööriist, mis kutsub veebipõhist API-d üles
Numbrite lisamine demonstreerib kontseptsiooni, kuid päris tööriistad teostavad tavaliselt keerulisemaid toiminguid, näiteks veebirakenduste API-de kutsumist. Laiendame oma näidet nii, et tehisintellekt otsiks internetist sisu – sarnaselt sellele, kuidas telegraafipostitajad kunagi ühendasid kaugeid kohti:
class joke(TypedDict):
"""Tell a joke."""
# Märgenditel peab olema tüüp ning need võivad vabatahtlikult sisaldada vaikeväärtust ja kirjeldust (selles järjekorras).
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"
# ülejäänud kood on sama
Nüüd, kui selle koodi käivitate, saate vastuse, mis ütleb midagi sellist:
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[Kasutaja päring: "Räägi mulle loomade kohta nali"] --> B[LangChain analüüs]
B --> C{Tööriist saadaval?}
C -->|Jah| D[Vali nali tööriist]
C -->|Ei| E[Genereeri otsene vastus]
D --> F[Parameetrite eraldamine]
F --> G[Kutsu nali(category="animals")]
G --> H[API päring chucknorris.io-le]
H --> I[Tagasta nali sisu]
I --> J[Kuva kasutajale]
E --> K[Tehisintellekti genereeritud vastus]
K --> J
subgraph "Tööriista definitsiooni kiht"
L[TypedDict skeem]
M[Funktsiooni teostus]
N[Parameetri valideerimine]
end
D --> L
F --> N
G --> M
Siin on kood tervikuna:
from langchain_openai import ChatOpenAI
import requests
import os
from typing_extensions import Annotated, TypedDict
class add(TypedDict):
"""Add two integers."""
# Märgenditel peab olema tüüp ja need võivad valikuliselt sisaldada vaikimisi väärtust ja kirjeldust (järjekorras).
a: Annotated[int, ..., "First integer"]
b: Annotated[int, ..., "Second integer"]
class joke(TypedDict):
"""Tell a joke."""
# Märgenditel peab olema tüüp ja need võivad valikuliselt sisaldada vaikimisi väärtust ja kirjeldust (järjekorras).
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("TÖÖRIISTA KUTSE: ", tool)
print("TOOL CALL: ", functions[tool["name"]](../../../10-ai-framework-project/**tool["args"]))
print("CONTENT: ",res.content)
Embeddingud ja dokumentide töötlemine
Embeddingud on üks elegantsemaid lahendusi moodsas tehisintellektis. Kujutage ette, et suudaksite võtta mis tahes teksti ja muuta selle numbrilisteks koordinaatideks, mis hõlmavad selle tähendust. Just seda embeddingud teevad – nad teisendavad teksti punktideks mitmemõõtmelises ruumis, kus sarnased mõisted koonduvad kokku. See on nagu ideede koordinaatsüsteem, mis meenutab Mendeleevi viisigi perioodiliselt tabelit aatomiliste omaduste järgi organiseerida.
Embeddingute loomine ja kasutamine
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
# Algatage manused
embeddings = OpenAIEmbeddings(
api_key=os.environ["GITHUB_TOKEN"],
base_url="https://models.github.ai/inference",
model="text-embedding-3-small"
)
# Laadige ja jagage dokumendid
loader = TextLoader("documentation.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
# Looge vektoripood
vectorstore = FAISS.from_documents(texts, embeddings)
# Tehke sarnasuse otsing
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]}...")
Erinevate vormingute dokumentide laadijad
from langchain_community.document_loaders import (
PyPDFLoader,
CSVLoader,
JSONLoader,
WebBaseLoader
)
# Laadi erinevaid dokumenditüüpe
pdf_loader = PyPDFLoader("manual.pdf")
csv_loader = CSVLoader("data.csv")
json_loader = JSONLoader("config.json")
web_loader = WebBaseLoader("https://example.com/docs")
# Töötle kõiki dokumente
all_documents = []
for loader in [pdf_loader, csv_loader, json_loader, web_loader]:
docs = loader.load()
all_documents.extend(docs)
Mida embeddingutega teha saab:
- Loo otsing, mis tõeliselt mõistab sinu mõtet, mitte ainult märksõnade sobitust
- Loo tehisintellekt, mis suudab vastata küsimustele sinu dokumentide kohta
- Tee soovitussüsteeme, mis pakuvad tõeliselt asjakohast sisu
- Korralda ja kategooriseeri oma sisu automaatselt
flowchart LR
A[Dokumendid] --> B[Teksti Lõhkuja]
B --> C[Sisendite Loomine]
C --> D[Vektori Pood]
E[Kasutaja Päring] --> F[Päringu Sisend]
F --> G[Sarnasuse Otsing]
G --> D
D --> H[Asjakohased Dokumendid]
H --> I[AI Vastus]
subgraph "Vektori Ruumi"
J[Dokument A: [0.1, 0.8, 0.3...]]
K[Dokument B: [0.2, 0.7, 0.4...]]
L[Päring: [0.15, 0.75, 0.35...]]
end
C --> J
C --> K
F --> L
G --> J
G --> K
Täieliku tehisintellekti rakenduse ehitamine
Nüüd integreerime kõik, mida õppisid, laiahaardeliseks rakenduseks – kodeerimisabimeheks, mis suudab vastata küsimustele, kasutada tööriistu ja hoida vestlusmälu. Nii nagu trükipress ühendas olemasolevad tehnoloogiad (liigutatav trükk, tind, paber ja surve) millegi muutvaks, ühendame meie AI komponendid millegi praktiliseks ja kasulikuks.
Täieliku rakenduse näide
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.""")
]
# Määra tööriistad
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):
# Lisa kasutaja sõnum vestlusse
self.conversation_history.append(HumanMessage(content=user_input))
# Saa tehisintellekti vastus
response = self.llm_with_tools.invoke(self.conversation_history)
# Töötle tööriista kutsed, kui neid on
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}")
# Lisa tehisintellekti vastus vestlusse
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"
# Kasutusnäide
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")
Rakenduse arhitektuur:
graph TD
A[Kasutaja Sisend] --> B[Kodeerimisabi]
B --> C[Vestluse Mälu]
B --> D[Tööriista Tuvastamine]
B --> E[LLM Töötlemine]
D --> F[Veebipõhine Otsingu Tööriist]
D --> G[Koodi Vormindaja Tööriist]
E --> H[Vastuse Generatsioon]
F --> H
G --> H
H --> I[Kasutajaliides]
H --> C
Põhifunktsioonid, mida oleme ellu viinud:
- Mäletab kogu sinu vestlust konteksti järjepidevuse tagamiseks
- Teostab toiminguid tööriistade kutsumise kaudu, mitte ainult vestlust
- Järgib prognoositavaid suhtlusmustreid
- Haldab vigade käsitlemist ja keerukaid töövooge automaatselt
🎯 Pedagoogiline kontroll: tootmistaseme tehisintellekti arhitektuur
Arhitektuuri mõistmine: Sa oled loonud täieliku AI rakenduse, mis ühendab vestluse halduse, tööriistade kutsumise ja struktureeritud töövood. See esindab tootmistaseme AI rakenduste loomist.
Olulised omandatud kontseptsioonid:
- Klassipõhine arhitektuur: organiseeritud, hooldatav AI rakenduse struktuur
- Tööriistade integreerimine: kohandatud funktsionaalsus lisaks vestlusele
- Mälu haldus: püsiv vestluse kontekst
- Vigade käitlemine: robustne rakenduse käitumine
Tööstuse seos: Sinu kasutatud arhitektuuri mustrid (vestluse klassid, tööriistade süsteemid, mälu haldus) on samad, mida kasutatakse ettevõtte tasemel AI-rakendustes nagu Slacki ai-abiline, GitHub Copilot ja Microsoft Copilot. Sa ehitad professionaalse taseme arhitektuurilise mõtlemisega.
Mõtisklusküsimus: Kuidas laiendaksid seda rakendust mitme kasutaja, püsiva andmesalvestuse või väliste andmebaaside integratsiooniga? Mõtle skaleerimisele ja olekuhalduse väljakutsetele.
Kodutöö: Ehita oma AI-põhine õpiabiline
Eesmärk: Loo tehisintellekti rakendus, mis aitab õpilastel programmeerimisalaseid mõisteid õppida, pakkudes selgitusi, koodinäiteid ja interaktiivseid teste.
Nõuded
Põhifunktsioonid (kohustuslikud):
- Vestlusliides: rakenda vestlussüsteem, mis säilitab konteksti mitmete küsimuste vahel
- Hariduslikud tööriistad: loo vähemalt kaks tööriista, mis aitavad õppimisel:
- koodi seletamise tööriist
- mõistepõhine testide generaator
- Isikupärastatud õppimine: kasuta süsteemiteateid, et kohandada vastuseid erinevatele oskustasemetele
- Vastuse vormindus: rakenda struktureeritud väljund testiküsimuste jaoks
Rakendusetapid
Samm 1: Seadista oma keskkond
pip install langchain langchain-openai
Samm 2: Põhivestluse funktsionaalsus
- Loo klass
StudyAssistant - Rakenda vestlusmälu
- Lisa isiksuse konfiguratsioon haridusliku toe jaoks
Samm 3: Lisa hariduslikud tööriistad
- Koodi seletaja: jaotab koodi arusaadavateks osadeks
- Testide generaator: loob küsimusi programmeerimiskontseptsioonide kohta
- Edenemise jälgija: hoiab silma peal käsitletud teemadel
Samm 4: Täiendavad funktsioonid (valikuline)
- Rakenda voogedastuslikke vastuseid paremaks kasutajakogemuseks
- Lisa dokumentide laadimine kursuse materjalide kaasamiseks
- Loo embeddingud sisuga sarnaste dokumentide otsimiseks
Hindamiskriteeriumid
| Funktsioon | Suurepärane (4) | Hea (3) | Rahuldav (2) | Vajab parandust (1) |
|---|---|---|---|---|
| Vestluse voog | Loomulik, kontekstitundlikud vastused | Hea konteksti säilitamine | Põhiline vestlus | Mälu puudumine vestluse vahel |
| Tööriistade integratsioon | Mitmed kasulikud tööriistad töötavad sujuvalt | 2+ tööriista korrektselt | 1-2 põhifunktsiooni | Tööriistad ei tööta |
| Koodi kvaliteet | Puhas, hästi dokumenteeritud, vigade käitlemine | Hea struktuur, natuke dokumentatsiooni | Põhiline funktsionaalsus | Kehv struktuur, puudub vigade haldus |
| Hariduslik väärtus | Tõeliselt abistav õppimiseks, kohanduv | Hea õppimise tugi | Põhilised seletused | Piiratud hariduslik kasu |
Näidiskoodi struktuur
class StudyAssistant:
def __init__(self, skill_level="beginner"):
# Initsialiseeri LLM, tööriistad ja vestluse mälu
pass
def explain_code(self, code, language):
# Tööriist: Selgita, kuidas kood töötab
pass
def generate_quiz(self, topic, difficulty):
# Tööriist: Loo harjutusküsimused
pass
def chat(self, user_input):
# Põhivestluse liides
pass
# Näidiskasutus
assistant = StudyAssistant(skill_level="intermediate")
response = assistant.chat("Explain how Python functions work")
Boonusväljakutsed:
- Lisa hääl-sisendi / väljundi võimekus
- Loo veebiliides Streamliti või Flaski abil
- Loo teadmiste baas kursuse materjalidest embeddingute abil
- Lisa edenemise jälgimine ja isikupärastatud õpiteed
📈 Su AI raamistu arendamise meistriklassi ajajoon
timeline
title Tootmistehisintellekti raamistiku arendusreis
section Raamistiku alused
Abstraktsioonide mõistmine
: Meistriraamistik vs API otsused
: Õpi LangChain'i põhikontseptsioonid
: Rakenda sõnumitüüpide süsteemid
Põhisintegratsioon
: Ühenda AI pakkujatega
: Töötle autentimist
: Halda konfiguratsiooni
section Vestlussüsteemid
Mälu haldamine
: Loo vestluste ajalugu
: Rakenda konteksti jälgimist
: Töötle sessiooni püsimist
Täiustatud suhtlus
: Meistri voogedastuse vastused
: Loo vihjekäsud
: Rakenda struktureeritud väljundit
section Tööriistade integratsioon
Kohandatud tööriista arendus
: Kujunda tööriistade skeemid
: Rakenda funktsioonikõnet
: Töötle väliseid API-sid
Töövoo automatiseerimine
: Keti mitut tööriista
: Loo otsustuspuud
: Loo agendi käitumised
section Tootmisrakendused
Täielik süsteemi arhitektuur
: Ühenda kõik raamistiku funktsioonid
: Rakenda veapiirid
: Loo hooldatav kood
Ettevõtte valmisolek
: Töötle mastaapsuse küsimusi
: Rakenda jälgimist
: Loo juurutusstrateegiad
🎓 Lõputunnistus: Oled edukalt valdanud AI raamistu arendamist, kasutades samu tööriistu ja mustreid, mis toidavad kaasaegseid AI rakendusi. Need oskused esindavad AI rakenduste arendamise tippsaavutust ja valmistavad sind ette ettevõtte taseme intelligentsete süsteemide loomiseks.
🔄 Järgmise taseme võimed:
- Valmis uurima keerukamaid AI arhitektuure (agentid, mitmeagendilised süsteemid)
- Võimeline ehitama RAG-süsteeme vektorandmebaasidega
- Võimeline looma mitme režiimiga AI rakendusi
- Vundament AI rakenduste skaleerimiseks ja optimeerimiseks
Kokkuvõte
🎉 Oled nüüd valdanud AI raamistu arendamise põhialuseid ja õppinud, kuidas luua keerukaid AI rakendusi, kasutades LangChainit. Just nagu põhjaliku õpipoisiameti lõpetamine, oled omandanud ulatusliku oskustekogu. Vaatame, mida oled saavutanud.
Mida oled õppinud
Põhiramistu kontseptsioonid:
- Raamistute eelised: mõistmine, millal valida raamistikud otseteede asemel
- LangChain põhialused: AI mudelite ühenduste seadistamine ja konfiguratsioon
- Sõnumitüübid:
SystemMessage,HumanMessagejaAIMessagekasutamine struktureeritud vestluseks
Täpsemad funktsioonid:
- Tööriistade kutsumine: kohandatud tööriistade loomine AI võimete laiendamiseks
- Vestlusmälu: konteksti säilitamine mitmete vestlussammaste vältel
- Voogedastuse vastused: reaalajas vastuste kohaletoimetamine
- Promptide mallid: korduvkasutatavad dünaamilised päringud
- Struktureeritud väljund: järjepidev ja parsitav AI vastuste formaadis kohaletoimetamine
- Embeddingud: semantiline otsing ja dokumentide töötlemine
Praktilised rakendused:
- Täielike rakenduste ehitamine: mitme funktsiooni kombineerimine tootmiseks valmis lahendusteks
- Vigade haldus: usaldusväärne vigade käsitlemine ja valideerimine
- Tööriistade integreerimine: kohandatud tööriistade loomine AI võimete laiendamiseks
Peamised õppetunnid
🎯 Meelespea: AI raamistikud nagu LangChain on sinu keerukust varjavad ja funktsiooniderohked parimad sõbrad. Need sobivad suurepäraselt, kui vajad vestlusmälu, tööriistade kutsumist või tahad töötada paljude AI mudelitega, ilma meelt kaotamata.
AI integratsiooni otsustusraamistik:
flowchart TD
A[Tehisintellekti integreerimise vajadus] --> B{Lihtne üksikpäring?}
B -->|Jah| C[Otsepöördumised API-le]
B -->|Ei| D{Vajalik vestluse mälu?}
D -->|Ei| E[SDK integratsioon]
D -->|Jah| F{Vajalikud tööriistad või keerukad funktsioonid?}
F -->|Ei| G[Raamistik põhiseadistusega]
F -->|Jah| H[Täielik raamistik rakendus]
C --> I[HTTP päringud, minimaalsed sõltuvused]
E --> J[Teenusepakkuja SDK, mudelispetsiifiline]
G --> K[LangChain põhiline vestlus]
H --> L[LangChain tööriistade, mäluga, agentidega]
Kuhu edasi minna?
Alusta kohe ehitamist:
- Võta need kontseptsioonid ja loo midagi, mis SIND erutab!
- Katseta erinevaid AI mudeleid läbi LangChaini – see on nagu AI mudelite mänguväli
- Loo tööriistu, mis lahendavad päriselt sinu töö või projektide probleeme
Valmis järgmisele tasemele?
- AI agendid: loo AI süsteeme, mis suudavad ise keerukaid ülesandeid planeerida ja täita
- RAG (Retrieval-Augmented Generation): ühenda AI oma teadmistebaasidega ülivõimsate rakenduste jaoks
- Mitme režiimiga AI: tööta koos tekstide, piltide ja heliga – võimalused on lõputud!
- Tootmiskeskkonna juurutus: õpi, kuidas skaleerida oma AI rakendusi ja neid pärismaailmas jälgida
Liitu kogukonnaga:
- LangChaini kogukond on suurepärane koht, et olla kursis viimaste uudistega ja õppida parimaid praktikaid
- GitHub Models annab ligipääsu tipptasemel AI võimekustele – ideaalne katsetamiseks
- Harjuta erinevate kasutusjuhtudega – iga projekt õpetab midagi uut
Sul on nüüd teadmised luua intelligentseid, vestluspõhiseid rakendusi, mis aitavad inimestel reaalseid probleeme lahendada. Nagu renessansiaja meistrid, kes ühendasid kunstilise nägemuse tehnilise oskusega, suudad sina nüüd ühendada AI võimekuse praktilise rakendusega. Küsimus on: mida sina lood? 🚀
GitHub Copilot Agent väljakutse 🚀
Kasuta agentrežiimi, et täita järgmine väljakutse:
Kirjeldus: Loo arenenud AI-põhine koodikontrolli assistent, mis ühendab mitmeid LangChaini funktsioone, sh tööriistade kutsumine, struktureeritud väljund ning vestlusmälu, et pakkuda põhjalikku tagasisidet koodiesitustele.
Üleskutse: Loo klass CodeReviewAssistant, mis rakendab:
- Tööriista koodi keerukuse analüüsimiseks ja parendusettepanekute tegemiseks
- Tööriista, mis kontrollib koodi parimate tavade nõuete vastu
- Struktureeritud väljundit Pydantic mudelite abil ühtse ülevaate vormistamiseks
- Vestlusmälu ülevaatussessioonide jälgimiseks
- Peamist vestlusliidest, mis suudab hallata koodiesitusi ja pakkuda detailset, teostatavat tagasisidet
Assistent peaks suutma üle vaadata koodi mitmes programmeerimiskeeles, säilitama konteksti mitme koodiesituse vältel sessiooni ajal ning pakkuma nii kokkuvõtlikke hindepunkte kui üksikasjalikke täiustuste soovitusi.
Lisateave agentrežiimi kohta.
Vastutusest loobumine: See dokument on tõlgitud tehisintellekti tõlketeenuse Co-op Translator abil. Kuigi püüame täpsust, palun pidage meeles, et automatiseeritud tõlgetes võib esineda vigu või ebatäpsusi. Originaaldokument selle emakeeles tuleks lugeda autoriteetse allikana. Tähtsa teabe puhul soovitatakse kasutada professionaalset inimtõlget. Me ei vastuta käesoleva tõlke kasutamisest tulenevate arusaamatuste või valesti mõistmiste eest.