توضیحات ابزار بسیار مهم است: ساختن ابزارهای LLM بهتر + توانایی تحقیق


نویسنده (ها): jv roig

در ابتدا منتشر شده در به سمت هوش مصنوعیبشر

توضیحات ابزار بسیار مهم است: ساختن ابزارهای LLM بهتر + توانایی تحقیق

پوشش تولید شده توسط chatgpt

این قسمت 5 در سریال “سفر به عامل AI ، از اصول اول شروع می شود”

اگر تازه به ما ملحق می شوید ، در اینجا پیوندهایی به مقالات قبلی در این سری آورده شده است:

اگر در مورد چگونگی ساخت ما کنجکاو هستید LLMS از ابزارها استفاده کنید ، آنها یک منبع خارق العاده هستند ، و بیشتر آنها نسخه های نمایشی ویدیویی و کد واقعی را دارند که می توانید از طریق Repo Companion Github از این سری بازی کنید.

درج کردن

در بخش های 1-3 ، ما اصول اولیه را برای تکامل آموختیم LLMS از رفتار طبیعی “پیش بینی بعدی” آنها تا رفتار “استفاده از ابزار” تقریباً عامل ، و بسیاری از برنامه های مختلف این کار را از طریق ابزارهای مختلف-از خواندن پرونده ها ، تا کار با repos github مشاهده کرد.

در قسمت 4 ، ما در مورد MCP ، مزایای آن و احتیاط های امنیتی آن را آموختیم ، و اینکه چرا ما نمی خواهیم به طور ناگهانی همه ابزارهای خود را برای استفاده از MCP تغییر دهیم حتی اگر باسن آن باشد (هنوز هیچ فایده ای برای آن وجود ندارد!).

در طول بحث MCP ، ما همچنین دیدیم که چگونه به Claude LLM اجازه می دهد تا به طور ناگهانی قابلیت تحقیق را از طریق برنامه دسک تاپ Claude + سرور MCP Seart Brave Web داشته باشد.

در اینجا در قسمت 5 ما می خواهیم یک توانایی مشابه را بسازیم ، اما ما همچنین سعی خواهیم کرد که آن را بهتر کنیم و در طول راه ، یک راز قدرتمند را یاد خواهیم گرفت که برای ساختن LLMS با استفاده از ابزار قابل اعتماد بسیار مهم است.

اجرای قدرت تحقیقات وب

اگر می خواهید دنبال کنید ، ما قصد داریم ابزارهای جدید خود را در بالای کد موجود خود از قسمت 3 شروع کنیم (لینک گیتوب). و مانند گذشته ، این که آیا شما تصمیم دارید که دنبال کنید یا نه ، تمام کدی که امروز در مورد آنها بحث خواهیم کرد ، در repo Github نیز در دسترس خواهد بود ، که من در پایان به آن پیوند خواهم داد.

بیایید شروع کنیم!

ابتدا بیایید ابزارهای مورد نیاز خود را برنامه ریزی کنیم.

  • جستجوی وب: ما هنوز از API جستجوی وب شجاع استفاده خواهیم کرد ، زیرا Brave یک ردیف رایگان بسیار سخاوتمندانه ارائه می دهد. درست مانند سناریوی MCP ، ما به یک کلید API احتیاج داریم که می توانید به صورت رایگان از آن استفاده کنید https://brave.com/search/api/
  • واکشی صفحات وب: API جستجوی وب شجاع در واقع محتوای HTML کامل از صفحات وب را برمی گرداند – فقط یک خلاصه. این منطقی است ، زیرا در غیر این صورت آنها خواهند بود ذخیره کل اینترنت در پایگاه داده خود ، به جای فقط نمایه سازی کل اینترنتبشر اما برای توانایی تحقیق واقعی ، ما باید محتوای کامل صفحات وب انتخاب شده را بازیابی کنیم.

[Note: As before, the sample code uses Alibaba Cloud Model Studio for the endpoint and uses Qwen Max, one of the most powerful models out there. However, since the code uses standard OpenAI API, you can target any other endpoint you want, and use any model you want — from other online services like OpenAI itself, or your own local models running through vLLM, TGI, or llama.cpp]

جستجوی وب شجاع

بیایید با اضافه کردن یک فایل جدید شروع کنیم web.py درون ما qwen_tools_lib پوشه ، و سپس اجرای ابزار جستجوی وب:

import os
import requests
import json

def brave_web_search(query, count=10):
"""
Search the web using Brave Search API.

Args:
query (str): The search query.
count (int, optional): The number of results to return. Defaults to 10.

Returns:
dict: A dictionary containing the search results or an error message.
"""


try:
# Get API key from environment variables
api_key = os.environ.get('BRAVE_API_KEY')
if not api_key:
return {"error": "BRAVE_API_KEY environment variable not found"}

# Prepare the API request
url = "https://api.search.brave.com/res/v1/web/search"
headers = {
"Accept": "application/json",
"Accept-Encoding": "gzip",
"X-Subscription-Token": api_key
}
params = {
"q": query,
"count": count
}

# Make the API request
response = requests.get(url, headers=headers, params=params)
response.raise_for_status() # Raise an exception for HTTP errors

# Return the JSON response
return response.json()

except requests.exceptions.RequestException as e:
return {"error": f"API request failed: {str(e)}"}
except json.JSONDecodeError:
return {"error": "Failed to decode JSON response"}
except Exception as e:
return {"error": f"An unexpected error occurred: {str(e)}"}

ابزار جستجوی وب شجاع بسیار ساده است زیرا سرویس شجاع در واقع با بالا بردن سنگین کار می کند. تمام کاری که ما انجام می دهیم این است که API از راه دور آنها را صدا کنیم.

البته ، ما باید یک معتبر داشته باشیم BRAVE_API_KEY و اجرای ابزار ما فرض می کند که به عنوان یک متغیر محیط قابل دسترسی خواهد بود.

برنامه نمونه ما از قبل استفاده می کند python-dotenv بنابراین ما یک .env پرونده پیش از این ، این فقط برای کلید API نقطه پایانی استنتاج ما استفاده می شد. ما فقط می توانیم یک ورودی را برای کلید شجاع API خود اضافه کنیم:

DASHSCOPE_API_KEY=sk-secreeeetttt
BRAVE_API_KEY=BSA_I_still_seeeeecret

واکشی صفحات وب

واکشی یک صفحه وب سخت تر از حد انتظار خواهد بود.

ما به سادگی می توانیم از پایتون استفاده کنیم requests کتابخانه برای واکشی یک صفحه وب برای به دست آوردن تمام محتوا ، مطمئناً ، اما صفحات وب دارای کد بیش از حد دیگهای بخار و غیر ضروری هستند که واقعاً نیست محتوا خودتان آن را امتحان کنید-اگر یک ابزار webpage fetch را اجرا کنید که دقیقاً همین کار را انجام می دهد ، به طور مرتب شکست می خورد زیرا در نتیجه بسیاری از نشانه ها در LLM بارگذاری می شود ، حتی برای صفحات وب که به چشم انسان ، به نظر نمی رسد که آنها بیش از حد محتوای زیادی داشته باشند.

بنابراین ، برای از بین بردن نفخ غیر ضروری و تمرکز روی محتوای اصلی اصلی ، ما از کتابخانه `« زیبا »استفاده خواهیم کرد:

def fetch_web_page(url, headers=None, timeout=30, clean=True):
"""
Fetch content from a specified URL and extract the main content.

Args:
url (str): The URL to fetch content from.
headers (dict, optional): Custom headers to include in the request. Defaults to None.
timeout (int, optional): Request timeout in seconds. Defaults to 30.
clean (bool, optional): Whether to clean and extract main content. Defaults to True.

Returns:
str or dict: The cleaned web page content as text, or a dictionary with an error message if the request fails.
"""


try:
# Set default headers if none provided
if headers is None:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}

# Make the request
response = requests.get(url, headers=headers, timeout=timeout)
response.raise_for_status() # Raise an exception for HTTP errors

if not clean:
return response.text

# Clean and extract main content using BeautifulSoup
try:
from bs4 import BeautifulSoup
import re

soup = BeautifulSoup(response.text, 'html.parser')

# Remove script, style, and other non-content elements
for element in soup(["script", "style", "header", "footer", "nav", "aside", "form", "iframe", "noscript"]):
element.decompose()

# Remove elements likely to be ads, banners, etc.
for element in soup.find_all(class_=re.compile('(ad|banner|menu|sidebar|footer|header|nav|comment|popup|cookie)', re.IGNORECASE)):
element.decompose()

clean_text = soup.get_text(separator=' ', strip=True)

# Clean up extra whitespace
clean_text = re.sub(r'\s+', ' ', clean_text).strip()

return clean_text

except ImportError:
# If BeautifulSoup is not available, return the raw text
return {"error": "BeautifulSoup is required for content cleaning but not installed. Install with: pip install beautifulsoup4"}

except requests.exceptions.RequestException as e:
return {"error": f"Request failed: {str(e)}"}
except Exception as e:
return {"error": f"An unexpected error occurred: {str(e)}"}

تمام کاری که ما در اینجا انجام می دهیم استفاده از requests ماژول برای واکشی یک صفحه وب ، و سپس استفاده از آن BeautifulSoup تا نفخ را از آن خارج کنید. (اگر متوجه شدید که در از بین بردن محتوای کمی تهاجمی است ، می توانید کمی با عناصر حذف شده باشید.)

البته ، به طوری که LLM ما در مورد این ابزارهای جدید و نحوه استفاده از آنها آگاهی داشته باشد ، ما باید ورودی های جدیدی را به ما اضافه کنیم qwen_tool.py پرونده نیز:

def list_tools():
tools_available = """
[...snip...]
-brave_web_search: Search the web using Brave Search API.
Parameters:
- query (required, string): the search query to submit to Brave
- count (optional, integer): the number of results to return, defaults to 10
Returns: Object - a JSON object containing search results or error information from the Brave Search API
- fetch_web_page: Fetch content from a specified URL.
Parameters:
- url (required, string): the URL to fetch content from
- headers (optional, dictionary): custom headers to include in the request, defaults to a standard User-Agent
- timeout (optional, integer): request timeout in seconds, defaults to 30
- clean (optional, boolean): whether to extract only the main content, defaults to True
Returns: String - the cleaned web page content as text, or an error object if the request fails
"""

return tools_available

این همان است ، LLM ما اکنون می تواند از API جستجوی وب شجاع برای جستجوی وب استفاده کند و همچنین می تواند صفحات وب کامل را پایین بیاورد. درست مثل این ، ما اکنون ابزارهای بسیار قابل استفاده LLM داریم!

اما قابل استفاده به دور از بهینه است … به عنوان مثال:

حتی با وجود ابزارهای ما ، به نظر می رسد QWEN-MAX “تحقیق” را درک نمی کند و در عوض فقط یک جستجوی وب را بدون استفاده از Fetch-WebPage انجام می دهد تا در واقع اطلاعات عمیق تری از صفحات وب جالب کسب کند

با استفاده از توضیحات و پیام های ابزار برای کنترل رفتار

و اکنون می خواهیم در مورد یک درس بسیار مهم صحبت کنیم که می توان LLM ها را با ابزار و تلاش برای دستیابی به AI عامل در مورد AI قرار داد:

همه چیز در مورد ابزارها سریع است!

به یاد داشته باشید که:

  • توضیحاتی که ما برای ابزارها ایجاد کردیم به سریع سیستم اضافه می شود.
  • دستورالعمل نحوه فراخوانی ابزارها به سریع سیستم اضافه می شود.
  • این ابزار به خود پاسخ می دهد – چه موفقیت و چه شکست – نیز به LLM بازگردانده می شوند ، و بنابراین بخشی از متن آن می شوند.

این بدان معنی است که ما باید به چیزهایی که در همه این سناریوها می گوییم توجه کنیم ، زیرا همه آنها اساساً هستند مهندسی سریعبشر

برای تحکیم این درس ، بیایید با مشکل تحقیق وب مقابله کنیم – به نظر می رسد LLM ما فقط با استفاده از خلاصه های جستجوی وب به جای انجام واقعاً تحقیق با استفاده از آن ، رضایت دارد fetch_web_page در کنسرت با brave_web_search و ما با درمان توضیحات ابزار و پیام های ابزار به عنوان مهندسی سریع آن را برطرف خواهیم کرد.

ابتدا بیایید اصلاح کنیم brave_web_search وت fetch_web_pageتوضیحات:

"""
-brave_web_search: Search the web using Brave Search API. The responses here only contain summaries. Use fetch_web_page to get the full contents of interesting search results, which should be your default behavior whenever you are asked to do research on any topic.
Parameters:
- query (required, string): the search query to submit to Brave
- count (optional, integer): the number of results to return, defaults to 10
Returns: Object - a JSON object containing search results or error information from the Brave Search API. Use fetch_web_page on relevant URLs to get the full, deeper information, especially for research tasks.

- fetch_web_page: Fetch content from a specified URL. This is a good tool to use after doing a brave_web_search, in order to get more details from interesting search results.
Parameters:
- url (required, string): the URL to fetch content from
- headers (optional, dictionary): custom headers to include in the request, defaults to a standard User-Agent
- timeout (optional, integer): request timeout in seconds, defaults to 30
- clean (optional, boolean): whether to extract only the main content, defaults to True
Returns: String - the cleaned web page content as text, or an error object if the request fails
"""


ما در اینجا چند مورد اضافه کردیم تا LLM خود را به سمت رفتار درست سوق دهد:

  • در brave_web_search توضیحات اکنون در مورد اهمیت استفاده صحبت می کند fetch_web_page و چرا
  • توضیحات آنچه باز می گردد نیز به روز می شود fetch_web_pageبشر
  • در fetch_web_page توضیحات هم اکنون در مورد آن صحبت می کند که ابزاری مناسب برای استفاده پس از آن است brave_web_search به عنوان یک دسته کوچک موسیقی جاز ، به ویژه برای کارهای تحقیقاتی.

اما این فقط توضیحات ابزار تحت اللفظی و توضیحات استدلال نیست که راه های مهندسی سریع است – حتی نتایج ابزار تحت اللفظی نیز وجود دارد ، بنابراین بیایید از آن نیز استفاده کنیم brave_web_search پیام نتیجه به عنوان فرصتی برای مهندسی سریع:

#In web.py, def brave_web_search()

#We update its last line from:
return response.json()

#...to:
message = "Web search results: \n" + json.dumps(response.json()) + "\nThe information here are just summaries. Use fetch_web_page tool to retrieve real content for in-depth information, especially for research purposes."
return message

بنابراین حتی وقتی نتایج را به LLM باز می گردانیم – که همه به بخشی از متن آن تبدیل می شوند و بنابراین می توانند به عنوان دستورالعمل های مفید برای اهداف مختلف خدمت کنند -ما به جای اینکه فقط از خلاصه های جستجوی وب رضایت داشته باشیم ، می توانیم به جای اینکه فقط در خلاصه های جستجوی وب راضی شویم ، آن را به سمت واکشی کردن نتایج کامل سوق دهیم.

بیایید دوباره کار خود را امتحان کنیم:

اکنون بلافاصله از fetch_web_page برای کشیدن محتویات وب سایت Kamiwaza AI استفاده کرد!

خیلی بهتر!

در اینجا یک فیلم خوب برای دیدن این مورد در عمل وجود دارد:

بسته بندی کردن

درس کلیدی در اینجا این است که همه چیز در مورد ابزارها – از نحوه توصیف ابزار به طور کلی ، به نحو ، پارامترها ، توضیحات پارامتر و حتی پیام های موفقیت و خطایی که برمی گردد – همه هستند فرصت های مهندسی سریع.

این بینش کلیدی نه تنها برای کمک به شما در استفاده از یک ابزار بعد از دیگری ، مانند مثال ما در اینجا بسیار مهم است. به طور کلی برای اطمینان بیشتر AI عامل بسیار مهم است – مانند کمک به بهبود LLM در هنگام اشتباه کردن ، یا به آنها در درک چگونگی عملکرد بهتر در هنگام مواجهه با شکست کمک می کند.

نگران نباشید ، با ادامه این سریال ، ما بیشتر به آن چیزها شیرجه می زنیم.

اگر به کد علاقه مند هستید و خودتان را امتحان می کنید ، در اینجا Repo همراه GitHub است: لینک گیتوببشر

منتشر شده از طریق به سمت هوش مصنوعی



منبع: https://towardsai.net/p/artificial-intelligence/tool-descriptions-are-critical-making-better-llm-tools-research-capability