DSPy + Scrapeless: अपने DSPy प्रोग्राम को MCP के माध्यम से लाइव वेब टूल्स दें
Senior Web Scraping Engineer
TL;DR:
- DSPy Scrapeless MCP सर्वर के उपकरणों को
dspy.Toolऑब्जेक्ट में परिवर्तित करता हैdspy.Tool.from_mcp_toolके साथ, DSPy प्रोग्राम को सभी 21 वेब उपकरण देता है,scrape_markdownसे लेकर एक पूर्ण ब्राउज़र सेट तक। - प्रत्येक परिवर्तित उपकरण एक जीवित
mcp.ClientSessionसे बंधा होता है, इसलिए उपकरण केवल तब काम करते हैं जब वह सत्र खुला हो; पूरे प्रवाह को एकasync with ClientSession(...)ब्लॉक के अंदर रखें। - उपकरणों को परिवर्तित करने और एक को सीधे
acallके साथ कॉल करने के लिए किसी भाषा-मॉडल की आवश्यकता नहीं होती; केवलdspy.ReActरन को एक LM की आवश्यकता होती है। dspy.Tool.from_mcp_tool(session, tool)सत्र और एक MCP उपकरण को लेता है और एक DSPy उपकरण लौटाता है जिसे आप कॉल कर सकते हैं या एक मॉड्यूल को दे सकते हैं।- एक सीधा
scrape_markdownकॉल पृष्ठ को Markdown के रूप में लौटाता है, जिसे DSPy हस्ताक्षर में डालने के लिए तैयार होता है। - Scrapeless मुफ्त योजना पर शुरू करें और अपने DSPy प्रोग्राम को असली वेब उपकरण दें।
DSPy अधिकांश एजेंट ढांचों से एक अलग विचार पर निर्मित है: आप जो चाहते हैं उसे एक हस्ताक्षर के साथ घोषित करें और DSPy को प्रांप्टिंग संभालने दें। उपकरण उस मॉडल में साफ-सुथरे ढंग से फिट होते हैं, लेकिन DSPy लाइव वेब तक पहुँचने का कोई तरीका प्रदान नहीं करता। मॉडल संदर्भ प्रोटोकॉल इसे प्रदान करता है। एक MCP सर्वर के उपकरणों को DSPy उपकरणों में परिवर्तित करें और एक dspy.ReAct मॉड्यूल उन्हें उसी तरह कॉल कर सकता है जैसे वह किसी अन्य उपकरण को कॉल करता है।
यह मार्गदर्शिका DSPy को Scrapeless MCP सर्वर से जोड़ती है, इसके 21 उपकरणों को परिवर्तित करती है, एक को वास्तविक रूप से कॉल करती है, और दिखाती है कि जहाँ एक भाषा-मॉडल कुंजी आवश्यक हो जाती है। परिवर्तन और सीधी कॉल लाइव सर्वर के खिलाफ सत्यापित की गई हैं; मॉड्यूल चलाना एकमात्र पूर्वापेक्षा के रूप में चिह्नित है।
Scrapeless MCP क्यों
Scrapeless MCP सर्वर वेब-स्क्रैपिंग और ब्राउज़र उपकरणों को प्रदर्शित करता है जिसे एक एजेंट सीधे कॉल कर सकता है, इसलिए स्क्रैपिंग परत ऐसा कुछ नहीं है जिसे आप बनाएं या होस्ट करें। एक कनेक्शन 21 उपकरणों की सेवा करता है: सामग्री के लिए scrape_markdown और scrape_html, खोज डेटा के लिए google_search और google_trends, कैप्चर के लिए scrape_screenshot, और एक पूर्ण browser_* सेट जो एक क्लाउड ब्राउज़र को संचालित करता है। DSPy सभी को dspy.Tool.from_mcp_tool के माध्यम से ब्रिज करता है, जो प्रत्येक MCP उपकरण को एक स्थानीय DSPy उपकरण में बदलता है।
browser_* उपकरण Scrapeless क्लाउड ब्राउज़र को चलाते हैं, इसलिए एक प्रोग्राम एक इंटरएक्टिव पृष्ठ पर नेविगेट कर सकता है और जो रेंडर होता है उसे पढ़ सकता है, यह सब Scrapeless अवसंरचना पर होता है। उसी सर्वर के प्रोटोकॉल दृश्य के लिए, MCP एकीकरण गाइड सामान्य रूप से MCP ग्राहकों के कनेक्ट होने के तरीके को कवर करता है।
पूर्वापेक्षाएँ
- Python 3.10 या बाद का।
- डैशबोर्ड से Scrapeless API कुंजी, जिसे
SCRAPELESS_API_KEYके रूप में निर्यात किया गया है। - केवल
dspy.ReActरन के लिए एक भाषा-मॉडल कुंजी (जैसेOPENAI_API_KEY)। उपकरणों को परिवर्तित करने और कॉल करने के लिए एक की आवश्यकता नहीं है।
इंस्टॉलेशन
DSPy और MCP क्लाइंट पुस्तकालय इंस्टॉल करें।
bash
pip install dspy mcp
अपने Scrapeless कुंजी को शेल में सेट करें। वास्तविक कुंजी का उपयोग रन समय पर करें और स्रोत से प्लेसहोल्डर हटा दें।
bash
export SCRAPELESS_API_KEY="sk_your_key_here"
एक सत्र खोलें और उपकरणों को परिवर्तित करें
DSPy का MCP ब्रिज एक जीवित सत्र पर काम करता है। एक स्ट्रीम करने योग्य-HHTP कनेक्शन खोलें, इसे mcp.ClientSession में लपेटें, इसे प्रारंभ करें, सर्वर के उपकरणों की सूची बनाएं, और प्रत्येक को dspy.Tool.from_mcp_tool के साथ परिवर्तित करें। Scrapeless कुंजी x-api-token हेडर में होती है।
python
import asyncio
import os
import dspy
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
async def main() -> None:
async with streamablehttp_client(
"https://api.scrapeless.com/mcp", headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]}
) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
mcp_tools = (await session.list_tools()).tools
tools = [dspy.Tool.from_mcp_tool(session, t) for t in mcp_tools]
names = sorted(t.name for t in tools)
print("dspy tools:", len(tools))
print("tools:", ", ".join(names))
asyncio.run(main())
लाइव सर्वर 21 DSPy उपकरण प्रदान करता है, जो बिना किसी भाषा मॉडल कॉन्फ़िगर किए परिवर्तित होते हैं।
text
dspy tools: 21
tools: browser_click, browser_close, browser_create, browser_get_html, browser_get_text, browser_go_back, browser_go_forward, browser_goto, browser_press_key, browser_screenshot, browser_scroll, browser_scroll_to, browser_snapshot, browser_type, browser_wait, browser_wait_for, google_search, google_trends, scrape_html, scrape_markdown, scrape_screenshot
प्रत्येक परिवर्तित उपकरण एक session का संदर्भ रखता है, यही कारण है कि रूपांतरण और जो कुछ भी उपकरणों का उपयोग करता है, वह async with ClientSession(...) ब्लॉक के भीतर रहता है। सत्र बंद करें और उपकरण कार्य करना बंद कर देते हैं। परिवहन और संदेश परत मॉडल संदर्भ प्रोटोकॉल विनिर्देशन का पालन करती है, जो JSON-RPC 2.0 विनिर्देशन पर आधारित है।
एक उपकरण को कॉल करें
एक DSPy उपकरण अपने आप पर कॉल करने योग्य है, इसलिए आप एक मॉड्यूल बनाने से पहले एक चला सकते हैं। acall उपकरण को कीवर्ड तर्कों के साथ बुलाता है और इसका परिणाम वापस करता है।
python
import asyncio
import os
import dspy
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
async def main() -> None:
async with streamablehttp_client(
"https://api.scrapeless.com/mcp", headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]}
) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
mcp_tools = (await session.list_tools()).tools
tools = [dspy.Tool.from_mcp_tool(session, t) for t in mcp_tools]
scrape_markdown = next(t for t in tools if t.name == "scrape_markdown")
result = await scrape_markdown.acall(url="https://quotes.toscrape.com/")
text = result if isinstance(result, str) else str(result)
print("markdown chars:", len(text))
print("contains a quote:", "The world as we have created it" in text)
asyncio.run(main())
कॉल पृष्ठ को मार्कडाउन के रूप में वापस करता है, और सामग्री जांच यह पुष्टि करती है कि एक वास्तविक उद्धरण मौजूद है।
text
markdown chars: 4308
contains a quote: True
एक उपकरण को सीधे कॉल करना कनेक्शन की पुष्टि करने और यह निरीक्षण करने का सबसे तेज़ तरीका है कि एक उपकरण क्या लौटाता है, और यह वही वस्तु है जो एक मॉड्यूल कॉल करेगा। DSPy दस्तावेज़ीकरण उपकरणों, संकेतों और मॉड्यूल को विस्तृत रूप से कवर करता है।
उपकरणों को एक मॉड्यूल में प्लग करें
dspy.ReAct एक संकेत और उपकरणों की सूची लेता है और कारण-कार्य चक्र चलाता है। यह वह चरण है जिसमें एक भाषा मॉडल की आवश्यकता होती है: एक को dspy.configure से कॉन्फ़िगर करें, फिर मॉड्यूल को निर्णय लेने दें कि कब scrape_markdown या कोई अन्य उपकरण कॉल करना है। चूंकि उपकरण सत्र से बंधे होते हैं, मॉड्यूल उसी async with ClientSession(...) ब्लॉक के भीतर चलता है जिसने उन्हें परिवर्तित किया।
नोट:
dspy.configure(lm=...)औरdspy.ReActरन के लिए एक भाषा-मॉडल कुंजी जैसेOPENAI_API_KEYकी आवश्यकता होती है, जो यहां सेट नहीं है। ऊपर 21 उपकरणों को परिवर्तित करना और सीधेscrape_markdownकॉल करना इसके बिना चल सकता है। यह ब्लॉक अपने सटीक आकार के साथ दिखाया गया है; केवल मॉडल राउंड-ट्रिप एक पूर्व आवश्यकता है।
python
# `async with ClientSession(...)` ब्लॉक के भीतर, `tools` को परिवर्तित करने के बाद
dspy.configure(lm=dspy.LM("openai/gpt-4o"))
agent = dspy.ReAct("question -> answer", tools=tools)
result = await agent.acall(
question="Fetch https://quotes.toscrape.com/ and list the first three quotes with their authors."
)
print(result.answer)
रनटाइम पर, मॉड्यूल संकेत को पढ़ता है, पृष्ठ प्राप्त करने के लिए scrape_markdown को कॉल करता है, पहले से प्रदर्शित मार्कडाउन पर तर्क करता है, और answer फ़ील्ड को भरता है। उपकरण वही वस्तुएं होते हैं चाहे मॉड्यूल उन्हें कॉल करे या आप करें।
निष्कर्ष
DSPy और Scrapeless MCP सर्वर DSPy की वर्णनात्मक शैली को बनाए रखते हुए वास्तविक वेब पहुंच जोड़ते हैं। dspy.Tool.from_mcp_tool 21 उपकरणों को परिवर्तित करता है, acall एक कार्य करता है, और dspy.ReAct उन्हें एक चल रहे प्रोग्राम में बदलता है। याद रखने का एक ही नियम है कि उपकरण सत्र पर जीवित रहते हैं, इसलिए एक सत्र ब्लॉक के भीतर प्रवाह बनाए रखें, और केवल मॉड्यूल रन को एक मॉडल कुंजी की आवश्यकता होती है। ऊपर दिए गए स्क्रिप्ट से शुरू करें, उपकरणों को उस परिभाषा के लिए आवश्यक रखें, और DSPy को प्रॉम्प्टिंग करने दें।
एक मुफ्त Scrapeless खाता बनाएं एक API कुंजी प्राप्त करने के लिए, और जब आप एक आवर्ती कार्यक्रम की योजना बनाते हैं तो Scrapeless की कीमतें की जांच करें।
अक्सर पूछे जाने वाले प्रश्न
प्रश्र: क्या DSPy को MCP उपकरणों को लोड करने के लिए एक भाषा मॉडल की आवश्यकता है?
नहीं। सत्र खोलना, उपकरणों की सूची बनाना, उन्हें dspy.Tool.from_mcp_tool से परिवर्तित करना, और acall के साथ एक को कॉल करना सभी केवल Scrapeless API कुंजी के साथ चलाते हैं। एक भाषा-मॉडल कुंजी केवल dspy.ReAct के लिए आवश्यक है, जब मॉड्यूल खुद तय करता है कि कौन से उपकरणों को बुलाना है।
प्रश्र: कोड को एक ClientSession ब्लॉक के भीतर रहने की आवश्यकता क्यों है?
dspy.Tool.from_mcp_tool प्रत्येक उपकरण को mcp.ClientSession से बंधित करता है जिसे आप इसे पास करते हैं, इसलिए उपकरण अपने कॉल उस सत्र के माध्यम से जारी करते हैं। एक बार जब async with ClientSession(...) ब्लॉक बाहर निकलता है, तो सत्र बंद हो जाता है और उपकरण अब चल नहीं सकते, यही कारण है कि उपकरणों को परिवर्तित करना और उनका उपयोग उसी ब्लॉक में होना चाहिए।
प्रश्न: DSPy के MCP इंटीग्रेशन में एडप्टर ढांचों से क्या अंतर है?
DSPy उपकरणों को एक कच्चे mcp.ClientSession से dspy.Tool.from_mcp_tool के साथ परिवर्तित करता है, बजाय इसके कि एक उच्च-स्तरीय एडप्टर के माध्यम से जो आपके लिए कनेक्शन का प्रबंधन करता है। इसका व्यापार-फल यह है कि सत्र के जीवनकाल पर स्पष्ट नियंत्रण मिलता है, एक कम निर्भरता के बदले में, और यह उपकरणों को सामान्य dspy.Tool वस्तुओं के रूप में रखता है।
प्रश्न: बिना एक मॉड्यूल बनाए उपकरण को कैसे कॉल करूं?
हर परिवर्तित उपकरण को acall और कीवर्ड तर्कों के साथ कॉल किया जा सकता है, इसलिए await scrape_markdown.acall(url="...") उपकरण परिणाम सीधे देता है। यह कनेक्शन की पुष्टि करने और आउटपुट का निरीक्षण करने के लिए उपयोगी है, इससे पहले कि आप उपकरणों को dspy.ReAct मॉड्यूल में लपेटें।
प्रश्न: मैं एक मॉड्यूल को केवल कुछ उपकरण कैसे दूं?
from_mcp_tool प्रति उपकरण कार्य करता है, इसलिए केवल उन MCP उपकरणों से tools सूची बनाएं जो आप चाहते हैं, या परिवर्तित सूची को dspy.ReAct में पारित करने से पहले फ़िल्टर करें। यदि कार्य को केवल सामग्री और खोज की आवश्यकता है, तो केवल scrape_markdown और google_search को एक मॉड्यूल देना पूर्ण 21-उपकरण सेट से सुरक्षित है।
प्रश्न: क्या उपकरणों के माध्यम से स्क्रैप करना लक्षित के नियमों द्वारा बाधित है?
हाँ। उपकरण सार्वजनिक पृष्ठों को लाते हैं, और आप प्रत्येक लक्षित के शर्तों और इसके रोबोट्स निष्क exclusion प्रोटोकॉल दिशानिर्देशों का सम्मान करने के लिए जिम्मेदार रहते हैं। मात्रा को सीमित रखें और डेटा को सार्वजनिक रखें, और मॉड्यूल का दायरा उन उपकरणों तक सीमित करें जिनकी कार्य को वास्तव में आवश्यकता है।
स्क्रैपलेस में, हम केवल सार्वजनिक रूप से उपलब्ध डेटा का उपयोग करते हैं, जबकि लागू कानूनों, विनियमों और वेबसाइट गोपनीयता नीतियों का सख्ती से अनुपालन करते हैं। इस ब्लॉग में सामग्री केवल प्रदर्शन उद्देश्यों के लिए है और इसमें कोई अवैध या उल्लंघन करने वाली गतिविधियों को शामिल नहीं किया गया है। हम इस ब्लॉग या तृतीय-पक्ष लिंक से जानकारी के उपयोग के लिए सभी देयता को कोई गारंटी नहीं देते हैं और सभी देयता का खुलासा करते हैं। किसी भी स्क्रैपिंग गतिविधियों में संलग्न होने से पहले, अपने कानूनी सलाहकार से परामर्श करें और लक्ष्य वेबसाइट की सेवा की शर्तों की समीक्षा करें या आवश्यक अनुमतियाँ प्राप्त करें।



