डेमो के बाद कस्टम AI एजेंट के कॉल लूप और टोकन लागत नियंत्रण के उपाय
July 28, 2026
0
Computing/SoftwareComments (0)
Log in to leave a comment
No posts yet
Log in to leave a comment
No posts yet
किसी फ्रेमवर्क का उपयोग करके आंतरिक डेटा के साथ AI एजेंट बनाना प्रोटोटाइप चरण तक काफी सुचारू रूप से चलता है। असली समस्या तब शुरू होती है जब इस कोड को लाइव सर्विस में लाया जाता है। जो एजेंट स्क्रीन पर ठीक से काम कर रहा था, वह एक अप्रत्याशित इनपुट में फंस जाता है, कॉल को बार-बार दोहराता है, और सप्ताहांत के दौरान लाखों रुपये (KRW में लाखों) का API बिल आ जाता है।
फील्ड में होने वाले अधिकांश व्यवधान LLM मॉडल की सीमाओं के बजाय स्टेट मैनेजमेंट (State Management) की विफलता और बाहरी नियंत्रण की कमी के कारण होते हैं। प्रबंधन के निर्देश पर एक कस्टम टूल तो बना लिया गया, लेकिन पूरा दिन अचानक होने वाले एजेंट के हैलुसिनेशन (Hallucinations) को डिबग करने और टोकन के भारी रसीदों को संभालने में ही बीत जाता है, जिससे मूल काम रुक जाता है। इस स्थिति को समाप्त करने की आवश्यकता है।
डेमो एनवायरनमेंट से बाहर निकलने के बाद एजेंट तीन बड़ी दीवारों से टकराता है: ब्लैक-बॉक्स ऑपरेशन, नॉन-डिटर्मिनिस्टिक लूप (Non-deterministic loops), और डेटा लीक का जोखिम।
यदि रीज़निंग (Chain-of-Thought) प्रक्रिया, बाहरी टूल कॉल (Tool Call), और वेक्टर डेटाबेस खोज के प्रत्येक चरण के इनपुट/आउटपुट लॉग में दर्ज नहीं होते हैं, तो समस्या आने पर कारण खोजना असंभव हो जाता है। प्रॉम्प्ट कहाँ गड़बड़ाया, केवल इसे ट्रैक करने में ही पूरा एक दिन चला जाता है।
इससे भी अधिक गंभीर बात अनंत लूप (Infinite Loop) की है। ReAct (Reasoning + Acting) स्ट्रक्चर वाले एजेंट, टूल निष्पादन का परिणाम अस्पष्ट होने पर वही अनुरोध बार-बार भेजते रहते हैं।
┌─────────────────────────────────────────────────────────────────────────┐ │ ReAct Architecture Loop │ │ │ │ ┌────────────┐ User Query ┌────────────┐ Tool Call Request │ │ │ User │ ──────────────> │ Main LLM │ ────────────────────┐ │ │ └────────────┘ └────────────┘ │ │ │ ▲ ▼ │ │ │ Observation ┌──────┐ │ │ │ (Ambiguous/Failed) │ Tool │ │ │ └─────────────────────── │ A │ │ │ └──────┘ │ │ * Problem: When Observation fails, LLM retries Tool A endlessly. │ └─────────────────────────────────────────────────────────────────────────┘
जैसे ही एजेंट एग्जिट कंडीशन से बाहर नहीं निकल पाता और समान आर्गुमेंट्स के साथ API को बार-बार कॉल करता है, कुछ ही मिनटों में एक महीने का टोकन बजट समाप्त हो जाता है। मुख्य एजेंट और सब-एजेंटों का एक-दूसरे को कॉल करना और पुनः प्रयास (Retry) करना, जो एक कैस्केडिंग विफलता (Cascading Failure) का रूप ले लेता है, पूरे सिस्टम फेलियर के 30% से अधिक कारणों के लिए जिम्मेदार है।
बातचीत का इतिहास लगातार जमा होने और कॉन्टेक्स्ट विंडो (Context Window) भरने से मॉडल का प्रदर्शन ही गिर जाने की समस्या भी आती है। इसके अलावा, पायथन कोड के भीतर स्ट्रिंग के रूप में हार्डकोड किए गए प्रॉम्प्ट के कारण एक साधारण वाक्य को बदलने पर भी पूरे सिस्टम को फिर से बिल्ड और डिप्लॉय करना पड़ता है।
लोकल डिबगिंग समाधान और प्रोडक्शन ऑब्जर्वेबिलिटी टूल को अलग करके डेटा कलेक्शन पॉइंट्स तय करने चाहिए। डेवलपमेंट चरण में, OpenTelemetry आधारित Arize Phoenix का उपयोग RAG एम्बेडिंग क्वालिटी और टूल कॉल्स को सत्यापित करने के लिए किया जाता है। लाइव सर्विस एनवायरनमेंट में, बैकएंड के रूप में ClickHouse का उपयोग करने वाले Langfuse को जोड़कर ट्रेस लॉग्स और टोकन खपत की वास्तविक समय (Real-time) में निगरानी की जाती है।
┌─────────────────────────────────────────────────────────────────────────┐ │ Semantic Caching & Routing Flow │ │ │ │ Client Query │ │ │ │ │ ▼ │ │ ┌───────────┐ Similarity >= 0.92? ┌─────────────────────────────┐ │ │ │ Redis Vector │ ─────────────────────────> │ Return Cached Response │ │ │ │ Cache │ (Cache Hit) │ (Latency -88%, Cost -86%) │ │ │ └───────────┘ └─────────────────────────────┘ │ │ │ │ │ │ (Cache Miss) │ │ ▼ │ │ ┌───────────┐ Execution & Save Cache ┌─────────────────────────────┐ │ │ │ External │ ────────────────────────> │ Store Result as Vector in │ │ │ │ LLM API │ │ Backend Database │ │ │ └───────────┘ └─────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────────┘
समान प्रश्नों के बार-बार आने से उत्पन्न होने वाली API लागत को सिमेंटिक कैशिंग (Semantic Caching) लेयर से रोका जाता है।
AWS द्वारा जारी 60,000 प्रश्नों के विश्लेषण आंकड़ों के अनुसार, कोसाइन समानता (Cosine Similarity) मानक को लागू करने वाले सिमेंटिक कैश का उपयोग करने पर LLM अनुमान (Inference) लागत में 86% तक की कमी आई और प्रतिक्रिया में लगने वाला समय (Latency) भी 88% बेहतर हुआ। LMSYS का RouteLLM फ्रेमवर्क भी प्रश्नों की कठिनाई के अनुसार उच्च-लागत और कम-लागत वाले मॉडलों में अनुरोधों को विभाजित करके 85% लागत बचाता है।
सिमेंटिक कैशिंग का निर्माण निम्नलिखित चरणों में किया जाता है:
अनंत लूप को मौलिक रूप से रोकने के लिए, एजेंट की स्थिति को सत्यापित करने वाले सर्किट ब्रेकर (Circuit Breaker) पैटर्न को सीधे पाइपलाइन नियंत्रण प्रवाह में शामिल किया जाना चाहिए। फ्रेमवर्क द्वारा प्रदान किए गए डिफ़ॉल्ट रीट्राई (Retry) विकल्पों पर भरोसा करने से अपवाद (Exception) उत्पन्न होने पर पूरी सेवा ठप हो सकती है। टूल के नाम और आर्गुमेंट मानों को SHA-256 से हैश करके सूची में जोड़ें, और यदि समान हैश लगातार 3 बार जमा होता है, तो सुरक्षा के लिए इसे जबरन किसी अन्य नोड पर भेजें।
`python
import hashlib
from typing import TypedDict, Annotated, List
from langchain_core.messages import BaseMessage
from langgraph.graph.message import add_messages
class AgentState(TypedDict):
messages: Annotated[List[BaseMessage], add_messages]
steps: int
tool_hashes: List[str]
def hash_tool_call(tool_name: str, tool_args: str) -> str:
raw_str = f"{tool_name}:{tool_args}"
return hashlib.sha256(raw_str.encode('utf-8')).hexdigest()
def agent_circuit_breaker_router(state: AgentState) -> str:
# 1. यदि कुल निष्पादन संख्या 5 से अधिक हो जाती है, तो निर्धारित फ़ॉलबैक नोड पर जाएं
if state["steps"] > 5:
return "fallback_graceful_node"
# 2. यदि समान Tool और Argument को लगातार 3 बार कॉल किया जाता है, तो तुरंत ब्लॉक करें
hashes = state.get("tool_hashes", [])
if len(hashes) >= 3 and hashes[-1] == hashes[-2] == hashes[-3]:
return "fallback_graceful_node"
# 3. सामान्य समाप्ति कीवर्ड की जांच करें
last_message = state["messages"][-1]
if "FINAL_ANSWER" in last_message.content:
return "end"
return "continue_tools"
`
LLM के नॉन-डिटर्मिनिस्टिक आउटपुट स्थिति की परवाह किए बिना, पायथन निष्पादन वातावरण में यह राउटर शर्तों को सत्यापित करता है, इसलिए यह हैलुसिनेशन के कारण लूप में प्रवेश को भौतिक रूप से रोकता है।
यदि प्रॉम्प्ट को कोड के भीतर ही छोड़ दिया जाता है, तो मॉडल संशोधन के बाद पहले से सही काम कर रहे फीचर्स के ठप हो जाने वाली रिग्रेशन विफलता (Regression Failure) को पकड़ना असंभव हो जाता है। प्रॉम्प्ट को पायथन कोड से बाहर निकालकर एक स्वतंत्र YAML फ़ाइल के रूप में प्रबंधित किया जाता है।
`yaml
name: "agent_reasoning"
version: "1.2.0"
model: "gpt-4o"
temperature: 0.1
messages:
इस प्रकार अलग किए गए प्रॉम्प्ट को ओपन-सोर्स मूल्यांकन फ्रेमवर्क DeepEval और Pytest को मिलाकर CI/CD पाइपलाइन में स्वचालित रूप से परीक्षण किया जाता है। G-Eval मीट्रिक को बेंचमार्क मानकर डिप्लॉयमेंट से पहले मॉडल प्रतिक्रिया आंकड़ों का सत्यापन किया जाता है।
`python
import pytest
from deepeval import assert_test
from deepeval.metrics import GEval, TaskCompletionMetric
from deepeval.test_case import LLMTestCase, SingleTurnParams
correctness_metric = GEval(
name="सटीकता और स्कीमा अनुपालन",
criteria="क्या LLM उत्तर प्रश्न का सटीक उत्तर देता है और अनुरोधित JSON प्रारूप का पूरी तरह से पालन करता है?",
evaluation_params=[SingleTurnParams.ACTUAL_OUTPUT, SingleTurnParams.EXPECTED_OUTPUT],
threshold=0.7
)
@pytest.mark.parametrize(
"user_input, expected_output",
[
("2024 की पहली तिमाही के बिक्री डेटा का संक्षेप दें।", "पहली तिमाही की कुल बिक्री 5 अरब वॉन है।"),
("सेवानिवृत्ति भत्ता गणना नियमों के बारे में बताएं।", "सेवानिवृत्ति भत्ता सेवा के प्रत्येक 1 वर्ष के लिए 30 दिनों से अधिक का औसत वेतन होता है।")
]
)
def test_agent_regression(user_input, expected_output):
actual_output = run_in_house_agent(user_input)
test_case = LLMTestCase(
input=user_input,
actual_output=actual_output,
expected_output=expected_output
)
# निर्धारित मानक स्कोर से कम होने पर निर्माण (Build) रोकें
assert_test(test_case, [correctness_metric, TaskCompletionMetric(threshold=0.8)])
`
मूल्यांकन प्रणाली तीन चरणों में एकीकृत होती है:
deepeval test run कमांड को स्वचालित रूप से निष्पादित करने के लिए एक्शन कॉन्फ़िगर करें।`yaml
name: AI Agent Evaluation Gate
on:
pull_request:
branches: [ main ]
jobs:
eval-gate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install Dependencies
run: |
pip install poetry
poetry install
- name: Run DeepEval Suite
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
poetry run deepeval test run tests/test_evals.py
`
आंतरिक डेटा लीक को रोकने के लिए, API अनुरोधों के बाहर जाने से पहले व्यक्तिगत पहचान योग्य जानकारी (PII) को गुमनाम (De-identify) करने के लिए गार्डरेल्स (Guardrails) की आवश्यकता होती है। गेटवे पर Microsoft Presidio इंजन स्थापित करने से यह रेजिडेंट रजिस्ट्रेशन नंबर, ईमेल, फ़ोन नंबर और कर्मचारी आईडी को स्वचालित रूप से मास्क कर देता है।
`python
from presidio_analyzer import AnalyzerEngine, PatternRecognizer
from presidio_anonymizer import AnonymizerEngine
from presidio_anonymizer.entities import OperatorConfig
analyzer = AnalyzerEngine()
employee_id_recognizer = PatternRecognizer(
supported_entity="EMPLOYEE_ID",
regex="EMP-[0-9]{6}",
score=0.95
)
analyzer.registry.add_recognizer(employee_id_recognizer)
anonymizer = AnonymizerEngine()
def sanitize_user_prompt(raw_prompt: str) -> str:
results = analyzer.analyze(
text=raw_prompt,
entities=["PERSON", "PHONE_NUMBER", "EMAIL_ADDRESS", "EMPLOYEE_ID"],
language="en"
)
anonymized_result = anonymizer.anonymize(
text=raw_prompt,
analyzer_results=results,
operators={
"DEFAULT": OperatorConfig("replace", {"new_value": "<REDACTED>"}),
"EMPLOYEE_ID": OperatorConfig("mask", {"chars_to_mask": 6, "masking_char": "*", "from_end": True})
}
)
return anonymized_result.text
`
RAG सर्च को जोड़ते समय भी यह सुनिश्चित करने के उपाय किए जाने चाहिए कि केवल उपयोगकर्ता के अनुमति स्तर (Permission level) से मेल खाने वाले दस्तावेज़ ही लाए जाएं। Qdrant या Pinecone जैसे वेक्टर डेटाबेस समानता खोज करते समय मेटाडेटा फ़िल्टरिंग (Metadata Filtering) के माध्यम से अनुमति पृथक्करण को संभालते हैं।
`python
from qdrant_client import QdrantClient
from qdrant_client.http import models
client = QdrantClient(host="localhost", port=6333)
def search_documents_with_rbac(query_vector: list, user_department: str, user_clearance_level: int):
search_result = client.search(
collection_name="enterprise_knowledge_base",
query_vector=query_vector,
query_filter=models.Filter(
must=[
models.FieldCondition(
key="department",
match=models.MatchValue(value=user_department)
),
models.FieldCondition(
key="security_level",
range=models.Range(lte=user_clearance_level)
)
]
),
limit=5
)
return search_result
`
प्रॉम्प्ट इंजेक्शन (Prompt Injection) सुरक्षा के लिए मूल नियम सिस्टम प्रॉम्प्ट चैनल और उपयोगकर्ता इनपुट चैनल को पूरी तरह से अलग रखना है। डेटाबेस को संशोधित करने या बाहरी API को कॉल करने वाले जोखिम भरे कार्यों के लिए मानवीय स्वीकृति प्रक्रिया (Human-in-the-Loop) लागू की जानी चाहिए या निष्पादन अधिकारों को एक अलग सैंडबॉक्स वातावरण में सीमित किया जाना चाहिए।
SaaS मॉड्यूलों को बदलकर आंतरिक सिस्टम के रूप में लगातार संचालित करने के लिए नियमित निरीक्षण दिनचर्या की आवश्यकता होती है।
| समय-सीमा | परिचालन निरीक्षण आइटम | विस्तृत कार्य |
|---|---|---|
| दैनिक | त्रुटि दर और टोकन उपयोग | Langfuse डैशबोर्ड से HTTP 5xx त्रुटि दर और विभाग-वार टोकन खपत की जांच करें |
| दैनिक | सर्किट ब्रेकर ब्लॉकिंग इतिहास | लूप डिटेक्शन द्वारा समाप्त किए गए सत्रों के टूल नाम और आर्गुमेंट पैटर्न एकत्र करें और सुधारें |
| साप्ताहिक | RAG खोज विफल प्रश्नों को निकालना | 0.6 से कम समानता स्कोर वाले अनुरोधों को फ़िल्टर करें और उन्हें परीक्षण उत्तर सेट में जोड़ें |
| साप्ताहिक | PII मास्किंग फ़ॉल्स पॉज़िटिव सत्यापन | मास्किंग चूक की जांच के लिए Presidio प्रोसेसिंग लॉग का नमूना लें |
| मासिक | CI/CD मूल्यांकन मानदंडों को अपडेट करना | व्यावसायिक परिवर्तनों को दर्शाने के लिए स्वचालित परीक्षण मामलों को संशोधित करें |
यदि आप स्व-होस्टेड मॉडल सर्विंग (vLLM आधारित) और बाहरी API सदस्यता के बीच निर्णय ले रहे हैं, तो दैनिक ट्रैफ़िक के आधार पर इसकी गणना करें।
1 NVIDIA A10G GPU वाले AWS EC2 g5.2xlarge इंस्टेंस की मासिक लागत लगभग $880 है। इसके विपरीत, GPT-4o API दरें प्रति 1 मिलियन इनपुट टोकन $2.50 और प्रति 1 मिलियन आउटपुट टोकन $10.00 हैं। यदि दैनिक ट्रैफ़िक 50 मिलियन टोकन से कम है, तो DevOps इंजीनियरों की प्रबंधन लागत और GPU की निश्चित लागतों को ध्यान में रखते हुए API सदस्यता विधि अधिक लाभदायक है। जब दैनिक ट्रैफ़िक 100 मिलियन टोकन से अधिक हो जाता है या पूर्ण आंतरिक नेटवर्क अलगाव अनिवार्य होता है, तब vLLM-आधारित स्व-होस्टेड सर्विंग पर स्विच करना सही निर्णय है।
मुख्य मॉडल में खराबी की स्थिति से निपटने के लिए 4-स्तरीय बैकअप राउटिंग संरचना बनाएं।
┌─────────────────────────────────────────────────────────────────────────┐ │ 4-Tier Graceful Degradation Architecture │ │ │ │ [Tier 1] Primary High-Performance Model (e.g., GPT-4o) │ │ │ │ │ ▼ (API Failure / Timeout / Circuit Breaker) │ │ [Tier 2] Lightweight Routing Model (e.g., GPT-4o-mini / On-Prem vLLM) │ │ │ │ │ ▼ (Continuous Outage) │ │ [Tier 3] Deterministic Regex & SQL Rule Engine │ │ │ │ │ ▼ (Unrecoverable Error) │ │ [Tier 4] Static Error Message & Async Admin Ticket Generation │ └─────────────────────────────────────────────────────────────────────────┘
कस्टम एजेंट सिस्टम को बेहतर बनाने का काम 90 दिनों की अवधि के टुकड़ों में किया जाता है।
| अवधि | अनुप्रयोग लक्ष्य | विशिष्ट कार्य सामग्री |
|---|---|---|
| दिन 1~30 | दृश्यता और डेटा सुरक्षा | Presidio मास्किंग इंजन स्थापित करें और Langfuse लॉगिंग SDK को एकीकृत करें |
| दिन 31~60 | लूप ब्लॉकिंग और लागत में कमी | Redis सिमेंटिक कैशिंग लागू करें और पायथन-आधारित सर्किट ब्रेकर कनेक्ट करें |
| दिन 61~90 | स्वचालन सत्यापन और पहुंच नियंत्रण | प्रॉम्प्ट Git प्रबंधन, DeepEval CI/CD एकीकरण, Qdrant RBAC मेटाडेटा लागू करें |
पहले महीने में, व्यक्तिगत डेटा लीक को रोकें और एक ऑब्जर्वेबिलिटी समाधान स्थापित करें ताकि सभी अनुरोध लॉग किए जाएं। दूसरे महीने में, अप्रत्याशित खर्चों को कम करने के लिए बार-बार होने वाले प्रॉम्प्ट कैशिंग और लूप ब्लॉकिंग राउटर्स संलग्न करें। अंतिम महीने में, प्रॉम्प्ट वर्शनिंग और ऑटोमेटेड टेस्ट इवैल्यूएशन सिस्टम को पूरा करें ताकि डिप्लॉयमेंट के दौरान एजेंट की खराबी की चिंता के बिना स्थिर संचालन सुनिश्चित हो सके।