LangChain Skills மாதிரி நடைமுறை: தேவைக்கேற்ப அறிவை ஏற்றும் SQL உதவியாளரை உருவாக்குதல்
முந்தைய கட்டுரையில், Deep Agents CLI மூலம் Deep Agent திறன்களைப் பயன்படுத்தும் முறையை எவ்வாறு உருவகப்படுத்துவது என்பதைப் பார்த்தோம். இப்போது, LangChain இந்த அம்சத்தை இயல்பாகவே ஆதரிக்கிறது, இது மேம்பாட்டு செயல்முறையை பெரிதும் எளிதாக்குகிறது. இந்த கட்டுரையில், இந்த செயல்பாட்டை ஆழமாக அனுபவிக்கவும், ஒரு சிறந்த SQL உதவியாளரை உருவாக்கவும் உங்களை அழைத்துச் செல்கிறோம்.
சிக்கலான AI முகவரை உருவாக்கும்போது, டெவலப்பர்கள் ஒரு சங்கடமான சூழ்நிலையில் விழுகிறார்கள்: எல்லா சூழலையும் (தரவுத்தள அட்டவணை அமைப்பு, API ஆவணங்கள், வணிக விதிகள்) ஒரே நேரத்தில் சிஸ்டம் ப்ராம்ப்ட்டில் செலுத்துவதா, இது சூழல் சாளரம் (Context Window) நிரம்பி வழியவும் மாதிரி கவனத்தை சிதறடிக்கவும் வழிவகுக்குமா? அல்லது அடிக்கடி நுண்-சரிசெய்தலைத் (Fine-tuning) தேர்ந்தெடுப்பதா, இது அதிக செலவு பிடிக்கும்?
திறன்கள் மாதிரி (Skills Pattern) ஒரு நேர்த்தியான இடைப்பட்ட வழியை வழங்குகிறது. தேவையான அறிவை மாறும் வகையில் ஏற்றுவதன் மூலம், இது சூழலை திறம்பட பயன்படுத்துகிறது. இந்த மாதிரிக்கான LangChain இன் சொந்த ஆதரவு, "தேவைக்கேற்ப கற்றல்" திறன்களைக் கொண்ட ஒரு முகவரை உருவாக்குவதை எளிதாக்குகிறது.
அதிகாரப்பூர்வ ஆவணமான தேவைக்கேற்ப திறன்களுடன் SQL உதவியாளரை உருவாக்குதல் என்பதை இணைத்து, "தேவைக்கேற்ப அறிவை ஏற்றும்" SQL உதவியாளரை புதிதாக உருவாக்க வாசகர்களுக்கு இந்த கட்டுரை வழிகாட்டும்.
1. முக்கிய கருத்து: திறன்கள் மாதிரியை ஏன் தேர்வு செய்ய வேண்டும்?
பாரம்பரிய SQL முகவரின் வரம்புகள்
பாரம்பரிய SQL முகவர் கட்டமைப்பில், நாம் பொதுவாக சிஸ்டம் ப்ராம்ப்ட்டில் முழுமையான தரவுத்தள ஸ்கீமாவை வழங்க வேண்டும். வணிகம் வளரும்போது, அட்டவணைகளின் எண்ணிக்கை நூற்றுக்கணக்கானதாக விரிவடையும்போது, இந்த முறை குறிப்பிடத்தக்க சிக்கல்களை ஏற்படுத்தும்:
-
டோக்கன் நுகர்வு மிகப்பெரியது: ஒவ்வொரு உரையாடலும் நிறைய தொடர்பில்லாத அட்டவணை கட்டமைப்புகளைக் கொண்டு செல்கிறது, இது வளங்களை வீணாக்குகிறது.
-
மாயத்தோற்ற ஆபத்து அதிகரிக்கிறது: அதிகப்படியான தொடர்பில்லாத குறுக்கீடு தகவல்கள் மாதிரியின் அனுமான துல்லியத்தை குறைக்கும்.
-
பராமரிப்பு கடினம்: அனைத்து வணிக வரிகளின் அறிவும் இறுக்கமாக இணைக்கப்பட்டுள்ளது, அதைத் தனியாக மீண்டும் செய்வது கடினம்.
திறன்கள் மாதிரி: படிப்படியான வெளிப்பாட்டின் அடிப்படையில் தீர்வு
திறன்கள் மாதிரி படிப்படியான வெளிப்பாடு (Progressive Disclosure) கொள்கையின் அடிப்படையில் அறிவைப் பெறும் செயல்முறையை அடுக்குகளாகப் பிரிக்கிறது:
-
முகவரின் ஆரம்ப நிலை: என்ன "திறன்கள்" (Skills) உள்ளன மற்றும் அவற்றின் சுருக்கமான விளக்கம் (Description) ஆகியவற்றை மட்டுமே அறிந்து வைத்திருத்தல், இலகுரகமாக இருத்தல்.
-
ரன்டைம் ஏற்றுதல்: ஒரு குறிப்பிட்ட சிக்கலை எதிர்கொள்ளும்போது (எ.கா. "சரக்குகளைத் தேடுங்கள்"), முகவர் கருவியை (
load_skill) தானாக அழைக்கிறது, இந்த திறனின் விரிவான சூழலை (ஸ்கீமா + ப்ராம்ட்) ஏற்றுகிறது. -
பணியை நிறைவேற்றுதல்: ஏற்றப்பட்ட துல்லியமான சூழலின் அடிப்படையில், குறிப்பிட்ட பணியை நிறைவேற்றுதல் (எ.கா. SQL ஐ எழுதி இயக்குதல்).
இந்த மாதிரி வரம்பற்ற விரிவாக்கம் மற்றும் குழு பிரிக்கப்படுவதை திறம்பட ஆதரிக்கிறது, இது முகவரை பெருகிவரும் சிக்கலான வணிக காட்சிகளுக்கு ஏற்றதாக ஆக்குகிறது.
2. கணினி கட்டமைப்பு வடிவமைப்பு
இந்த நடைமுறை திட்டம் இரண்டு முக்கிய திறன்களைக் கொண்ட SQL உதவியாளரை உருவாக்கும், இது இந்த மாதிரியின் உண்மையான பயன்பாட்டை நிரூபிக்கிறது:
-
விற்பனை பகுப்பாய்வு (Sales Analytics):
sales_dataஅட்டவணையை கவனித்துக்கொள்கிறது, வருவாய் புள்ளிவிவரங்கள், ஆர்டர் போக்கு பகுப்பாய்வு போன்றவற்றை கையாளுகிறது. -
சரக்கு மேலாண்மை (Inventory Management):
inventory_itemsஅட்டவணையை கவனித்துக்கொள்கிறது, சரக்கு நிலை கண்காணிப்பு, இருப்பிட வினவல் போன்றவற்றை கையாளுகிறது.
3. மேம்பாட்டு சூழல் அமைப்பு
இந்த திட்டம் பைதான் uv ஐப் பயன்படுத்தி திறமையான சார்பு மேலாண்மைக்கு பயன்படுத்துகிறது.
முக்கிய சார்பு நிறுவல்
uv add langchain langchain-openai langgraph psycopg2-binary python-dotenv langchain-community
PostgreSQL சூழல் கட்டமைப்பு
உள்ளூரில் ஒரு Postgres நிகழ்வைத் தொடங்கி, agent_platform தரவுத்தளத்தை உருவாக்கவும். அட்டவணை கட்டமைப்புகள் மற்றும் சோதனை தரவை தானாகவே துவக்க setup_db.py ஸ்கிரிப்டை நாங்கள் வழங்குகிறோம் (இறுதியில் மூலக் குறியீட்டைப் பார்க்கவும்).
4. முக்கிய செயலாக்க படிகள் விரிவாக### படி 1: களத் திறன்களை வரையறுத்தல் (அறிவு)
கோப்பு முறைமை அல்லது தரவுத்தளத்திலிருந்து ஏற்றும் செயல்முறையை உருவகப்படுத்தி, திறன்களை அகராதி கட்டமைப்பாக வரையறுப்போம். description (ஏஜென்ட் முடிவெடுப்பதற்குப் பயன்படுகிறது) மற்றும் content (உண்மையில் ஏற்றப்பட்ட விரிவான சூழல்) ஆகியவற்றுக்கு இடையே வேறுபடுத்திக் காட்டவும்.
SKILLS = {"sales_analytics": {"description":"விற்பனை வருவாய், போக்குகளை பகுப்பாய்வு செய்ய பயனுள்ளதாக இருக்கும்...","content":"""... அட்டவணை திட்டம்: sales_data ..."" },"inventory_management": {"description":"பங்கு அளவுகளை சரிபார்க்க பயனுள்ளதாக இருக்கும்...","content":"""... அட்டவணை திட்டம்: inventory_items ..."" }}
படி 2: முக்கிய கருவிகளை செயல்படுத்துதல் (திறன்கள்)
ஒரு பணியை முடிக்க ஏஜென்ட் இரண்டு முக்கிய கருவிகளை நம்பியுள்ளது:
-
load_skill(skill_name): இயக்க நேரத்தில் குறிப்பிட்ட திறனின் விவரங்களை மாறும் வகையில் ஏற்றுகிறது. -
run_sql_query(query): குறிப்பிட்ட SQL அறிக்கையை இயக்குகிறது.
படி 3: ஏஜென்ட் தர்க்கத்தை ஒழுங்கமைத்தல் (மூளை)
LangGraph ஐப் பயன்படுத்தி ReAct ஏஜென்ட்டை உருவாக்குதல். இங்கு System Prompt ஒரு முக்கியப் பங்கை வகிக்கிறது, இது Identify -> Load -> Query இன் நிலையான இயக்க நடைமுறையை (SOP) கண்டிப்பாகப் பின்பற்ற ஏஜென்ட்டுக்கு வழிகாட்டுகிறது.
system_prompt ="""1. தொடர்புடைய திறனை அடையாளம் காணவும்.2. திட்டத்தைப் பெற 'load_skill' ஐப் பயன்படுத்தவும்.3. 'run_sql_query' ஐப் பயன்படுத்தி SQL ஐ எழுதி இயக்கவும்....அட்டவணை பெயர்களை யூகிக்க வேண்டாம். எப்போதும் திறனை முதலில் ஏற்றவும்.""
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:நீங்கள் ஒரு விற்பனை பகுப்பாய்வு நிபுணர்.'sales_data' அட்டவணைக்கான அணுகல் உங்களுக்கு உள்ளது.அட்டவணை திட்டம்:- 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: மொத்த வருவாய் $730.50.Testing Inventory Query...Agent calling tools: [{'name': 'load_skill', 'args': {'skill_name': 'inventory_management'}, 'id': 'call_18c823b2d5064e95a0cfe2e3', 'type': 'tool_call'}]Tool output:நீங்கள் ஒரு சரக்கு மேலாண்மை நிபுணர்.'inventory_items' அட்டவணைக்கான அணுகல் உங்களுக்கு உள்ளது.அட்டவணை திட்டம்...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: மடிக்கணினி **Warehouse A** இல் அமைந்துள்ளது.## 6. \u0bae\u0bc1\u0bb4\u0bc1 \u0bb5\u0b9f\u0bbf\u0bb5 \u0b95\u0bc1\u0bb1\u0bbf\u0baa\u0bcd\u0baa\u0bc1 \u0bb5\u0bbf\u0bb5\u0bb0\u0bae\u0bcd\n\n\u0b95\u0bc0\u0bb4\u0bc7 \u0baa\u0bb0\u0bbf\u0bb0\u0bbe\u0bb5\u0ba3\u0bae\u0bcd \u0b86\u0b95\u0bbf\u0baf \u0bae\u0bc1\u0bb4\u0bc1 \u0bb5\u0b9f\u0bbf\u0bb5 \u0b95\u0bc1\u0bb1\u0bbf\u0baa\u0bcd\u0baa\u0bc1, \u0ba4\u0bb3\u0bb5\u0bc1 \u0baa\u0ba4\u0bbf\u0bb5\u0bc1 \u0b95\u0bca\u0ba3\u0bcd\u0b9f\u0bcd\u0b9f\u0bc1 \u0b8e\u0bb4\u0bc1\u0ba4\u0bcd \u0ba4\u0bcb\u0b95\u0bcd\u0b95\u0bc1 \u0bb5\u0b9f\u0bbf\u0bb5\u0bae\u0bcd \u0bae\u0bb1\u0bcd\u0bb1\u0bc1\u0bae\u0bcd Agent \u0bae\u0bc1\u0bb5\u0bb2\u0bcd \u0ba8\u0bbf\u0bb1\u0bb2\u0bcd\u0b95\u0bb3\u0bc1\u0b95\u0bcd \u0b95\u0bc6\u0bbe\u0ba3\u0bcd\u0b9f\u0bc1\u0b89\u0bb3\u0bcd\u0bb3\u0ba4\u0bc1.\n\n### 1. \u0ba4\u0bb3\u0bb5\u0bc1 \u0baa\u0ba4\u0bbf\u0bb5\u0bc1 \u0ba4\u0bcb\u0b95\u0bcd\u0b95\u0bc1\u0ba4\u0bb2\u0bcd (\u0b9a\u0bc6\u0b9f\u0bcd\u0b9f\u0baa\u0bcd_\u0ba4\u0bbe\u0baa\u0bbf.py)\n\n`importpsycopg2frompsycopg2.extensionsimportISOLATION_LEVEL_AUTOCOMMITimportosfromdotenvimportload_dotenvload_dotenv()# \u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd .env \u0b87\u0bb2\u0bcd \u0ba4\u0bb3\u0bb5\u0bc1 \u0b87\u0baf\u0bb3\u0bcd\u0bb3\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0ba4\u0b95\u0bb5\u0bb2\u0bcd \u0b95\u0bc6\u0ba3\u0bcd\u0b9f\u0bcd\u0b9f\u0bcd\u0b9f\u0bb2\u0bcd\u0bb5\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd\u0baf\u0bcd\u0baf\u0bc1\u0bb0\u0bcd\u0bb5\u0bc1\u0bae\u0bcdDB_HOST = os.getenv(### 2. Agent முதன்மை நிரல் (main.py)
import os
from typing import Annotated, Literal, TypedDict, Union, Dict
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage, ToolMessage
from langchain_community.utilities import SQLDatabase
from langchain_community.agent_toolkits import SQLDatabaseToolkit
from langgraph.graph import StateGraph, START, END, MessagesState
from langgraph.prebuilt import ToolNode, tools_condition
load_dotenv()
--- கட்டமைப்பு ---
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')}"
--- தரவுத்தள அமைப்பு ---
db = SQLDatabase.from_uri(DB_URI)
--- திறன்கள் வரையறை ---
SKILLS: Dict[str, Dict[str, str]] = {
"sales_analytics": {
"description": "விற்பனை வருவாய், போக்குகள் மற்றும் பிராந்திய செயல்திறன் ஆகியவற்றை பகுப்பாய்வு செய்ய பயனுள்ளதாக இருக்கும்.",
"content": """நீங்கள் ஒரு விற்பனை பகுப்பாய்வு நிபுணர்.
உங்களுக்கு 'sales_data' அட்டவணையில் அணுகல் உள்ளது.
அட்டவணை திட்டம்:-
- id: முழு எண் (முதன்மை சாவி)
- transaction_date: தேதி
- product_id: varchar(50)
- amount: decimal(10, 2)
- region: varchar(50)
பொதுவான கேள்விகள்:-
- மொத்த வருவாய்: SUM(amount)
- பிராந்தியத்தின் அடிப்படையில் வருவாய்: GROUP BY region
- விற்பனை போக்கு: GROUP BY transaction_date"""
},
"inventory_management": {
"description": "பங்கு அளவுகள், தயாரிப்பு இருப்பிடங்கள் மற்றும் கிடங்கு மேலாண்மை ஆகியவற்றை சரிபார்க்க பயனுள்ளதாக இருக்கும்.",
"content": """நீங்கள் ஒரு சரக்கு மேலாண்மை நிபுணர்.
உங்களுக்கு 'inventory_itemTable 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)
ifnot skill:
return f"Error: Skill '{skill_name}' not found. Available skills: {list(SKILLS.keys())}"
return skill["content"]
@tool
def run_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:
return db.run(query)
except Exception as e:
return f"Error executing SQL: {e}"
@tool
def list_tables() -> str:
"""List all available tables in the database."""
return str(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 ---
class AgentState(MessagesState):
We can add custom state if needed, but MessagesState is sufficient for simple chat
pass
def agent_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(\ke({"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`





