Secure ، Swift و Smart: یک راهنمای اصلی برای ساخت گردش کار عامل AI با مدل های محلی

هوش مصنوعی در حال تغییر چگونگی حل مشکلات ما است ، اما مدل های پرچمدار مانند GPT-4 با اشکالاتی همراه هستند: هزینه های بالا ، تأخیر و نگرانی های مربوط به حفظ حریم خصوصی در هنگام ترک داده های حساس شبکه شما. مدل های محلی یک جایگزین قدرتمند – کوچکتر ، سریعتر و کاملاً در زیرساخت های شما ارائه می دهند. در این راهنمای اساسی ، ما با استفاده از یک مدل پارامتر محلی 14B محلی برای ایجاد یک عامل محلی 14B برای ایجاد یک عامل SQL که به طور مستقل از نمایش داده های پایگاه داده استفاده می کند ، می خواهیم از طریق ایجاد یک گردش کار عامل AI قدم بزنیم. این نمای کلی بر مفاهیم کلیدی و بهترین شیوه ها متمرکز است تا آن را کارآمد ، قابل اعتماد و آماده بنگاه اقتصادی انجام دهد.
چرا مدل های محلی؟
مدل های محلی نیاز به راه اندازی بیشتری نسبت به API های تجاری دارند که اغلب برای انجام بهترین کار خود به آموزش های سفارشی نیاز دارند و با هوش گسترده مدل های پرچمدار مطابقت ندارند. با این حال ، نقاط قوت آنها واضح است:
- سرعت: مدل های کوچکتر به معنای استنباط سریعتر ، ایده آل برای کارهای در زمان واقعی است.
- خلوت: داده ها هرگز شبکه شما را ترک نمی کنند ، برای برنامه های حساس سازمانی بسیار مهم است.
- هزینه: بدون هزینه API مکرر – فقط سرمایه گذاری سخت افزار شما.
مثال ما از یک برنامه FastAPI با یک مدل محلی برای ساخت یک عامل SQL استفاده می کند. بیایید روند را کشف کنیم.
مرحله 1: نقش نماینده را تعریف کنید
یک گردش کار عامل ، هوش مصنوعی را قادر می سازد تا با استدلال و استفاده از ابزارها کارهای چند مرحله ای را انجام دهد. نماینده SQL ما از کاربر استفاده می کند ، پایگاه داده ها و جداول را شناسایی می کند و نمایش داده ها را اجرا می کند – همه به صورت محلی.
در اینجا دستورالعمل سیستم وجود دارد:
SYSTEM_INSTRUCTION = """
You are a MS SQL expert Db Admin agent. Your job is to assist users in querying a Microsoft SQL Server database using provided tools. Address users casually and:
1. Identify database and table names, even from vague inputs.
2. Use tools to resolve ambiguities before asking for clarification.
3. Handle SQL operations: SELECTs, schema inspection, stored procedures, and more.
4. Default to 25 records for general SELECTs unless specified.
5. Format results clearly: tables for data, SQL for schemas.
6. Only seek clarification when truly stuck.
Available tools:
- list_databases: List all databases.
- all_table_names: List tables in a database.
- filter_table_names: Find tables matching a substring.
- schema_definitions: Get table schemas.
- execute_query: Run a SQL query.
"""
این هدف و ابزار ابزار عامل را تعریف می کند و مرحله ای را برای عملکرد خودمختار تعیین می کند.
مرحله 2: چارچوب را تنظیم کنید
ما برای مدیریت گردش کار از FastAPI برای API و یک چارچوب عامل استفاده می کنیم. در اینجا ساختار اساسی وجود دارد:
from fastapi import FastAPI
from mcp_agent.app import MCPApp
from mcp_agent.agents.agent import Agent
app = FastAPI(title="SQL Agent API", version="2.0")
mcp_app = MCPApp(name="sql_agent")
@app.post("/v1/chat/completions")
async def chat_completions(request: Request):
body = await request.json()
user_prompt = next((m["content"] for m in reversed(body.get("messages", [])) if m["role"] == "user"), "")
async def stream_response():
async for chunk in sql_agent_workflow(user_prompt):
yield chunk
return StreamingResponse(content=stream_response(), media_type="text/event-stream")
این یک نقطه پایانی جریان را تنظیم می کند و از ژنراتورهای ناهمزمان برای ارائه پاسخ های در زمان واقعی استفاده می کند-ویژگی ای که با ارائه بازخورد فوری ، تجربه کاربر را تقویت می کند.
مرحله 3: با طبقه بندی های منطقی بهینه سازی کنید
برای صرفه جویی در منابع ، ما قبل از استناد به هوش مصنوعی ، نمایش داده ها را با منطق طبقه بندی می کنیم:
def classify_query(prompt):
prompt_lower = prompt.lower()
if re.search(r"execute\s+this\s+query[^:]*:", prompt_lower):
return "execute_query"
if "schema" in prompt_lower and "table" in prompt_lower:
return "table_schema"
return "general_query"
این امر با انجام وظایف ساده بدون سربار AI ، تأخیر را کاهش می دهد.
مرحله 4: زمینه را به صورت هوشمندانه استخراج کنید
نماینده متن مانند نام های پایگاه داده از ارسال ها را نشان می دهد:
def extract_database_name(prompt):
prompt_lower = prompt.lower()
db_aliases = {"enterprisedb": "enterprise_db", "timesheets": "timesheets_db"}
explicit_match = re.search(r"(?:in|on|for|from)\s+([a-z0-9_\s.-]+?)(?:\s+database|\s+db)?$", prompt_lower)
if explicit_match:
db_name = explicit_match.group(1).strip()
return db_aliases.get(db_name, db_name)
return "master" # Default fallback
این تضمین می کند که گردش کار با ورودی های مبهم به طور کارآمد سازگار است.
مرحله 5: فراخوانی ابزار اهرم با ذخیره سازی
ابزارها با پایگاه داده تعامل دارند و ذخیره سازی باعث افزایش عملکرد می شود:
TOOL_RESULT_CACHE: Dict[str, Dict[str, Any]] = {}
DEFAULT_CACHE_TTL_SECONDS = 600
async def call_tool_with_cache(sql_agent: Agent, tool_name: str, tool_args: Dict[str, Any], logger, ttl_seconds: int = DEFAULT_CACHE_TTL_SECONDS):
cache_key = f"{tool_name}::{json.dumps(tool_args, sort_keys=True)}"
current_time = time.time()
if cache_key in TOOL_RESULT_CACHE and (current_time - TOOL_RESULT_CACHE[cache_key]["timestamp"]) < ttl_seconds:
logger.info(f"Cache HIT for '{tool_name}'")
return TOOL_RESULT_CACHE[cache_key]["result_text"]
result = await sql_agent.call_tool(tool_name, tool_args)
result_text = result.content[0].text if result.content else ""
TOOL_RESULT_CACHE[cache_key] = {"timestamp": current_time, "result_text": result_text}
return result_text
ذخیره سازی تماسهای زائد را به حداقل می رساند و سرعت را بهبود می بخشد.
مرحله ششم: با مداخله انسان ، گردش کار اصلی را بسازید
گردش کار همه چیز را از جمله مداخله انسان در صورت لزوم ارکستر می کند:
async def sql_agent_workflow(user_prompt: str) -> AsyncGenerator[str, None]:
async with mcp_app.run() as agent_app:
sql_agent = Agent(name="sql_agent", instruction=SYSTEM_INSTRUCTION, server_names=["sql_server"])
async with sql_agent:
llm = await sql_agent.attach_llm(OpenAIAugmentedLLM) # Local 14B model
query_type = classify_query(user_prompt)
db_name = extract_database_name(user_prompt)
if query_type == "execute_query":
query = re.search(r"execute\s+this\s+query[^:]*:\s*([^;]+);", user_prompt, re.IGNORECASE).group(1)
result = await call_tool_with_cache(sql_agent, "execute_query", {"query": query, "database": db_name}, agent_app.logger)
yield f"Dude, here’s your result:\n{result}"
return
max_iterations = 25
for _ in range(max_iterations):
response = await llm.generate_str(message=user_prompt, request_params=RequestParams(model="local_14b"))
if " " in response:
yield "Hey, I’m stuck! Can you clarify: " + response.split(" ")[1].split("")[0]
return
tool_name, tool_args = await extract_tool_call(response)
if tool_name:
result = await call_tool_with_cache(sql_agent, tool_name, tool_args, agent_app.logger)
yield f"Tool {tool_name} result:\n{result}"
if tool_name == "execute_query":
return
user_prompt = f"Based on: {result}, continue: {user_prompt}"
این از یک ژنراتور ناهمزمان برای پخش استفاده می کند و شامل یک زمینه مکالمه است (user_prompt
به روزرسانی با نتایج) برای حفظ وضعیت در تعامل. از نظر مهم ، از مداخله انسان پشتیبانی می کند: هنگامی که عامل با ابهام برخورد می کند ، نمی تواند با ابزارها برطرف شود ، از آن استفاده می کند
برچسب بزنید تا از کاربر کمک بخواهید ، از حلقه های بی نهایت و اطمینان از پیشرفت جلوگیری کنید.
مرحله 7: از پیچیدگی و مقیاس برخورد کنید
یک مدل 14B به سخت افزار قوی نیاز دارد (به عنوان مثال ، یک پردازنده گرافیکی NVIDIA A40 ، A100). مقیاس بندی ممکن است شامل کمیت یا GPU های اضافی باشد. هیچ هزینه API وجود ندارد ، اما تنظیم دقیق نیاز به تخصص دارد.
مرحله 8: آزمایش و استقرار
طبقه بندی کننده های تست با تست های واحد و گردش کار با تست های ادغام. نظارت بر عملکرد از طریق سیاهههای مربوط به کد.
بسته بندی
این گردش کار ترکیبی از سرعت ، حریم خصوصی و هوشمند است. ویژگی های کلیدی عبارتند از:
- مداخله انسان: نماینده هنگام گیر کردن ، شفاف سازی را بهبود می بخشد و قابلیت اطمینان را بهبود می بخشد.
- پاسخهای جریان: ژنراتورهای ناهمزمان بازخورد در زمان واقعی را ارائه می دهند.
- زمینه مکالمه: دولت برای پیگیری های یکپارچه در تعامل ادامه می یابد.
- ذخیره سازی: تماس های بانک اطلاعاتی اضافی را برای کارآیی کاهش می دهد.
مدل های محلی در حال تحول هستند – در حالت بهتری قرار دارند و این تنظیمات سازگار خواهد شد. آیا به من اطلاع دهید که آیا می خواهید عمیق تر یا هر پیشنهادی ، نمایش داده شود. همه گوش ها امیدوارم این کمک کند!
استنادها