2-qism · Agentlarni qurish·05-bob
Agentlarga harakat berish
Function calling protokoli ichidan: LLM funksiyani qanday tanlaydi, parallel chaqiruvlar, natijani qaytarish sikli. Semantic Kernel bilan semantik va tabiiy funksiyalarni birlashtirish.
Agent gapira oladi. Endi unga harakat beramiz — tashqi funksiyalarni chaqirish imkoniyati.
Bu bob function calling protokolini ichidan ko'rsatadi. Ko'p qo'llanmalar buni freymvork ichida yashiradi — biz esa nima bo'layotganini ko'ramiz, chunki buni tushunmasangiz, nosozlikni tuzata olmaysiz.
Function calling: asosiy tushuncha#
Bu — butun bobning eng muhim g'oyasi. Uni puxta bilib oling:
LLM funksiyani o'zi ishga tushirmaydi. U faqat "men shu funksiyani shu argumentlar bilan chaqirmoqchiman" deb aytadi. Chaqirishni siz qilasiz.
Funksiyani e'lon qilish#
Funksiya ta'rifi — bu LLM'ga beriladigan "menyu". U qaysi funksiya borligini va qanday chaqirishni ko'rsatadi.
from openai import OpenAI
client = OpenAI()
def sora(user_message):
javob = client.chat.completions.create(
model="gpt-4-turbo",
messages=[
{"role": "system", "content": "Siz foydali yordamchisiz."},
{"role": "user", "content": user_message},
],
temperature=0.7,
tools=[
{
"type": "function",
"function": {
"name": "recommend",
"description": "Berilgan mavzu bo'yicha tavsiya beradi.",
"parameters": {
"type": "object",
"properties": {
"topic": {
"type": "string",
"description": "Tavsiya so'ralayotgan mavzu",
},
"rating": {
"type": "string",
"description": "Tavsiya sifati",
"enum": ["good", "bad", "terrible"], # cheklangan qiymatlar
},
},
"required": ["topic"],
},
},
}
],
)
return javobNima qaytadi:
# "Vaqt sayohati filmini tavsiya qil"
Function(arguments='{"topic":"vaqt sayohati filmi"}', name='recommend')
# "Yaxshi vaqt sayohati filmini tavsiya qil"
Function(arguments='{"topic":"vaqt sayohati filmi","rating":"good"}', name='recommend')Diqqat qiling: model argumentlarni matndan ajratib oldi. "Yaxshi" so'zini rating: good
ga aylantirdi. Bu — function calling'ning kuchi.
To'liq sikl: funksiyani bajarish#
LLM funksiyani chaqirishni so'radi. Endi biz uni bajarib, natijani qaytaramiz.
Haqiqiy funksiya:
import json
def recommend(topic, rating="good"):
"""Bu — haqiqiy Python funksiyasi. Model uni chaqirishni so'raydi, biz bajaramiz."""
if "vaqt sayohati" in topic.lower():
return json.dumps({"topic": "vaqt sayohati", "tavsiya": "Orqaga kelajakka", "rating": rating})
elif "retsept" in topic.lower():
return json.dumps({"topic": "retsept", "tavsiya": "Osh", "rating": rating})
elif "sovg'a" in topic.lower():
return json.dumps({"topic": "sovg'a", "tavsiya": "Kitob", "rating": rating})
else:
return json.dumps({"topic": topic, "tavsiya": "noma'lum"})To'liq sikl:
def suhbat(user_message):
xabarlar = [
{"role": "system", "content": "Siz foydali yordamchisiz."},
{"role": "user", "content": user_message},
]
# 1. Birinchi so'rov — funksiya ta'riflari bilan
javob = client.chat.completions.create(
model="gpt-4-turbo",
messages=xabarlar,
tools=TOOLS,
)
xabar = javob.choices[0].message
tool_calls = xabar.tool_calls
if not tool_calls:
return xabar.content # funksiya kerak emas, oddiy javob
# 2. Assistant javobini tarixga qo'shamiz
xabarlar.append(xabar)
# 3. Har funksiyani bajaramiz
mavjud = {"recommend": recommend}
for tool_call in tool_calls:
funksiya_nomi = tool_call.function.name
argumentlar = json.loads(tool_call.function.arguments) # JSON'ni tahlil qilamiz
natija = mavjud[funksiya_nomi](**argumentlar)
# 4. Natijani tarixga qo'shamiz — tool_call_id bilan
xabarlar.append({
"role": "tool",
"tool_call_id": tool_call.id, # QAYSI chaqiruvga tegishli
"name": funksiya_nomi,
"content": natija,
})
# 5. Ikkinchi so'rov — model natijani tabiiy tilga aylantiradi
yakuniy = client.chat.completions.create(
model="gpt-4-turbo",
messages=xabarlar,
)
return yakuniy.choices[0].message.contentParallel funksiya chaqiruvlari#
Model bir vaqtda bir necha funksiya chaqirishi mumkin:
user = """Menga quyidagilarni tavsiya qil:
1. Vaqt sayohati filmi
2. Retsept
3. Sovg'a"""Model uchta recommend chaqiruvini qaytaradi — har biri boshqa argument bilan.
Yuqoridagi kod for tool_call in tool_calls bilan buni allaqachon hal qiladi: har uchtasini
bajaradi, hammasini tarixga qo'shadi.
Semantic Kernel#
Microsoft'ning Semantic Kernel (SK) — funksiyalarni boshqacha tashkil qiladi. Uning asosiy g'oyasi: ikki xil funksiyani birlashtirish.
- 1
- Semantik funksiyaBu — prompt shabloni. LLM bajaradi. Masalan: «{matn}ni xulosala». Tabiiy til bilan ishlaydi.
- 2
- Tabiiy (native) funksiyaBu — oddiy Python kod. Kompyuter bajaradi. Masalan: sana hisoblash, faylni o'qish, API chaqirish. Aniq va tez.
SK'ning kuchi — ikkalasini bir zanjirda birlashtirishda.
Semantik funksiya#
import semantic_kernel as sk
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
kernel = sk.Kernel()
kernel.add_service(OpenAIChatCompletion(service_id="chat", ai_model_id="gpt-4"))
# Semantik funksiya — bu prompt shabloni
xulosala_prompt = """Quyidagi matnni bitta jumlada xulosala:
{{$input}}
Xulosa:"""
xulosala = kernel.add_function(
function_name="xulosala",
plugin_name="matn",
prompt=xulosala_prompt,
)
natija = await kernel.invoke(xulosala, input="uzun matn..."){{$input}} — bu kontekst o'zgaruvchisi. SK uni haqiqiy qiymat bilan almashtiradi.
Tabiiy funksiya#
from semantic_kernel.functions import kernel_function
class SanaPlugin:
@kernel_function(description="Bugungi sanani qaytaradi")
def bugungi_sana(self) -> str:
from datetime import datetime
return datetime.now().strftime("%Y-%m-%d")
kernel.add_plugin(SanaPlugin(), plugin_name="sana")Ikkalasini birlashtirish#
Eng kuchli qism — semantik funksiya ichida tabiiy funksiyani chaqirish:
# Semantik funksiya tabiiy funksiya natijasini ishlatadi
salomlashuv_prompt = """Bugun {{sana.bugungi_sana}}.
Foydalanuvchiga shu sanaga mos, do'stona salomlashuv yoz."""
# LLM avval sana funksiyasini chaqiradi, keyin natijadan foydalanadiBu — SK'ning falsafasi: hamma narsani funksiya sifatida ko'rish va ularni zanjirga ulash. Tabiiy va semantik funksiyalar bir tilda gaplashadi.
Function calling vs Semantic Kernel#
- Oddiy, shaffof — protokol ko'rinib turadi
- Har qanday provayderda ishlaydi
- Freymvork bog'liqligi yo'q
- To'liq nazorat
- Semantik + tabiiy funksiyalar birlashadi
- Planner avtomatik reja tuzadi
- Korxona tizimlari uchun tuzilgan
- Ko'proq mavhumlik, o'rganish kerak
Oddiy agent uchun to'g'ridan-to'g'ri function calling — shaffof va yetarli. Katta, ko'p funksiyali tizim uchun SK'ning tuzilishi va planneri foyda beradi. Avval protokolni tushuning, keyin freymvorkni tanlang.
Ko'p funksiyali agent quring
Uch funksiyali agent quring: sana, ob-havo (soxta yoki haqiqiy) va kalkulyator.
Har biriga aniq function ta'rifi yozing. Keyin murakkab so'rov bering, unda model bir necha funksiyani ketma-ket chaqirishi kerak bo'lsin.
Kuzating:
- Model qaysi funksiyalarni tanladi va qanday tartibda?
descriptionni yomonlashtirib ko'ring — model funksiyani noto'g'ri tanlaydimi?- Bir funksiyani
enumbilan cheklang — natija barqarorroq bo'ladimi?
Bonus: xuddi shu narsani Semantic Kernel bilan takrorlang. Qaysi yondashuv sizga tushunarliroq va nima uchun?
Maslahatni ko'rsatish
To'g'ridan-to'g'ri function calling bilan uch funksiyali agent: def bugungi_sana(): ... # sana def ob_havo(shahar): ... # (soxta yoki haqiqiy API) def hisobla(ifoda): ... # matematik ifoda Har biriga aniq function ta'rifi yozing (description muhim!). Murakkab so'rov bering: «Bugun qaysi kun va Toshkentda ob-havo qanday? Agar 30 darajadan issiq bo'lsa, 30 * 1.8 + 32 ni hisobla.» Model bir necha funksiyani ketma-ket chaqirishi kerak. Kuzating (print bilan): - Model qaysi funksiyalarni tanladi? - Qanday tartibda? - description'ni yomonlashtirib ko'ring — natija o'zgaradimi? Semantic Kernel bilan xuddi shuni takrorlang. Qaysi biri sizga tushunarliroq?
Xulosa#
- 01LLM funksiyani o'zi ishga tushirmaydi — u faqat so'raydi. Bajarishni sizning kodingiz qiladi. Bu butun protokolning asosi.
- 02description maydoni — bu prompt. Model faqat shunga qarab funksiya va argument tanlaydi. Aniq yozing, enum ishlatib qiymatlarni cheklang.
- 03json.loads() bilan argumentlarni tahlil qiling va tool_call_id ni aynan ko'chiring. Bu ikki xato eng ko'p uchraydi.
- 04Parallel chaqiruvlar tezlikni oshiradi. Barcha natijalarni bitta javobga to'plab qaytaring.
- 05Semantic Kernel semantik (LLM) va tabiiy (kod) funksiyalarni birlashtiradi. LLM fikrlaydi, kod aniq hisoblaydi — mehnat taqsimoti.
- 06Avval protokolni tushuning, keyin freymvorkni tanlang. Function calling barcha provayderlarda bir xil ishlaydi.
Keyingi bobda avtonom assistantlar quramiz: behavior tree'lar bilan agentning xatti-harakatini boshqarish va bir necha assistant bir-birini boshqaradigan tizimlar.