LangChain Skills ਮੋਡ ਪ੍ਰੈਕਟਿਸ: ਮੰਗ 'ਤੇ ਗਿਆਨ ਲੋਡ ਕਰਨ ਵਾਲਾ SQL ਸਹਾਇਕ ਬਣਾਉਣਾ

2/13/2026
9 min read
ਪਿਛਲੇ ਲੇਖ ਵਿੱਚ, ਅਸੀਂ ਖੋਜ ਕੀਤੀ ਸੀ ਕਿ ਡੀਪ ਏਜੰਟਸ CLI ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਡੀਪ ਏਜੰਟ ਦੁਆਰਾ ਹੁਨਰਾਂ ਦੀ ਵਰਤੋਂ ਦੇ ਪੈਟਰਨ ਦੀ ਨਕਲ ਕਿਵੇਂ ਕਰੀਏ। ਅੱਜਕੱਲ੍ਹ, ਲੈਂਗਚੇਨ ਨੇ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਲਈ ਮੂਲ ਰੂਪ ਵਿੱਚ ਸਮਰਥਨ ਕੀਤਾ ਹੈ, ਜਿਸ ਨਾਲ ਵਿਕਾਸ ਪ੍ਰਕਿਰਿਆ ਬਹੁਤ ਸਰਲ ਹੋ ਗਈ ਹੈ। ਇਹ ਲੇਖ ਇਸ ਫੰਕਸ਼ਨੈਲਿਟੀ ਦਾ ਡੂੰਘਾਈ ਨਾਲ ਅਨੁਭਵ ਕਰਨ ਅਤੇ ਇੱਕ ਵਧੇਰੇ ਬੁੱਧੀਮਾਨ SQL ਸਹਾਇਕ ਬਣਾਉਣ ਲਈ ਤੁਹਾਡੀ ਅਗਵਾਈ ਕਰੇਗਾ। ਜਦੋਂ ਇੱਕ ਗੁੰਝਲਦਾਰ AI ਏਜੰਟ ਬਣਾਉਂਦੇ ਹੋ, ਤਾਂ ਡਿਵੈਲਪਰ ਅਕਸਰ ਇੱਕ ਦੁਬਿਧਾ ਵਿੱਚ ਫਸ ਜਾਂਦੇ ਹਨ: ਕੀ ਸਾਰੇ ਸੰਦਰਭ (ਡਾਟਾਬੇਸ ਟੇਬਲ ਢਾਂਚਾ, API ਦਸਤਾਵੇਜ਼, ਕਾਰੋਬਾਰੀ ਨਿਯਮ) ਨੂੰ ਇੱਕ ਵਾਰ ਸਿਸਟਮ ਪ੍ਰੋਂਪਟ ਵਿੱਚ ਇੰਜੈਕਟ ਕਰਨਾ ਹੈ, ਜਿਸ ਨਾਲ ਸੰਦਰਭ ਵਿੰਡੋ (Context Window) ਓਵਰਫਲੋ ਹੋ ਜਾਂਦੀ ਹੈ ਅਤੇ ਮਾਡਲ ਦਾ ਧਿਆਨ ਭਟਕ ਜਾਂਦਾ ਹੈ? ਜਾਂ ਕੀ ਮਹਿੰਗੀ ਵਾਰ-ਵਾਰ ਫਾਈਨ-ਟਿਊਨਿੰਗ (Fine-tuning) ਦੀ ਚੋਣ ਕਰਨੀ ਹੈ? **ਹੁਨਰ ਮੋਡ (Skills Pattern)** ਇੱਕ ਸ਼ਾਨਦਾਰ ਵਿਚਕਾਰਲਾ ਰਸਤਾ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ। ਇਹ ਲੋੜੀਂਦੇ ਗਿਆਨ ਨੂੰ ਗਤੀਸ਼ੀਲ ਰੂਪ ਵਿੱਚ ਲੋਡ ਕਰਕੇ ਸੰਦਰਭ ਦੀ ਕੁਸ਼ਲ ਵਰਤੋਂ ਨੂੰ ਪ੍ਰਾਪਤ ਕਰਦਾ ਹੈ। ਇਸ ਮੋਡ ਲਈ ਲੈਂਗਚੇਨ ਦਾ ਮੂਲ ਸਮਰਥਨ ਦਾ ਮਤਲਬ ਹੈ ਕਿ ਅਸੀਂ "ਮੰਗ 'ਤੇ ਸਿੱਖਣ" ਸਮਰੱਥਾ ਵਾਲੇ ਏਜੰਟ ਨੂੰ ਆਸਾਨੀ ਨਾਲ ਬਣਾ ਸਕਦੇ ਹਾਂ। ਇਹ ਲੇਖ ਅਧਿਕਾਰਤ ਦਸਤਾਵੇਜ਼ Build a SQL assistant with on-demand skills ਦੇ ਨਾਲ ਮਿਲ ਕੇ, ਪਾਠਕਾਂ ਨੂੰ ਸ਼ੁਰੂ ਤੋਂ ਹੀ ਇੱਕ SQL ਸਹਾਇਕ ਬਣਾਉਣ ਲਈ ਮਾਰਗਦਰਸ਼ਨ ਕਰੇਗਾ ਜੋ "ਮੰਗ 'ਤੇ ਗਿਆਨ ਲੋਡ ਕਰਨ" ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ। ## **1. ਮੁੱਖ ਸੰਕਲਪ: ਹੁਨਰ ਮੋਡ ਕਿਉਂ ਚੁਣੋ?** ### **ਰਵਾਇਤੀ SQL ਏਜੰਟ ਦੀਆਂ ਸੀਮਾਵਾਂ** ਰਵਾਇਤੀ SQL ਏਜੰਟ ਆਰਕੀਟੈਕਚਰ ਵਿੱਚ, ਸਾਨੂੰ ਆਮ ਤੌਰ 'ਤੇ ਸਿਸਟਮ ਪ੍ਰੋਂਪਟ ਵਿੱਚ ਪੂਰਾ ਡਾਟਾਬੇਸ ਸਕੀਮਾ ਪ੍ਰਦਾਨ ਕਰਨ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ। ਕਾਰੋਬਾਰ ਦੇ ਵਿਕਾਸ ਦੇ ਨਾਲ, ਜਦੋਂ ਟੇਬਲਾਂ ਦੀ ਗਿਣਤੀ ਸੈਂਕੜੇ ਤੱਕ ਵੱਧ ਜਾਂਦੀ ਹੈ, ਤਾਂ ਇਹ ਵਿਧੀ ਮਹੱਤਵਪੂਰਨ ਸਮੱਸਿਆਵਾਂ ਲਿਆਉਂਦੀ ਹੈ: - **ਟੋਕਨ ਦੀ ਵੱਡੀ ਖਪਤ: ਹਰ ਗੱਲਬਾਤ ਬਹੁਤ ਸਾਰੇ ਗੈਰ-ਸੰਬੰਧਿਤ ਟੇਬਲ ਢਾਂਚਿਆਂ ਨੂੰ ਲੈ ਕੇ ਜਾਂਦੀ ਹੈ, ਜਿਸ ਨਾਲ ਸਰੋਤਾਂ ਦੀ ਬਰਬਾਦੀ ਹੁੰਦੀ ਹੈ।** - **ਭਰਮ ਦੇ ਜੋਖਮ ਵਿੱਚ ਵਾਧਾ: ਬਹੁਤ ਜ਼ਿਆਦਾ ਗੈਰ-ਸੰਬੰਧਿਤ ਦਖਲਅੰਦਾਜ਼ੀ ਜਾਣਕਾਰੀ ਮਾਡਲ ਦੀ ਤਰਕਸ਼ੀਲਤਾ ਦੀ ਸ਼ੁੱਧਤਾ ਨੂੰ ਘਟਾ ਦੇਵੇਗੀ।** - **ਸੰਭਾਲ ਵਿੱਚ ਮੁਸ਼ਕਲ: ਸਾਰੇ ਕਾਰੋਬਾਰੀ ਲਾਈਨਾਂ ਦਾ ਗਿਆਨ ਇੱਕ ਦੂਜੇ ਨਾਲ ਜੁੜਿਆ ਹੋਇਆ ਹੈ, ਜਿਸ ਨਾਲ ਸੁਤੰਤਰ ਰੂਪ ਵਿੱਚ ਦੁਹਰਾਉਣਾ ਮੁਸ਼ਕਲ ਹੋ ਜਾਂਦਾ ਹੈ।** ### **ਹੁਨਰ ਮੋਡ: ਹੌਲੀ-ਹੌਲੀ ਖੁਲਾਸੇ 'ਤੇ ਅਧਾਰਤ ਹੱਲ** ਹੁਨਰ ਮੋਡ **ਹੌਲੀ-ਹੌਲੀ ਖੁਲਾਸੇ (Progressive Disclosure)** ਦੇ ਸਿਧਾਂਤ 'ਤੇ ਅਧਾਰਤ ਹੈ, ਅਤੇ ਗਿਆਨ ਪ੍ਰਾਪਤੀ ਦੀ ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਲੇਅਰਾਂ ਵਿੱਚ ਵੰਡਦਾ ਹੈ: - **ਏਜੰਟ ਦੀ ਸ਼ੁਰੂਆਤੀ ਸਥਿਤੀ: ਸਿਰਫ ਇਹ ਜਾਣਨਾ ਕਿ ਕਿਹੜੇ "ਹੁਨਰ" (Skills) ਹਨ ਅਤੇ ਉਹਨਾਂ ਦਾ ਸੰਖੇਪ ਵਰਣਨ (Description), ਹਲਕਾ ਰੱਖਣਾ।** - **ਰਨਟਾਈਮ ਲੋਡਿੰਗ: ਜਦੋਂ ਕਿਸੇ ਖਾਸ ਸਮੱਸਿਆ (ਜਿਵੇਂ ਕਿ "ਇਨਵੈਂਟਰੀ ਦੀ ਪੁੱਛਗਿੱਛ") ਦਾ ਸਾਹਮਣਾ ਕਰਨਾ ਪੈਂਦਾ ਹੈ, ਤਾਂ ਏਜੰਟ ਸਰਗਰਮੀ ਨਾਲ ਟੂਲ (**`load_skill`**) ਨੂੰ ਲੋਡ ਕਰਦਾ ਹੈ ਅਤੇ ਉਸ ਹੁਨਰ ਦੇ ਵਿਸਤ੍ਰਿਤ ਸੰਦਰਭ (Schema + Prompt) ਨੂੰ ਲੋਡ ਕਰਦਾ ਹੈ।** - **ਟਾਸਕ ਨੂੰ ਲਾਗੂ ਕਰਨਾ: ਲੋਡ ਕੀਤੇ ਗਏ ਸਹੀ ਸੰਦਰਭ ਦੇ ਅਧਾਰ ਤੇ, ਖਾਸ ਟਾਸਕ ਨੂੰ ਲਾਗੂ ਕਰੋ (ਜਿਵੇਂ ਕਿ SQL ਲਿਖਣਾ ਅਤੇ ਲਾਗੂ ਕਰਨਾ)।** ਇਹ ਮੋਡ ਪ੍ਰਭਾਵਸ਼ਾਲੀ ਢੰਗ ਨਾਲ **ਬੇਅੰਤ ਵਿਸਥਾਰ** ਅਤੇ **ਟੀਮ ਡੀਕਪਲਿੰਗ** ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਏਜੰਟ ਵਧਦੀ ਗੁੰਝਲਦਾਰ ਕਾਰੋਬਾਰੀ ਦ੍ਰਿਸ਼ਾਂ ਦੇ ਅਨੁਕੂਲ ਹੋਣ ਦੇ ਯੋਗ ਹੋ ਜਾਂਦਾ ਹੈ। ## **2. ਸਿਸਟਮ ਆਰਕੀਟੈਕਚਰ ਡਿਜ਼ਾਈਨ** ਇਹ ਅਭਿਆਸ ਪ੍ਰੋਜੈਕਟ ਇੱਕ SQL ਸਹਾਇਕ ਬਣਾਏਗਾ ਜਿਸ ਵਿੱਚ ਦੋ ਮੁੱਖ ਹੁਨਰ ਸ਼ਾਮਲ ਹਨ, ਇਸ ਮੋਡ ਦੀ ਅਸਲ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਦਰਸਾਉਣ ਲਈ: - **Sales Analytics (ਵਿਕਰੀ ਵਿਸ਼ਲੇਸ਼ਣ):**`sales_data`**ਟੇਬਲ ਲਈ ਜ਼ਿੰਮੇਵਾਰ, ਆਮਦਨ ਦੇ ਅੰਕੜਿਆਂ, ਆਰਡਰ ਰੁਝਾਨ ਵਿਸ਼ਲੇਸ਼ਣ ਆਦਿ ਨਾਲ ਨਜਿੱਠਣਾ।** - **Inventory Management (ਇਨਵੈਂਟਰੀ ਪ੍ਰਬੰਧਨ):**`inventory_items`**ਟੇਬਲ ਲਈ ਜ਼ਿੰਮੇਵਾਰ, ਇਨਵੈਂਟਰੀ ਪੱਧਰ ਦੀ ਨਿਗਰਾਨੀ, ਸਥਾਨ ਪੁੱਛਗਿੱਛ ਆਦਿ ਨਾਲ ਨਜਿੱਠਣਾ।** ## **3. ਵਿਕਾਸ ਵਾਤਾਵਰਣ ਸਥਾਪਨਾ** ਇਹ ਪ੍ਰੋਜੈਕਟ ਕੁਸ਼ਲ ਨਿਰਭਰਤਾ ਪ੍ਰਬੰਧਨ ਲਈ Python`uv`ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ। ### **ਮੁੱਖ ਨਿਰਭਰਤਾ ਸਥਾਪਨਾ** `uv add langchain langchain-openai langgraph psycopg2-binary python-dotenv langchain-community` ### **PostgreSQL ਵਾਤਾਵਰਣ ਸੰਰਚਨਾ** ਇੱਕ ਸਥਾਨਕ Postgres ਉਦਾਹਰਣ ਸ਼ੁਰੂ ਕਰੋ, ਅਤੇ`agent_platform`ਡਾਟਾਬੇਸ ਬਣਾਓ। ਅਸੀਂ ਟੇਬਲ ਢਾਂਚੇ ਅਤੇ ਟੈਸਟ ਡੇਟਾ ਨੂੰ ਆਪਣੇ ਆਪ ਸ਼ੁਰੂ ਕਰਨ ਲਈ`setup_db.py`ਸਕ੍ਰਿਪਟ ਪ੍ਰਦਾਨ ਕਰਦੇ ਹਾਂ (ਵੇਰਵਿਆਂ ਲਈ ਲੇਖ ਦੇ ਅੰਤ ਵਿੱਚ ਸਰੋਤ ਕੋਡ ਦੇਖੋ)। ## **4. ਮੁੱਖ ਲਾਗੂ ਕਰਨ ਦੇ ਕਦਮਾਂ ਦੀ ਵਿਸਤ੍ਰਿਤ ਵਿਆਖਿਆ**### **ਕਦਮ ਇੱਕ: ਡੋਮੇਨ ਸਕਿੱਲਜ਼ ਨੂੰ ਪਰਿਭਾਸ਼ਿਤ ਕਰਨਾ (The Knowledge)** ਅਸੀਂ ਸਕਿੱਲਜ਼ ਨੂੰ ਇੱਕ ਡਿਕਸ਼ਨਰੀ ਢਾਂਚੇ ਵਜੋਂ ਪਰਿਭਾਸ਼ਿਤ ਕਰਾਂਗੇ, ਫਾਈਲ ਸਿਸਟਮ ਜਾਂ ਡੇਟਾਬੇਸ ਤੋਂ ਲੋਡ ਕਰਨ ਦੀ ਪ੍ਰਕਿਰਿਆ ਦੀ ਨਕਲ ਕਰਦੇ ਹੋਏ। ਕਿਰਪਾ ਕਰਕੇ `description` (ਏਜੰਟ ਦੁਆਰਾ ਫੈਸਲਾ ਲੈਣ ਲਈ ਵਰਤੀ ਜਾਂਦੀ ਹੈ) ਅਤੇ `content` (ਅਸਲ ਵਿੱਚ ਲੋਡ ਕੀਤੇ ਗਏ ਵਿਸਤ੍ਰਿਤ ਸੰਦਰਭ) ਵਿੱਚ ਅੰਤਰ ਕਰੋ। `SKILLS = {"sales_analytics": {"description":"Useful for analyzing sales revenue, trends...","content":"""... Table Schema: sales_data ..."" },"inventory_management": {"description":"Useful for checking stock levels...","content":"""... Table Schema: inventory_items ..."" }}` ### **ਕਦਮ ਦੋ: ਮੁੱਖ ਟੂਲਜ਼ ਨੂੰ ਲਾਗੂ ਕਰਨਾ (The Capabilities)** ਏਜੰਟ ਨੂੰ ਕੰਮ ਪੂਰਾ ਕਰਨ ਲਈ ਦੋ ਮੁੱਖ ਟੂਲਜ਼ 'ਤੇ ਨਿਰਭਰ ਕਰਨਾ ਪੈਂਦਾ ਹੈ: - `load_skill(skill_name)`**: ਰਨਟਾਈਮ 'ਤੇ ਨਿਰਧਾਰਤ ਸਕਿੱਲ ਦੇ ਵੇਰਵਿਆਂ ਨੂੰ ਗਤੀਸ਼ੀਲ ਰੂਪ ਵਿੱਚ ਲੋਡ ਕਰਦਾ ਹੈ।** - `run_sql_query(query)`**: ਖਾਸ SQL ਸਟੇਟਮੈਂਟ ਨੂੰ ਚਲਾਉਂਦਾ ਹੈ।** ### **ਕਦਮ ਤਿੰਨ: ਏਜੰਟ ਲਾਜਿਕ ਨੂੰ ਵਿਵਸਥਿਤ ਕਰਨਾ (The Brain)** LangGraph ਦੀ ਵਰਤੋਂ ਕਰਕੇ ReAct ਏਜੰਟ ਬਣਾਓ। ਸਿਸਟਮ ਪ੍ਰੋਂਪਟ ਇੱਥੇ ਇੱਕ ਮਹੱਤਵਪੂਰਨ ਭੂਮਿਕਾ ਨਿਭਾਉਂਦਾ ਹੈ, ਇਹ ਏਜੰਟ ਨੂੰ `Identify -> Load -> Query` ਦੇ ਸਟੈਂਡਰਡ ਓਪਰੇਟਿੰਗ ਪ੍ਰੋਸੀਜਰ (SOP) ਦੀ ਸਖਤੀ ਨਾਲ ਪਾਲਣਾ ਕਰਨ ਲਈ ਮਾਰਗਦਰਸ਼ਨ ਕਰਦਾ ਹੈ। `system_prompt ="""1. Identify the relevant skill.2. Use 'load_skill' to get schema.3. Write and execute SQL using 'run_sql_query'....Do not guess table names. Always load the skill first."""` ## **5. ਰਨਿੰਗ ਇਫੈਕਟ ਵੈਰੀਫਿਕੇਸ਼ਨ** `test_agent.py` ਚਲਾ ਕੇ, ਅਸੀਂ ਸੇਲਜ਼ ਅਤੇ ਇਨਵੈਂਟਰੀ ਦੇ ਦੋ ਵੱਖ-ਵੱਖ ਖੇਤਰਾਂ ਲਈ ਕੁਐਰੀਆਂ ਦੀ ਜਾਂਚ ਕੀਤੀ। ਹੇਠਾਂ ਕੰਸੋਲ ਦਾ ਅਸਲ ਆਉਟਪੁੱਟ ਲੌਗ ਹੈ, ਜੋ ਦਰਸਾਉਂਦਾ ਹੈ ਕਿ ਏਜੰਟ ਸਵਾਲ ਦੇ ਅਧਾਰ 'ਤੇ ਸਕਿੱਲ ਨੂੰ ਗਤੀਸ਼ੀਲ ਰੂਪ ਵਿੱਚ ਕਿਵੇਂ ਲੋਡ ਕਰਦਾ ਹੈ: `Testing Sales Query...Agent calling tools: [{'name': 'load_skill', 'args': {'skill_name': 'sales_analytics'}, 'id': 'call_f270d76b7ce4404cb5f61bf2', 'type': 'tool_call'}]Tool output:You are a Sales Analytics Expert.You have access to the 'sales_data' table.Table Schema:- id: integer...Agent calling tools: [{'name': 'run_sql_query', 'args': {'query': 'SELECT SUM(amount) as total_revenue FROM sales_data;'}, 'id': 'call_b4f3e686cc7f4f22b3bb9ea7', 'type': 'tool_call'}]Tool output: [(Decimal('730.50'),)]...Agent response: The total revenue is $730.50.Testing Inventory Query...Agent calling tools: [{'name': 'load_skill', 'args': {'skill_name': 'inventory_management'}, 'id': 'call_18c823b2d5064e95a0cfe2e3', 'type': 'tool_call'}]Tool output:You are an Inventory Management Expert.You have access to the 'inventory_items' table.Table Schema...Agent calling tools: [{'name': 'run_sql_query', 'args': {'query': "SELECT warehouse_location FROM inventory_items WHERE product_name = 'Laptop';"}, 'id': 'call_647ee3a444804bd98a045f00', 'type': 'tool_call'}]Tool output: [('Warehouse A',)]...Agent response: The Laptop is located in **Warehouse A**.`## **6. ਪੂਰਾ ਸੋਰਸ ਕੋਡ ਰੈਫਰੈਂਸ** ਇਹ ਪ੍ਰੋਜੈਕਟ ਦਾ ਪੂਰਾ ਸੋਰਸ ਕੋਡ ਹੈ, ਜਿਸ ਵਿੱਚ ਡਾਟਾਬੇਸ ਇਨੀਸ਼ੀਅਲਾਈਜ਼ੇਸ਼ਨ ਸਕ੍ਰਿਪਟ ਅਤੇ ਏਜੰਟ ਮੁੱਖ ਪ੍ਰੋਗਰਾਮ ਸ਼ਾਮਲ ਹਨ। ### **1. ਡਾਟਾਬੇਸ ਇਨੀਸ਼ੀਅਲਾਈਜ਼ੇਸ਼ਨ (setup_db.py)** `import psycopg2 from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT import os from dotenv import load_dotenv load_dotenv() # ਕਿਰਪਾ ਕਰਕੇ .env ਵਿੱਚ ਡਾਟਾਬੇਸ ਕਨੈਕਸ਼ਨ ਜਾਣਕਾਰੀ ਕੌਂਫਿਗਰ ਕਰੋ DB_HOST = os.getenv("DB_HOST", "localhost") DB_PORT = os.getenv("DB_PORT", "5432") DB_USER = os.getenv("DB_USER", "postgres") DB_PASSWORD = os.getenv("DB_PASSWORD", "your_password") # ਕਿਰਪਾ ਕਰਕੇ ਅਸਲ ਪਾਸਵਰਡ ਨਾਲ ਬਦਲੋ DB_NAME = os.getenv("DB_NAME", "agent_platform") def create_database(): try: # ਨਵਾਂ ਡੀਬੀ ਬਣਾਉਣ ਲਈ ਡਿਫਾਲਟ 'postgres' ਡਾਟਾਬੇਸ ਨਾਲ ਜੁੜੋ conn = psycopg2.connect( host=DB_HOST, port=DB_PORT, user=DB_USER, password=DB_PASSWORD, dbname="postgres" ) conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) cur = conn.cursor() # ਜਾਂਚ ਕਰੋ ਕਿ ਡਾਟਾਬੇਸ ਮੌਜੂਦ ਹੈ ਜਾਂ ਨਹੀਂ cur.execute(f"SELECT 1 FROM pg_catalog.pg_database WHERE datname = '{DB_NAME}'") exists = cur.fetchone() if not exists: print(f"Creating database {DB_NAME}...") cur.execute(f"CREATE DATABASE {DB_NAME}") else: print(f"Database {DB_NAME} already exists.") cur.close() conn.close() except Exception as e: print(f"Error creating database: {e}") def create_tables_and_data(): try: conn = psycopg2.connect( host=DB_HOST, port=DB_PORT, user=DB_USER, password=DB_PASSWORD, dbname=DB_NAME ) cur = conn.cursor() # ਸੇਲਜ਼ ਟੇਬਲ ਬਣਾਓ print("Creating sales_data table...") cur.execute(""" CREATE TABLE IF NOT EXISTS sales_data ( id SERIAL PRIMARY KEY, transaction_date DATE, product_id VARCHAR(50), amount DECIMAL(10, 2), region VARCHAR(50) ) """) # ਇਨਵੈਂਟਰੀ ਟੇਬਲ ਬਣਾਓ print("Creating inventory_items table...") cur.execute(""" CREATE TABLE IF NOT EXISTS inventory_items ( id SERIAL PRIMARY KEY, product_id VARCHAR(50), product_name VARCHAR(100), stock_count INTEGER, warehouse_location VARCHAR(50) ) """) # ਮੌਕ ਡਾਟਾ ਪਾਓ print("Inserting mock data...") cur.execute("TRUNCATE sales_data, inventory_items") sales_data = [ ('2023-01-01', 'P001', 100.00, 'North'), ('2023-01-02', 'P002', 150.50, 'South'), ('2023-01-03', 'P001', 120.00, 'East'), ('2023-01-04', 'P003', 200.00, 'West'), ('2023-01-05', 'P002', 160.00, 'North') ] cur.executemany("INSERT INTO sales_data (transaction_date, product_id, amount, region) VALUES (%s, %s, %s, %s)", sales_data ) inventory_data = [ ('P001', 'Laptop', 50, 'Warehouse A'), ('P002', 'Mouse', 200, 'Warehouse B'), ('P003', 'Keyboard', 150, 'Warehouse A'), ('P004', 'Monitor', 30, 'Warehouse C') ] cur.executemany("INSERT INTO inventory_items (product_id, product_name, stock_count, warehouse_location) VALUES (%s, %s, %s, %s)", inventory_data ) conn.commit() cur.close() conn.close() print("Database setup complete.") except Exception as e: print(f"Error setting up tables: {e}") if __name__ == "__main__": create_database() create_tables_and_data()`

**2. ਏਜੰਟ ਮੁੱਖ ਪ੍ਰੋਗਰਾਮ (main.py)**

`importosfromtypingimportAnnotated, Literal, TypedDict, Union, Dictfromdotenvimportload_dotenvfromlangchain_openaiimportChatOpenAIfromlangchain_core.toolsimporttoolfromlangchain_core.messagesimportSystemMessage, HumanMessage, AIMessage, ToolMessagefromlangchain_community.utilitiesimportSQLDatabasefromlangchain_community.agent_toolkitsimportSQLDatabaseToolkitfromlanggraph.graphimportStateGraph, START, END, MessagesStatefromlanggraph.prebuiltimportToolNode, tools_conditionload_dotenv()# --- Configuration ---BASE_URL = os.getenv("BASIC_MODEL_BASE_URL")API_KEY = os.getenv("BASIC_MODEL_API_KEY")MODEL_NAME = os.getenv("BASIC_MODEL_MODEL")DB_URI =f"postgresql://{os.getenv('DB_USER')}:{os.getenv('DB_PASSWORD')}@{os.getenv('DB_HOST')}:{os.getenv('DB_PORT')}/{os.getenv('DB_NAME')}"# --- Database Setup ---db = SQLDatabase.from_uri(DB_URI)# --- Skills Definition ---SKILLS: Dict[str, Dict[str, str]] = {"sales_analytics": {"description":"Useful for analyzing sales revenue, trends, and regional performance.","content":`ਤੁਸੀਂ ਇੱਕ ਸੇਲਜ਼ ਐਨਾਲਿਟਿਕਸ ਮਾਹਰ ਹੋ। ਤੁਹਾਡੇ ਕੋਲ 'sales_data' ਟੇਬਲ ਤੱਕ ਪਹੁੰਚ ਹੈ। ਟੇਬਲ ਸਕੀਮਾ: - id: integer (ਪ੍ਰਾਇਮਰੀ ਕੁੰਜੀ) - transaction_date: date - product_id: varchar(50) - amount: decimal(10, 2) - region: varchar(50) ਆਮ ਸਵਾਲ: - ਕੁੱਲ ਆਮਦਨ: SUM(amount) - ਖੇਤਰ ਦੁਆਰਾ ਆਮਦਨ: GROUP BY region - ਵਿਕਰੀ ਰੁਝਾਨ: GROUP BY transaction_date` },"inventory_management": {"description":"Useful for checking stock levels, product locations, and warehouse management.","content":`ਤੁਸੀਂ ਇੱਕ ਇਨਵੈਂਟਰੀ ਮੈਨੇਜਮੈਂਟ ਮਾਹਰ ਹੋ। ਤੁਹਾਡੇ ਕੋਲ 'inventory_item`s' table.Table Schema:- id: integer (primary key)- product_id: varchar(50)- product_name: varchar(100)- stock_count: integer- warehouse_location: varchar(50)Common queries:- Check stock: WHERE product_name = '...'- Low stock: WHERE stock_count < threshold""" }}# --- Tools ---@tooldefload_skill(skill_name: str)-> str:""" Load the detailed prompt and schema for a specific skill. Available skills: - sales_analytics: For sales, revenue, and transaction analysis. - inventory_management: For stock, products, and warehouse queries. """ skill = SKILLS.get(skill_name)ifnotskill:returnf"Error: Skill '{skill_name}' not found. Available skills:{list(SKILLS.keys())}"returnskill["content"]@tooldefrun_sql_query(query: str)-> str:""" Execute a SQL query against the database. Only use this tool AFTER loading the appropriate skill to understand the schema. """try:returndb.run(query)exceptExceptionase:returnf"Error executing SQL:{e}"@tooldeflist_tables()-> str:"""List all available tables in the database."""returnstr(db.get_usable_table_names())tools = [load_skill, run_sql_query, list_tables]# --- Agent Setup ---llm = ChatOpenAI( base_url=BASE_URL, api_key=API_KEY, model=MODEL_NAME, temperature=0)llm_with_tools = llm.bind_tools(tools)# --- Graph Definition ---classAgentState(MessagesState):# We can add custom state if needed, but MessagesState is sufficient for simple chatpassdefagent_node(state: AgentState): messages = state["messages"] response = llm_with_tools.invoke(messages)return{"messages": [response]}workflow = StateGraph(AgentState)workflow.add_node("agent", agent_node)workflow.add_node("tools", ToolNode(tools))workflow.add_edge(START,"agent")workflow.add_conditional_edges("agent", tools_condition)workflow.add_edge("tools","agent")app = workflow.compile()# --- ਮੁੱਖ ਐਗਜ਼ੀਕਿਊਸ਼ਨ ---if__name__ =="__main__": system_prompt ="""ਤੁਸੀਂ ਇੱਕ ਮਦਦਗਾਰ SQL ਸਹਾਇਕ ਹੋ।ਤੁਹਾਡੇ ਕੋਲ ਵਿਸ਼ੇਸ਼ ਹੁਨਰਾਂ ਤੱਕ ਪਹੁੰਚ ਹੈ ਜਿਸ ਵਿੱਚ ਡੇਟਾਬੇਸ ਸਕੀਮਾ ਅਤੇ ਡੋਮੇਨ ਗਿਆਨ ਸ਼ਾਮਲ ਹੈ।ਇੱਕ ਉਪਭੋਗਤਾ ਦੇ ਸਵਾਲ ਦਾ ਜਵਾਬ ਦੇਣ ਲਈ:1. ਸੰਬੰਧਿਤ ਹੁਨਰ (ਵਿਕਰੀ ਵਿਸ਼ਲੇਸ਼ਣ ਜਾਂ ਵਸਤੂ ਪ੍ਰਬੰਧਨ) ਦੀ ਪਛਾਣ ਕਰੋ।2. ਸਕੀਮਾ ਅਤੇ ਨਿਰਦੇਸ਼ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ 'load_skill' ਟੂਲ ਦੀ ਵਰਤੋਂ ਕਰੋ।3. ਲੋਡ ਕੀਤੇ ਹੁਨਰ ਦੇ ਆਧਾਰ 'ਤੇ, 'run_sql_query' ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਇੱਕ SQL ਕੁਐਰੀ ਲਿਖੋ ਅਤੇ ਚਲਾਓ।4. ਕੁਐਰੀ ਨਤੀਜਿਆਂ ਦੇ ਆਧਾਰ 'ਤੇ ਉਪਭੋਗਤਾ ਦੇ ਸਵਾਲ ਦਾ ਜਵਾਬ ਦਿਓ।ਟੇਬਲ ਨਾਮਾਂ ਦਾ ਅੰਦਾਜ਼ਾ ਨਾ ਲਗਾਓ। ਹਮੇਸ਼ਾ ਪਹਿਲਾਂ ਹੁਨਰ ਲੋਡ ਕਰੋ।""" print("SQL ਸਹਾਇਕ ਸ਼ੁਰੂ ਹੋ ਗਿਆ ਹੈ। ਬਾਹਰ ਜਾਣ ਲਈ 'quit' ਟਾਈਪ ਕਰੋ।") print("-"*50) messages = [SystemMessage(content=system_prompt)]# ਪ੍ਰੀ-ਵਾਰਮ ਕਨੈਕਸ਼ਨ ਜਾਂਚtry: print(f"ਡੇਟਾਬੇਸ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ:{DB_URI.split('@')[-1]}")exceptExceptionase: print(f"ਡੇਟਾਬੇਸ ਕਨੈਕਸ਼ਨ ਚੇਤਾਵਨੀ:{e}")whileTrue:try: user_input = input("ਉਪਭੋਗਤਾ: ")ifuser_input.lower()in["quit","exit"]:break messages.append(HumanMessage(content=user_input))# ਐਗਜ਼ੀਕਿਊਸ਼ਨ ਨੂੰ ਸਟ੍ਰੀਮ ਕਰੋ print("ਏਜੰਟ: ", end="", flush=True) final_response =Noneforeventinapp.stream({"messages": messages}, stream_mode="values"):# 'values' ਮੋਡ ਵਿੱਚ, ਸਾਨੂੰ ਪੂਰੀ ਸਥਿਤੀ ਮਿਲਦੀ ਹੈ। ਅਸੀਂ ਸਿਰਫ਼ ਆਖਰੀ ਸੁਨੇਹਾ ਦੇਖਣਾ ਚਾਹੁੰਦੇ ਹਾਂ ਜੇਕਰ ਇਹ ਨਵਾਂ ਹੈ। last_message = event["messages"][-1]# ਨਵੀਨਤਮ ਸਥਿਤੀ ਦੇ ਨਾਲ ਸਾਡੇ ਸੁਨੇਹਾ ਇਤਿਹਾਸ ਨੂੰ ਅੱਪਡੇਟ ਕਰੋpass# ਸਟ੍ਰੀਮ ਖਤਮ ਹੋਣ ਤੋਂ ਬਾਅਦ, ਆਖਰੀ ਸਥਿਤੀ ਵਿੱਚ ਅੰਤਿਮ ਜਵਾਬ ਹੁੰਦਾ ਹੈ final_state = app.invoke({"messages": messages}) last_msg = final_state["messages"][-1]ifisinstance(last_msg, AIMessage): print(last_msg.content) messages = final_state["messages"]# Update history print("-"*50)exceptExceptionase: print(f"\nError:{e}")break`
Published in Technology

You Might Also Like

ਕਿਵੇਂ ਕਲਾਉਡ ਕੰਪਿਊਟਿੰਗ ਤਕਨਾਲੋਜੀ ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਹੈ: ਤੁਹਾਡਾ ਪਹਿਲਾ ਕਲਾਉਡ ਢਾਂਚਾ ਬਣਾਉਣ ਲਈ ਪੂਰੀ ਗਾਈਡTechnology

ਕਿਵੇਂ ਕਲਾਉਡ ਕੰਪਿਊਟਿੰਗ ਤਕਨਾਲੋਜੀ ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਹੈ: ਤੁਹਾਡਾ ਪਹਿਲਾ ਕਲਾਉਡ ਢਾਂਚਾ ਬਣਾਉਣ ਲਈ ਪੂਰੀ ਗਾਈਡ

ਕਿਵੇਂ ਕਲਾਉਡ ਕੰਪਿਊਟਿੰਗ ਤਕਨਾਲੋਜੀ ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਹੈ: ਤੁਹਾਡਾ ਪਹਿਲਾ ਕਲਾਉਡ ਢਾਂਚਾ ਬਣਾਉਣ ਲਈ ਪੂਰੀ ਗਾਈਡ ਪ੍ਰਸਤਾਵਨਾ ਡਿਜੀਟਲ ਪਰਿਵਰਤਨ ਦੀ...

ਚੇਤਾਵਨੀ! Claude Code ਦੇ ਪਿਤਾ ਨੇ ਸਾਫ ਕਿਹਾ: 1 ਮਹੀਨੇ ਬਾਅਦ Plan Mode ਦੀ ਲੋੜ ਨਹੀਂ ਰਹੇਗੀ, ਸਾਫਟਵੇਅਰ ਇੰਜੀਨੀਅਰ ਦਾ ਖਿਤਾਬ ਗਾਇਬ ਹੋ ਜਾਵੇਗਾTechnology

ਚੇਤਾਵਨੀ! Claude Code ਦੇ ਪਿਤਾ ਨੇ ਸਾਫ ਕਿਹਾ: 1 ਮਹੀਨੇ ਬਾਅਦ Plan Mode ਦੀ ਲੋੜ ਨਹੀਂ ਰਹੇਗੀ, ਸਾਫਟਵੇਅਰ ਇੰਜੀਨੀਅਰ ਦਾ ਖਿਤਾਬ ਗਾਇਬ ਹੋ ਜਾਵੇਗਾ

ਚੇਤਾਵਨੀ! Claude Code ਦੇ ਪਿਤਾ ਨੇ ਸਾਫ ਕਿਹਾ: 1 ਮਹੀਨੇ ਬਾਅਦ Plan Mode ਦੀ ਲੋੜ ਨਹੀਂ ਰਹੇਗੀ, ਸਾਫਟਵੇਅਰ ਇੰਜੀਨੀਅਰ ਦਾ ਖਿਤਾਬ ਗਾਇਬ ਹੋ ਜ...

2026年 Top 10 深度学习资源推荐Technology

2026年 Top 10 深度学习资源推荐

2026年 Top 10 深度学习资源推荐 随着深度学习在各个领域的迅速发展,越来越多的学习资源和工具涌现出来。本文将为您推荐2026年最值得关注的十个深度学习资源,帮助您在这一领域中快速成长。 1. Coursera Deep Learn...

2026年 Top 10 AI 代理:核心卖点解析Technology

2026年 Top 10 AI 代理:核心卖点解析

2026年 Top 10 AI 代理:核心卖点解析 引言 人工智能 ਦੇ ਤੇਜ਼ ਵਿਕਾਸ ਦੇ ਨਾਲ, AI 代理 (AI Agents) ਤਕਨਾਲੋਜੀ ਖੇਤਰ ਵਿੱਚ ਇੱਕ ਗਰਮ ਵਿਸ਼ਾ ਬਣ ਗਏ ਹਨ। ਵਧੇ...

2026 ਦੇ Top 10 AI ਟੂਲ ਸਿਫਾਰਸ਼ਾਂ: ਕ੍ਰਿਤ੍ਰਿਮ ਬੁੱਧੀ ਦੀ ਅਸਲੀ ਸਮਰੱਥਾ ਨੂੰ ਖੋਲ੍ਹਣਾTechnology

2026 ਦੇ Top 10 AI ਟੂਲ ਸਿਫਾਰਸ਼ਾਂ: ਕ੍ਰਿਤ੍ਰਿਮ ਬੁੱਧੀ ਦੀ ਅਸਲੀ ਸਮਰੱਥਾ ਨੂੰ ਖੋਲ੍ਹਣਾ

2026 ਦੇ Top 10 AI ਟੂਲ ਸਿਫਾਰਸ਼ਾਂ: ਕ੍ਰਿਤ੍ਰਿਮ ਬੁੱਧੀ ਦੀ ਅਸਲੀ ਸਮਰੱਥਾ ਨੂੰ ਖੋਲ੍ਹਣਾ ਤਕਨਾਲੋਜੀ ਦੇ ਤੇਜ਼ੀ ਨਾਲ ਵਿਕਾਸ ਦੇ ਦੌਰ ਵਿੱਚ, ਕ੍ਰ...

2026年 Top 10 AWS工具和资源推荐Technology

2026年 Top 10 AWS工具和资源推荐

2026年 Top 10 AWS工具和资源推荐 在快速发展的云计算领域,Amazon Web Services (AWS) 一直是领军者,提供丰富的服务和工具,帮助开发者、企业和技术专家在云上有效工作。以下是2026年值得关注的十大AWS工...