Duibonduil commited on
Commit
58d47d5
·
verified ·
1 Parent(s): be32401

Upload 2 files

Browse files
docs/source/hi/examples/rag.md ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # एजेंटिक RAG
2
+
3
+ [[open-in-colab]]
4
+
5
+ रिट्रीवल-ऑगमेंटेड-जनरेशन (RAG) है "एक यूजर के प्रश्न का उत्तर देने के लिए LLM का उपयोग करना, लेकिन उत्तर को एक नॉलेज बेस से प्राप्त जानकारी पर आधारित करना"। इसमें वैनिला या फाइन-ट्यून्ड LLM का उपयोग करने की तुलना में कई फायदे हैं: कुछ नाम लेने के लिए, यह उत्तर को सत्य तथ्यों पर आधारित करने और काल्पनिक बातों को कम करने की अनुमति देता है, यह LLM को डोमेन-विशिष्ट ज्ञान प्रदान करने की अनुमति देता है, और यह नॉलेज बेस से जानकारी तक पहुंच का सूक्ष्म नियंत्रण प्रदान करता है।
6
+
7
+ लेकिन वैनिला RAG की सीमाएं हैं, सबसे महत्वपूर्ण ये दो:
8
+ - यह केवल एक रिट्रीवल स्टेप करता है: यदि परिणाम खराब हैं, तो जनरेशन भी बदले में खराब होगा।
9
+ - सिमेंटिक समानता की गणना यूजर के प्रश्न को संदर्भ के रूप में करके की जाती है, जो अनुकूल नहीं हो सकती: उदाहरण के लिए, यूजर का प्रश्न अक्सर एक सवाल होगा, जबकि सही उत्तर देने वाला डॉक्यूमेंट सकारात्मक स्वर में हो सकता है, और इसका समानता स्कोर अन्य स्रोत दस्तावेज़ों की तुलना में कम हो सकता है, जो प्रश्नवाचक स्वर में हो सकते हैं। इससे संबंधित जानकारी को चूकने का जोखिम होता है।
10
+
11
+ हम एक RAG एजेंट बनाकर इन समस्याओं को कम कर सकते हैं: बहुत सरल तरीके से, एक रिट्रीवर टूल से लैस एजेंट!
12
+
13
+ यह एजेंट करेगा: ✅ स्वयं क्वेरी तैयार करेगा और ✅ आवश्यकता पड़ने पर पुनः-प्राप्ति के लिए समीक्षा करेगा।
14
+
15
+ इसलिए यह सहज रूप से कुछ उन्नत RAG तकनीकों को प्राप्त कर लेना चाहिए!
16
+ - सिमेंटिक खोज में सीधे यूजर क्वेरी का संदर्भ के रूप में उपयोग करने के बजाय, एजेंट स्वयं एक संदर्भ वाक्य तैयार करता है जो लक्षित डॉक्यूमेंट्स के करीब हो सकता है, जैसा कि [HyDE](https://huggingface.co/papers/2212.10496) में किया गया है।
17
+ एजेंट जनरेट किए गए स्निपेट्स का उपयोग कर सकता है और आवश्यकता पड़ने पर पुनः-प्राप्ति कर सकता है, जैसा कि [Self-Query](https://docs.llamaindex.ai/en/stable/examples/evaluation/RetryQuery/) में किया गया है।
18
+
19
+ चलिए इस सिस्टम को बनाते हैं। 🛠️
20
+
21
+ आवश्यक डिपेंडेंसी इंस्टॉल करने के लिए नीचे दी गई लाइन चलाएं।
22
+ ```bash
23
+ !pip install smolagents pandas langchain langchain-community sentence-transformers rank_bm25 --upgrade -q
24
+ ```
25
+ HF Inference API को कॉल करने के लिए, आपको अपने एनवायरनमेंट वेरिएबल `HF_TOKEN` के रूप में एक वैध टोकन की आवश्यकता होगी।
26
+ हम इसे लोड करने के लिए python-dotenv का उपयोग करते हैं।
27
+ ```py
28
+ from dotenv import load_dotenv
29
+ load_dotenv()
30
+ ```
31
+
32
+ हम पहले एक नॉलेज बेस लोड करते हैं जि��� पर हम RAG को लागू करना चाहते हैं: यह डेटा सेट Hugging Face के कई लाइब्रेरी के डॉक्यूमेंट पृष्ठों का संकलन है, जिन्हें Markdown में स्टोर किया गया है। हम केवल `transformers` लाइब्रेरी के दस्तावेज़ों को रखेंगे।
33
+
34
+ फिर डेटासेट को प्रोसेस करके और इसे एक वेक्टर डेटाबेस में स्टोर करके नॉलेज बेस तैयार करें जिसे रिट्रीवर द्वारा उपयोग किया जाएगा।
35
+
36
+ हम [LangChain](https://python.langchain.com/docs/introduction/) का उपयोग करते हैं क्योंकि इसमें उत्कृष्ट वेक्टर डेटाबेस उपयोगिताएं हैं।
37
+
38
+ ```py
39
+ import datasets
40
+ from langchain.docstore.document import Document
41
+ from langchain.text_splitter import RecursiveCharacterTextSplitter
42
+ from langchain_community.retrievers import BM25Retriever
43
+
44
+ knowledge_base = datasets.load_dataset("m-ric/huggingface_doc", split="train")
45
+ knowledge_base = knowledge_base.filter(lambda row: row["source"].startswith("huggingface/transformers"))
46
+
47
+ source_docs = [
48
+ Document(page_content=doc["text"], metadata={"source": doc["source"].split("/")[1]})
49
+ for doc in knowledge_base
50
+ ]
51
+
52
+ text_splitter = RecursiveCharacterTextSplitter(
53
+ chunk_size=500,
54
+ chunk_overlap=50,
55
+ add_start_index=True,
56
+ strip_whitespace=True,
57
+ separators=["\n\n", "\n", ".", " ", ""],
58
+ )
59
+ docs_processed = text_splitter.split_documents(source_docs)
60
+ ```
61
+
62
+ अब डॉक्यूमेंट्स तैयार हैं।
63
+
64
+ तो चलिए अपना एजेंटिक RAG सिस्टम बनाएं!
65
+
66
+ 👉 हमें केवल एक RetrieverTool की आवश्यकता है जिसका उपयोग हमारा एजेंट नॉलेज बेस से जानकारी प्राप्त करने के लिए कर सकता है।
67
+
68
+ चूंकि हमें टूल के एट्रीब्यूट के रूप में एक vectordb जोड़ने की आवश्यकता है, हम सरल टूल कंस्ट्रक्टर को `@tool` डेकोरेटर के साथ सीधे उपयोग नहीं कर सकते: इसलिए हम [tools tutorial](../tutorials/tools) में हाइलाइट किए गए सेटअप का पालन करेंगे।
69
+
70
+ ```py
71
+ from smolagents import Tool
72
+
73
+ class RetrieverTool(Tool):
74
+ name = "retriever"
75
+ description = "Uses semantic search to retrieve the parts of transformers documentation that could be most relevant to answer your query."
76
+ inputs = {
77
+ "query": {
78
+ "type": "string",
79
+ "description": "The query to perform. This should be semantically close to your target documents. Use the affirmative form rather than a question.",
80
+ }
81
+ }
82
+ output_type = "string"
83
+
84
+ def __init__(self, docs, **kwargs):
85
+ super().__init__(**kwargs)
86
+ self.retriever = BM25Retriever.from_documents(
87
+ docs, k=10
88
+ )
89
+
90
+ def forward(self, query: str) -> str:
91
+ assert isinstance(query, str), "Your search query must be a string"
92
+
93
+ docs = self.retriever.invoke(
94
+ query,
95
+ )
96
+ return "\nRetrieved documents:\n" + "".join(
97
+ [
98
+ f"\n\n===== Document {str(i)} =====\n" + doc.page_content
99
+ for i, doc in enumerate(docs)
100
+ ]
101
+ )
102
+
103
+ retriever_tool = RetrieverTool(docs_processed)
104
+ ```
105
+ हमने BM25 का उपयोग किया है, जो एक क्लासिक रिट्रीवल विधि है, क्योंकि इसे सेटअप करना बहुत आसान है।
106
+ रिट्रीवल सटीकता में सुधार करने के लिए, आप BM25 को डॉक्यूमेंट्स के लिए वेक्टर प्रतिनिधित्व का उपयोग करके सिमेंटिक खोज से बदल सकते हैं: इस प्रकार आप एक अच्छा एम्बेडिंग मॉडल चुनने के लिए [MTEB Leaderboard](https://huggingface.co/spaces/mteb/leaderboard) पर जा सकते हैं।
107
+
108
+ अब यह सीधा है कि एक एजेंट बनाया जाए जो इस `retriever_tool` का उपयोग करेगा!
109
+
110
+
111
+ एजेंट को इनिशियलाइजेशन पर इन आर्गुमेंट्स की आवश्यकता होगी:
112
+ - `tools`: टूल्स की एक सूची जिन्हें एजेंट कॉल कर सकेगा।
113
+ - `model`: LLM जो एजेंट को पावर देता है।
114
+ हमारा `model` एक कॉलेबल होना चाहिए जो इनपुट के रूप में संदेशों की एक सूची लेता है और टेक्स्ट लौटाता है। इसे एक stop_sequences आर्गुमेंट भी स्वीकार करने की आवश्यकता है जो बताता है कि जनरेशन कब रोकनी है। सुविधा के लिए, हम सीधे पैकेज में प्रदान की गई HfEngine क्लास का उपयोग करते हैं ताकि एक LLM इंजन मिल सके जो Hugging Face के Inference API को कॉल करता है।
115
+
116
+ और हम [meta-llama/Llama-3.3-70B-Instruct](meta-llama/Llama-3.3-70B-Instruct) का उपयोग llm इंजन के रूप में करते हैं क्योंकि:
117
+ - इसमें लंबा 128k कॉन्टेक्स्ट है, जो लंबे स्रोत दस्तावेजों को प्रोसेस करने में मददगार है
118
+ - यह हर समय HF के Inference API पर मुफ्त में उपलब्ध है!
119
+
120
+ _नोट:_ Inference API विभिन्न मानदंडों के आधार पर मॉडल होस्ट करता है, और डिप्लॉय किए गए मॉडल बिना पूर्व सूचना के अपडेट या बदले जा सकते हैं। इसके बारे में अधिक जानें [यहां](https://huggingface.co/docs/api-inference/supported-models) पढ़ें।
121
+
122
+ ```py
123
+ from smolagents import InferenceClientModel, CodeAgent
124
+
125
+ agent = CodeAgent(
126
+ tools=[retriever_tool], model=InferenceClientModel(model_id="meta-llama/Llama-3.3-70B-Instruct"), max_steps=4, verbosity_level=2
127
+ )
128
+ ```
129
+
130
+ CodeAgent को इनिशियलाइज करने पर, इसे स्वचालित रूप से एक डिफ़ॉल्ट सिस्टम प्रॉम्प्ट दिया गया है जो LLM इंजन को चरण-दर-चरण प्रोसेस करने और कोड स्निपेट्स के रूप में टूल कॉल जनरेट करने के लिए कहता है, लेकिन आप आवश्यकतानुसार इस प्रॉम्प्ट टेम्पलेट को अपने से बदल सकते हैं।
131
+
132
+ जब CodeAgent का `.run()` मेथड लॉन्च किया जाता है, तो एजेंट LLM इंजन को कॉल करने का कार्य करता है, और टूल कॉल्स को निष्पादित करता है, यह सब एक लूप में होता है, जो तब तक चलता है जब तक टूल final_answer के साथ अंतिम उत्तर के रूप में नहीं बुलाया जाता।
133
+
134
+ ```py
135
+ agent_output = agent.run("For a transformers model training, which is slower, the forward or the backward pass?")
136
+
137
+ print("Final output:")
138
+ print(agent_output)
139
+ ```
140
+
141
+
docs/source/hi/examples/text_to_sql.md ADDED
@@ -0,0 +1,188 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Text-to-SQL
2
+
3
+ [[open-in-colab]]
4
+
5
+ इस ट्यूटोरियल में, हम देखेंगे कि कैसे `smolagents` का उपयोग करके एक एजेंट को SQL का उपयोग करने के लिए लागू किया जा सकता है।
6
+
7
+ > आइए सबसे महत्वपूर्ण प्रश्न से शुरू करें: इसे साधारण क्यों नहीं रखें और एक सामान्य text-to-SQL पाइपलाइन का उपयोग करें?
8
+
9
+ एक सामान्य text-to-SQL पाइपलाइन कमजोर होती है, क्योंकि उत्पन्न SQL क्वेरी गलत हो सकती है। इससे भी बुरी बात यह है कि क्वेरी गलत हो सकती है, लेकिन कोई एरर नहीं दिखाएगी, बल्कि बिना किसी अलार्म के गलत/बेकार आउटपुट दे सकती है।
10
+
11
+
12
+ 👉 इसके बजाय, एक एजेंट सिस्टम आउटपुट का गंभीरता से निरीक्षण कर सकता है और तय कर सकता है कि क्वेरी को बदलने की जरूरत है या नहीं, इस प्रकार इसे बेहतर प्रदर्शन में मदद मिलती है।
13
+
14
+ आइए इस एजेंट को बनाएं! 💪
15
+
16
+ पहले, हम SQL एनवायरनमेंट सेटअप करते हैं:
17
+ ```py
18
+ from sqlalchemy import (
19
+ create_engine,
20
+ MetaData,
21
+ Table,
22
+ Column,
23
+ String,
24
+ Integer,
25
+ Float,
26
+ insert,
27
+ inspect,
28
+ text,
29
+ )
30
+
31
+ engine = create_engine("sqlite:///:memory:")
32
+ metadata_obj = MetaData()
33
+
34
+ # create city SQL table
35
+ table_name = "receipts"
36
+ receipts = Table(
37
+ table_name,
38
+ metadata_obj,
39
+ Column("receipt_id", Integer, primary_key=True),
40
+ Column("customer_name", String(16), primary_key=True),
41
+ Column("price", Float),
42
+ Column("tip", Float),
43
+ )
44
+ metadata_obj.create_all(engine)
45
+
46
+ rows = [
47
+ {"receipt_id": 1, "customer_name": "Alan Payne", "price": 12.06, "tip": 1.20},
48
+ {"receipt_id": 2, "customer_name": "Alex Mason", "price": 23.86, "tip": 0.24},
49
+ {"receipt_id": 3, "customer_name": "Woodrow Wilson", "price": 53.43, "tip": 5.43},
50
+ {"receipt_id": 4, "customer_name": "Margaret James", "price": 21.11, "tip": 1.00},
51
+ ]
52
+ for row in rows:
53
+ stmt = insert(receipts).values(**row)
54
+ with engine.begin() as connection:
55
+ cursor = connection.execute(stmt)
56
+ ```
57
+
58
+ ### Agent बनाएं
59
+
60
+ अब आइए हमारी SQL टेबल को एक टूल द्वारा पुनर्प्राप्त करने योग्य बनाएं।
61
+
62
+ टूल का विवरण विशेषता एजेंट सिस्टम द्वारा LLM के prompt में एम्बेड किया जाएगा: यह LLM को टूल का उपयोग करने के बारे में जानकारी देता है। यहीं पर हम SQL टेबल का वर्णन करना चाहते हैं।
63
+
64
+ ```py
65
+ inspector = inspect(engine)
66
+ columns_info = [(col["name"], col["type"]) for col in inspector.get_columns("receipts")]
67
+
68
+ table_description = "Columns:\n" + "\n".join([f" - {name}: {col_type}" for name, col_type in columns_info])
69
+ print(table_description)
70
+ ```
71
+
72
+ ```text
73
+ Columns:
74
+ - receipt_id: INTEGER
75
+ - customer_name: VARCHAR(16)
76
+ - price: FLOAT
77
+ - tip: FLOAT
78
+ ```
79
+
80
+ अब आइए हमारा टूल बनाएं। इसे निम्नलिखित की आवश्यकता है: (अधिक जानकारी के लिए [टूल doc](../tutorials/tools) पढ़ें)
81
+ - एक डॉकस्ट्रिंग जिसमें आर्ग्युमेंट्स की सूची वाला `Args:` भाग हो।
82
+ - इनपुट और आउटपुट दोनों पर टाइप हिंट्स।
83
+
84
+ ```py
85
+ from smolagents import tool
86
+
87
+ @tool
88
+ def sql_engine(query: str) -> str:
89
+ """
90
+ Allows you to perform SQL queries on the table. Returns a string representation of the result.
91
+ The table is named 'receipts'. Its description is as follows:
92
+ Columns:
93
+ - receipt_id: INTEGER
94
+ - customer_name: VARCHAR(16)
95
+ - price: FLOAT
96
+ - tip: FLOAT
97
+
98
+ Args:
99
+ query: The query to perform. This should be correct SQL.
100
+ """
101
+ output = ""
102
+ with engine.connect() as con:
103
+ rows = con.execute(text(query))
104
+ for row in rows:
105
+ output += "\n" + str(row)
106
+ return output
107
+ ```
108
+
109
+ अब आइए एक ���जेंट बनाएं जो इस टूल का लाभ उठाता है।
110
+
111
+ हम `CodeAgent` का उपयोग करते हैं, जो smolagents का मुख्य एजेंट क्लास है: एक एजेंट जो कोड में एक्शन लिखता है और ReAct फ्रेमवर्क के अनुसार पिछले आउटपुट पर पुनरावृत्ति कर सकता है।
112
+
113
+ मॉडल वह LLM है जो एजेंट सिस्टम को संचालित करता है। `InferenceClientModel` आपको HF के Inference API का उपयोग करके LLM को कॉल करने की अनुमति देता है, या तो सर्वरलेस या डेडिकेटेड एंडपॉइंट के माध्यम से, लेकिन आप किसी भी प्रोप्राइटरी API का भी उपयोग कर सकते हैं।
114
+
115
+ ```py
116
+ from smolagents import CodeAgent, InferenceClientModel
117
+
118
+ agent = CodeAgent(
119
+ tools=[sql_engine],
120
+ model=InferenceClientModel(model_id="meta-llama/Meta-Llama-3.1-8B-Instruct"),
121
+ )
122
+ agent.run("Can you give me the name of the client who got the most expensive receipt?")
123
+ ```
124
+
125
+ ### लेवल 2: टेबल जॉइन्स
126
+
127
+ अब आइए इसे और चुनौतीपूर्ण बनाएं! हम चाहते हैं कि हमारा एजेंट कई टेबल्स के बीच जॉइन को संभाल सके।
128
+
129
+ तो आइए हम प्रत्येक receipt_id के लिए वेटर्स के नाम रिकॉर्ड करने वाली एक दूसरी टेबल बनाते हैं!
130
+
131
+ ```py
132
+ table_name = "waiters"
133
+ receipts = Table(
134
+ table_name,
135
+ metadata_obj,
136
+ Column("receipt_id", Integer, primary_key=True),
137
+ Column("waiter_name", String(16), primary_key=True),
138
+ )
139
+ metadata_obj.create_all(engine)
140
+
141
+ rows = [
142
+ {"receipt_id": 1, "waiter_name": "Corey Johnson"},
143
+ {"receipt_id": 2, "waiter_name": "Michael Watts"},
144
+ {"receipt_id": 3, "waiter_name": "Michael Watts"},
145
+ {"receipt_id": 4, "waiter_name": "Margaret James"},
146
+ ]
147
+ for row in rows:
148
+ stmt = insert(receipts).values(**row)
149
+ with engine.begin() as connection:
150
+ cursor = connection.execute(stmt)
151
+ ```
152
+ चूंकि हमने टेबल को बदल दिया है, हम LLM को इस टेबल की जानकारी का उचित उपयोग करने देने के लिए इस टेबल के विवरण के साथ `SQLExecutorTool` को अपडेट करते हैं।
153
+
154
+ ```py
155
+ updated_description = """Allows you to perform SQL queries on the table. Beware that this tool's output is a string representation of the execution output.
156
+ It can use the following tables:"""
157
+
158
+ inspector = inspect(engine)
159
+ for table in ["receipts", "waiters"]:
160
+ columns_info = [(col["name"], col["type"]) for col in inspector.get_columns(table)]
161
+
162
+ table_description = f"Table '{table}':\n"
163
+
164
+ table_description += "Columns:\n" + "\n".join([f" - {name}: {col_type}" for name, col_type in columns_info])
165
+ updated_description += "\n\n" + table_description
166
+
167
+ print(updated_description)
168
+ ```
169
+ चूंकि यह रिक्वेस्ट पिछले वाले से थोड़ी कठिन है, हम LLM इंजन को अधिक शक्तिशाली [Qwen/Qwen2.5-Coder-32B-Instruct](https://huggingface.co/Qwen/Qwen2.5-Coder-32B-Instruct) का उपयोग करने के लिए स्विच करेंगे!
170
+
171
+ ```py
172
+ sql_engine.description = updated_description
173
+
174
+ agent = CodeAgent(
175
+ tools=[sql_engine],
176
+ model=InferenceClientModel(model_id="Qwen/Qwen2.5-Coder-32B-Instruct"),
177
+ )
178
+
179
+ agent.run("Which waiter got more total money from tips?")
180
+ ```
181
+ यह सीधे काम करता है! सेटअप आश्चर्यजनक रूप से सरल था, है ना?
182
+
183
+ यह उदाहरण पूरा हो गया! हमने इन अवधारणाओं को छुआ है:
184
+ - नए टूल्स का निर्माण।
185
+ - टूल के विवरण को अपडेट करना।
186
+ - एक मजबूत LLM में स्विच करने से एजेंट की तर्कशक्ति में मदद मिलती है।
187
+
188
+ ✅ अब आप वह text-to-SQL सिस्टम बना सकते हैं जिसका आपने हमेशा सपना देखा है! ✨