AI एजेंट · पाठ

नॉलेज-वर्धित एजेंट बनाना

शुरू से अंत तक: इकाई लिंकिंग → ग्राफ़ क्वेरी → उत्तर संश्लेषण।

पाठ 4, कुल 4 में से13 चरण

नॉलेज-वर्धित एजेंट बनाना, CoddyKit पर AI एजेंट का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह AI एजेंट सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। AI एजेंट पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

ज्ञान-वर्धित एजेंट क्या है?

ज्ञान-वर्धित एजेंट ज्ञान-आधार का उपयोग करके अपने उत्तरों को बेहतर बनाता है। प्रश्न आने पर एजेंट इकाइयाँ निकालता है, उन्हें ज्ञान ग्राफ़ में खोजता है, वेक्टर खोज के माध्यम से प्रासंगिक दस्तावेज़ ढूँढ़ता है और समृद्ध, साक्ष्य-आधारित उत्तर के लिए पूरा संदर्भ LLM को देता है।

पूर्ण पुनर्प्राप्ति पाइपलाइन

एजेंट की पाइपलाइन: 1 प्रश्न प्राप्त करें → 2 इकाइयाँ निकालें → 3 इकाई संदर्भ के लिए ग्राफ़ खोजें → 4 प्रासंगिक दस्तावेज़ों के लिए वेक्टर खोज करें → 5 पूरा संदर्भ मिलाएँ → 6 LLM उत्तर बनाए।

from dataclasses import dataclass, field
from typing import List, Dict, Any

@dataclass
class RetrievalContext:
    question: str
    entities: List[str] = field(default_factory=list)
    graph_context: Dict[str, Any] = field(default_factory=dict)
    vector_documents: List[Dict] = field(default_factory=list)
    combined_context: str = ''
    answer: str = ''
    sources_used: List[str] = field(default_factory=list)

# The agent will populate this object as it works through the pipeline
ctx = RetrievalContext(question='What AI projects is Sam Altman known for?')
print('RetrievalContext created:', ctx.question)

चरण 1: इकाई निष्कर्षण

प्रश्न से नामित इकाइयाँ निकालें। ये इकाइयाँ ग्राफ़ खोज के लिए आधार-बिंदु बनती हैं। गति के लिए spaCy का उपयोग करें; कठिन मामलों या डोमेन-विशिष्ट इकाइयों के लिए LLM का उपयोग करें।

import spacy

nlp = spacy.load('en_core_web_sm')

def extract_question_entities(question: str) -> List[str]:
    doc = nlp(question)
    entities = list({
        ent.text for ent in doc.ents
        if ent.label_ in ['PERSON', 'ORG', 'GPE', 'PRODUCT', 'WORK_OF_ART']
    })
    return entities

def extract_entities_with_llm_fallback(question: str, client) -> List[str]:
    spacy_entities = extract_question_entities(question)
    
    if spacy_entities:
        return spacy_entities
    
    # Fallback to LLM for questions where spaCy finds nothing
    import json
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{
            'role': 'user',
            'content': f'Extract named entities (people, companies, technologies) from: "{question}". Return JSON: {{"entities": ["name1", "name2"]}}'
        }],
        response_format={'type': 'json_object'}
    )
    result = json.loads(response.choices[0].message.content)
    return result.get('entities', [])

question = 'What AI projects is Sam Altman known for?'
entities = extract_question_entities(question)
print('Extracted entities:', entities)

चरण 2: ग्राफ़ खोज

प्रत्येक निकाली गई इकाई के लिए उसके गुण और संबंध पाने हेतु ज्ञान ग्राफ़ में क्वेरी करें। इससे LLM को ऐसे पृष्ठभूमि तथ्य मिलते हैं जिन्हें वह गढ़ नहीं सकता।

from neo4j import GraphDatabase

driver = GraphDatabase.driver('bolt://localhost:7687', auth=('neo4j', 'password'))

def get_rich_entity_context(entity_name: str) -> dict:
    with driver.session() as session:
        # Get entity + its relationships
        result = session.run(
            'MATCH (n {name: $name}) '
            'OPTIONAL MATCH (n)-[r]->(target) '
            'RETURN n, labels(n) AS labels, '
            'COLLECT({rel: type(r), target_name: target.name, target_label: labels(target)}) AS outgoing '
            'LIMIT 1',
            name=entity_name
        )
        record = result.single()
        if not record:
            return {'found': False, 'name': entity_name}
        
        return {
            'found': True,
            'name': entity_name,
            'labels': record['labels'],
            'properties': dict(record['n']),
            'connections': [
                c for c in record['outgoing'] if c.get('target_name')
            ][:10]
        }

def format_entity_context_for_llm(entity_ctx: dict) -> str:
    if not entity_ctx.get('found'):
        return f'No knowledge graph data found for "{entity_ctx["name"]}"'
    
    props = entity_ctx.get('properties', {})
    connections = entity_ctx.get('connections', [])
    conn_strs = [f"{c['rel']} -> {c['target_name']}" for c in connections[:5]]
    
    return (
        f"Entity: {entity_ctx['name']} ({', '.join(entity_ctx['labels'])})\n"
        f"Properties: {props}\n"
        f"Relationships: {'; '.join(conn_strs)}"
    )

चरण 3: वेक्टर खोज

अपने ज्ञान-आधार में अर्थ की दृष्टि से सबसे प्रासंगिक दस्तावेज़ खोजने के लिए मूल प्रश्न के साथ वेक्टर खोज चलाएँ। ये दस्तावेज़ उत्तर के समर्थन में प्रमाण देते हैं।

import chromadb
import openai

client = openai.OpenAI(api_key='sk-...')
chroma_client = chromadb.Client()
collection = chroma_client.get_or_create_collection('knowledge_base')

def vector_search(query: str, top_k: int = 5) -> list:
    response = client.embeddings.create(
        model='text-embedding-3-small',
        input=query
    )
    query_embedding = response.data[0].embedding
    
    results = collection.query(
        query_embeddings=[query_embedding],
        n_results=top_k,
        include=['documents', 'metadatas', 'distances']
    )
    
    documents = []
    for i in range(len(results['ids'][0])):
        documents.append({
            'text': results['documents'][0][i],
            'metadata': results['metadatas'][0][i],
            'distance': results['distances'][0][i],
            'relevance': 1 - results['distances'][0][i]  # Convert distance to similarity
        })
    
    return documents

print('Vector search function defined')

चरण 4: संदर्भ को मिलाना

ग्राफ़ संदर्भ और वेक्टर दस्तावेज़ों को एक ही सुव्यवस्थित संदर्भ स्ट्रिंग में एकत्रित करें। क्रम महत्वपूर्ण है: पहले ग्राफ़ तथ्य (उच्च सटीकता), फिर वेक्टर दस्तावेज़ (व्यापक कवरेज)।

def combine_context(question: str, graph_contexts: dict, vector_docs: list) -> str:
    sections = []
    
    # Graph facts section
    if graph_contexts:
        graph_parts = ['### Knowledge Graph Facts']
        for entity_name, ctx in graph_contexts.items():
            graph_parts.append(format_entity_context_for_llm(ctx))
        sections.append('\n'.join(graph_parts))
    
    # Vector documents section
    if vector_docs:
        doc_parts = ['### Relevant Documents']
        for i, doc in enumerate(vector_docs[:4]):
            title = doc.get('metadata', {}).get('title', f'Document {i+1}')
            text = doc['text'][:800]  # Limit per document
            relevance = doc.get('relevance', 0)
            doc_parts.append(f'**{title}** (relevance: {relevance:.2f})\n{text}')
        sections.append('\n'.join(doc_parts))
    
    context = '\n\n'.join(sections)
    # Total context budget: ~8000 tokens ~ 32000 chars
    if len(context) > 32000:
        context = context[:32000]
    
    return context

चरण 5: LLM द्वारा उत्तर निर्माण

मिले-जुले संदर्भ को सिस्टम संदेश या उपयोगकर्ता संदर्भ के रूप में LLM को दें। उसे दिए गए विवरण का उपयोग करने और यह बताने का निर्देश दें कि प्रत्येक तथ्य किस स्रोत से आया है।

import openai

client = openai.OpenAI(api_key='sk-...')

def generate_answer(question: str, combined_context: str) -> str:
    system_prompt = (
        'You are a knowledgeable assistant. Answer the question using ONLY the provided context. '
        'Cite your sources by mentioning whether a fact came from the knowledge graph or a specific document. '
        'If the context does not contain enough information, say so clearly.'
    )
    
    user_message = (
        f'Context:\n{combined_context}\n\n'
        f'Question: {question}\n\n'
        'Please answer based on the context above.'
    )
    
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[
            {'role': 'system', 'content': system_prompt},
            {'role': 'user', 'content': user_message}
        ],
        temperature=0.1  # Low temperature for factual answers
    )
    return response.choices[0].message.content

पूर्ण एजेंट समन्वयक

समन्वयक फ़ंक्शन सभी चरणों को एक साथ जोड़ता है। यह एक प्रश्न लेता है, पूरी पाइपलाइन चलाता है और उत्तर तथा उपयोग किए गए संदर्भ वाला संरचित परिणाम लौटाता है।

async def knowledge_augmented_agent(question: str) -> RetrievalContext:
    ctx = RetrievalContext(question=question)
    
    # Step 1: Extract entities
    ctx.entities = extract_question_entities(question)
    print(f'Entities: {ctx.entities}')
    
    # Steps 2 & 3: Graph + Vector in parallel
    import asyncio
    from concurrent.futures import ThreadPoolExecutor
    
    executor = ThreadPoolExecutor(max_workers=4)
    loop = asyncio.get_event_loop()
    
    async def graph_step():
        contexts = {}
        for entity in ctx.entities:
            context = await loop.run_in_executor(executor, get_rich_entity_context, entity)
            if context.get('found'):
                contexts[entity] = context
        return contexts
    
    async def vector_step():
        return await loop.run_in_executor(executor, vector_search, question, 5)
    
    ctx.graph_context, ctx.vector_documents = await asyncio.gather(
        graph_step(), vector_step()
    )
    
    # Step 4: Combine
    ctx.combined_context = combine_context(
        question, ctx.graph_context, ctx.vector_documents
    )
    
    # Step 5: Generate answer
    ctx.answer = generate_answer(question, ctx.combined_context)
    
    return ctx

खाली पुनर्प्राप्ति को संभालना

जब ज्ञान-आधार में कोई प्रासंगिक जानकारी न हो, तो एजेंट को मनगढ़ंत उत्तर देने के बजाय यह बात स्पष्ट रूप से कहनी चाहिए। LLM को बुलाने से पहले जाँचें कि पुनर्प्राप्ति से उपयोगी परिणाम मिले हैं या नहीं।

def check_retrieval_quality(graph_contexts: dict, vector_docs: list, threshold: float = 0.7) -> dict:
    has_graph = len(graph_contexts) > 0
    
    # Filter vector docs below relevance threshold
    high_quality_docs = [d for d in vector_docs if d.get('relevance', 0) >= threshold]
    
    return {
        'has_graph_context': has_graph,
        'graph_entity_count': len(graph_contexts),
        'vector_doc_count': len(high_quality_docs),
        'retrieval_quality': 'high' if (has_graph or len(high_quality_docs) >= 2) else 'low',
        'usable_docs': high_quality_docs
    }

def answer_with_fallback(question: str, graph_contexts: dict, vector_docs: list) -> str:
    quality = check_retrieval_quality(graph_contexts, vector_docs)
    
    if quality['retrieval_quality'] == 'low':
        return (
            f'I don\'t have enough information in my knowledge base to answer '
            f'"{question}" confidently. '
            'Please ensure relevant documents are indexed or the knowledge graph '
            'contains the required entities.'
        )
    
    context = combine_context(question, graph_contexts, quality['usable_docs'])
    return generate_answer(question, context)

पुनर्प्राप्ति परिणामों को कैश करना

समान प्रश्नों के लिए बार-बार होने वाली महँगी एपीआई कॉल से बचने हेतु इकाई खोजों और वेक्टर खोज परिणामों को कैश करें। TTL का उपयोग करें, ताकि पुराना डेटा समय-समय पर ताज़ा किया जा सके।

import hashlib
import json
from datetime import datetime, timedelta

class RetrievalCache:
    def __init__(self, ttl_minutes: int = 60):
        self.cache = {}
        self.ttl = timedelta(minutes=ttl_minutes)
    
    def _key(self, namespace: str, value: str) -> str:
        return hashlib.md5(f'{namespace}:{value}'.encode()).hexdigest()
    
    def get(self, namespace: str, value: str):
        key = self._key(namespace, value)
        entry = self.cache.get(key)
        if entry and datetime.now() - entry['ts'] < self.ttl:
            return entry['data']
        return None
    
    def set(self, namespace: str, value: str, data):
        key = self._key(namespace, value)
        self.cache[key] = {'data': data, 'ts': datetime.now()}

cache = RetrievalCache(ttl_minutes=30)

def cached_graph_lookup(entity: str) -> dict:
    cached = cache.get('graph', entity)
    if cached:
        print(f'Cache hit for entity: {entity}')
        return cached
    result = get_rich_entity_context(entity)
    cache.set('graph', entity, result)
    return result

print('Retrieval cache initialized')

लॉग-लेखन और निगरानी

हर पुनर्प्राप्ति चरण का लॉग दर्ज करें, ताकि आप पता लगा सकें कि कोई उत्तर अच्छा या खराब क्यों था। मिली हुई इकाइयाँ, पुनर्प्राप्त किए गए दस्तावेज़ों की संख्या, उनकी प्रासंगिकता के अंक और अंतिम उत्तर दर्ज करें।

import logging
import json
from datetime import datetime

logger = logging.getLogger('ka_agent')

def log_agent_run(ctx: 'RetrievalContext', duration_ms: float):
    logger.info(json.dumps({
        'timestamp': datetime.utcnow().isoformat(),
        'question': ctx.question,
        'entities_found': ctx.entities,
        'graph_entities_resolved': list(ctx.graph_context.keys()),
        'vector_docs_retrieved': len(ctx.vector_documents),
        'vector_doc_relevances': [
            round(d.get('relevance', 0), 3)
            for d in ctx.vector_documents
        ],
        'context_length_chars': len(ctx.combined_context),
        'answer_length_chars': len(ctx.answer),
        'duration_ms': round(duration_ms, 1)
    }))

print('Observability logging configured')

ज्ञान-वर्धित एजेंट: ज्ञान जाँच

ज्ञान-वर्धित एजेंट बनाने की अपनी समझ जाँचें।

ज्ञान-वर्धित एजेंट का सारांश

ज्ञान-वर्धित एजेंट इकाई निष्कर्षण, ग्राफ़ भ्रमण और वेक्टर खोज को एक कार्यप्रवाह में संयोजित करता है, जो LLM को समृद्ध और वास्तविक संदर्भ प्रदान करता है। इसका परिणाम अधिक सटीक और कम मनगढ़ंत उत्तरों के रूप में मिलता है, जो आपके ज्ञान-आधार के वास्तविक डेटा पर आधारित होते हैं। मुख्य जोड़ हैं: कैशिंग, खाली पुनर्प्राप्ति के लिए वैकल्पिक व्यवस्था और निगरानी-योग्यता के लिए संरचित लॉग-लेखन।

शुरुआत निःशुल्क

एआई शिक्षक के साथ AI एजेंट सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
60
पाठ
239

अक्सर पूछे जाने वाले प्रश्न

क्या “नॉलेज-वर्धित एजेंट बनाना” पाठ निःशुल्क है?

हाँ—“नॉलेज-वर्धित एजेंट बनाना” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और AI एजेंट पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। AI एजेंट पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“नॉलेज-वर्धित एजेंट बनाना” में मैं क्या सीखूँगा?

शुरू से अंत तक: इकाई लिंकिंग → ग्राफ़ क्वेरी → उत्तर संश्लेषण। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ AI एजेंट का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या AI एजेंट शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर AI एजेंट शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।

“नॉलेज-वर्धित एजेंट बनाना” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस AI एजेंट पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर AI एजेंट पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. नॉलेज ग्राफ़ के लिए इकाई निष्कर्षण
  2. एजेंट टूल से Neo4j क्वेरी
  3. वेक्टर और ग्राफ़ पुनर्प्राप्ति का संयोजन
  4. नॉलेज-वर्धित एजेंट बनाना
← AI एजेंट पर वापस जाएँ