Skip to content
··7 मिनट पढ़ने का समय

कैसे मैं एक AI Agent के साथ Coding Quicksand से निकला

मैं zero coding skills और ढेर सारे उत्साह के साथ chatbot बनाने में कूद पड़ा — सिर्फ यह discover करने के लिए कि मेरा v0.1 CSV databases और primitive chunking की एक disaster था, जब तक AI agents ने मुझे बाहर नहीं निकाला।

Update (2026): यह chatbot Sydney बन गया! कई iterations के बाद, Sydney अब /ask/ पर रहती है और blog content और products पर focus करती है।


पिछले साल नवंबर की शुरुआत में, मैंने अपना DIY chatbot version 0.1 ship किया था। उस समय मैंने लिखा था, "जबकि v0.1 एक coding novice के रूप में एक बड़े पहले कदम का प्रतिनिधित्व करता था, इसमें significant limitations थीं।" खैर, जैसा कि निकला, यह एक understatement था। मुझे पूरी process और मेरे build कितने clunky थे, इसकी सराहना नहीं थी। हकीकत यह थी कि मेरा initial attempt, हालाँकि earnest था, उत्साह से लेकिन सीमित know-how के साथ cobble किया गया एक prototype था।

यह post सिर्फ एक follow-up नहीं है; यह उस journey का एक deep dive है जो उस बिंदु से unfold हुई — trials, errors, और invaluable lessons से भरी। मैं इस adventure की nuts and bolts को bare कर रहा हूँ, न सिर्फ transparency के लिए बल्कि इस उम्मीद में कि मेरे experiences, जितने detailed हैं, किसी ऐसे व्यक्ति के साथ resonate कर सकते हैं या उसकी मदद कर सकते हैं जो similar path पर है। (अतिरिक्त context के लिए, मैं zero prior coding experience वाला एक middle-aged advertising professional हूँ।)

जैसा कि बताया, chatbot का v0.1 ship करने के लिए, मैंने मुख्य रूप से इस short course "Building Systems with the ChatGPT API" और OpenAI के दो cookbooks का follow किया: Question answering using embeddings-based search और How to count tokens with tiktoken

यहाँ बताता हूँ कि मेरा chatbot v0.1 क्यों terrible था:

  • Chunking: मैंने बस long blog posts को token length के आधार पर smaller chunks में split किया — simple static character chunk of data। Split करने का सबसे primitive तरीका :D। अगर आप समझना चाहते हैं कि यह terrible idea क्यों है, तो Greg Kamradt के text splitting के 5 levels पढ़ें।
  • Embedding: मुझे embeddings से जूझना पड़ा। मैंने OpenAI's embedding model use किया, लेकिन API request limits से बार-बार टकराता रहा, जिससे embedding process आधे में fail हो जाती थी। फिर मैंने requests को batch करना और limits से बचने के लिए batches के बीच timeouts जोड़ना सीखा। अंततः मैंने generated embeddings को अपनी makeshift "database" के रूप में एक simple .csv file में save किया।
  • Database: मैं जानता था कि CSV database के लिए optimal नहीं थी, लेकिन मेरे पास better alternatives के skills नहीं थे।
  • Metadata: मुझे initially realize नहीं था कि publish dates और post URLs जैसे metadata को शामिल करना chatbots के लिए user questions का accurately जवाब देने के लिए important है। मुझे relevant metadata incorporate करने के लिए embedding और saving repeat करना पड़ा।
  • Retriever: मैं अलग-अलग retriever types और algorithms से अनजान था। मैंने बस hardcoded number of results retrieve करने के लिए OpenAI के relevance search का उपयोग किया।
  • Memory: Conversation के लिए, chatbot को user ने पहले क्या कहा यह remember करना ज़रूरी है। और यहीं gpt-3.5 के limited context window length (उस समय) के साथ, chunk size और आप कितने results retrieve करना चाहते हैं, इसके बीच एक clear trade off था।
    • उदाहरण के लिए, अगर आपका chunk size 800 tokens है और retriever top 8 results लौटाता है, वो 6,400 tokens है या old model limit का 50% से ज़्यादा।
    • ऊपर सिर्फ 1 question है, तो आप imagine कर सकते हैं कि multi-turn conversation में memory कितनी जल्दी भर सकती है।
    • इस issue को solve करने का एक तरीका है smaller chunk size और retriever को कम results return करवाना, लेकिन basic retriever के साथ, इसका मतलब है कि model के पास question का answer देने के लिए comprehensive information नहीं है।
  • मैंने कोई IDE भी use नहीं किया। सभी codes Mac पर TextEdit से edit किए :D (क्या मैंने बताया था कि मैं पहले से noob था? :P)
  • मैं और भी बता सकता हूँ लेकिन मुझे लगता है आप picture समझ गए।

मेरी "valley of death"

v0.1 की limitations से परे improve करने के लिए उत्साहित होकर, मैंने कई online courses की कोशिश की, उम्मीद करते हुए कि वे मेरी skills को level up करने के लिए missing pieces provide करेंगे। लेकिन progress सिर्फ dead ends तक ले गई।

मैं vector databases में exercises से जूझा (Vector Databases: from Embeddings to Applications with Weaviate), evaluative RAG methods (Building and Evaluating Advanced RAG Applications with Llama-Index and Truera), और advanced retrieval techniques (Advanced Retrieval for AI with Chroma) में। जितना भी कोशिश की, मैं theory को अपने blog data के साथ practical application से जोड़ नहीं सका।

क्या courses poorly designed थे? नहीं — shortcoming मेरी अपनी underlying knowledge की कमी थी। फिर भी, failure after failure massively frustrating था, demoralizing तो था ही। मैं एक figurative valley में था, आगे कैसे बढ़ूँ यह नहीं पता था।

समय के साथ Incremental Wins

बार-बार failures से value के nuggets ज़रूर निकले:

  • TextEdit के बजाय VS Code को adopt करना

  • GitHub Copilot extensions का लाभ उठाना

  • Development environments के लिए Jupyter Notebook की सराहना करना

Last course में LangChain का ज़िक्र था, chatbots बनाने के लिए एक popular नया framework। मैंने actually LangChain tutorials महीनों पहले try किए थे ("LangChain: Chat with Your Data" और "Functions, Tools and Agents with LangChain") बिना ज़्यादा luck के। लेकिन अब, hard-won knowledge के साथ, इसके docs को revisit करना illuminating साबित हुआ। Concepts click हो गए और इसका modular architecture intuitive sense बनाने लगा।

मैं LangChain की robust capabilities को अपने passion project के लिए adapt करना visualize कर सकता था। आखिरकार, एक रास्ता दिखा! एक कदम एक बार, मैंने data ingestion, embedding, storage और retrieval के लिए इसके pipelines के साथ खुद को orient किया।

मेरा confidence हर piece के साथ बढ़ा जो मैं implement कर पाया। V2 आकार लेने लगा...

Foundation को Rebuild करना

Langchain को guide के रूप में लेकर, मैंने अपना chatbot ground up से reconstruct करने की कोशिश की:

WordPress Exports को JSON में Ingest करना

कुछ trial and error के बाद ingestion parameters tweaking करके, LangChain के JSONLoader ने मेरे exported posts को properly parse किया। अब validated input downstream pipelines को fuel कर सकता था।

Automated Text Splitting

मेरे naive token length chunking को LangChain के SentenceTransformers से replace किया, जो semantic units को split करने के लिए advanced NLP use करता है। अब बीच में disjointed sentences नहीं! Configurations ने chunks को memory-constrained models के लिए appropriately sized रखा।

from langchain.text_splitter import SentenceTransformersTokenTextSplitter
# Define the token splitter with specific configurations
token_splitter = SentenceTransformersTokenTextSplitter(
    chunk_overlap=0,  # Overlap between chunks
    tokens_per_chunk=256  # Number of tokens per chunk
)
# Split the documents into chunks based on tokens
all_splits = token_splitter.split_documents(documents)
print(f"Total document splits: \{len(all_splits)\}")

Embeddings और Indexes Generate करना

OpenAI API limits के साथ पिछले struggles LangChain के OpenAI embeddings के wrapper का उपयोग करके vanish हो गए। Code की दो lines में bundled, embeddings ने split text से salient features cleanly extract किए।

Vector store के लिए, मैंने Weaviate या Chroma के बजाय FAISS (Facebook AI Similarity Search) को choose किया। Industry-tested FAISS ने मेरी needs के लिए capability versus complexity का सही balance strike किया।

# Initialize embeddings and FAISS vector store
embeddings = OpenAIEmbeddings()
db = FAISS.from_documents(all_splits, embeddings)

# Save the vector store locally
db.save_local("path/to/save/faiss_index")  # Placeholder for save path/ index name

बस दो lines of code!

Conversational Agents को Architect करना

मैंने इस chatbot को build करने के लिए langchain का agent framework use करने का decide किया। क्या यह इस point पर overkill है? हाँ है। लेकिन मेरी उम्मीद है कि समय के साथ, मैं इस chatbot को evolve करूँगा और इसे more "tools" दूँगा। Langchain agent को set up करना और उसे tools देना बहुत आसान बनाता है।

embeddings = OpenAIEmbeddings()
db = FAISS.load_local("path/to/your/faiss_index_file", embeddings)
retriever = db.as_retriever(search_type="mmr")
tool = create_retriever_tool(
    retriever,
    "search_your_blog",
    "Your tool description here"
)

tools = [tool]
llm = ChatOpenAI(model_name="gpt-3.5-turbo-1106", temperature=0)
llm_with_tools = llm.bind_tools(tools)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

P.S: क्या यह weird है कि chatbot आपके बारे में कुछ नहीं जानता Chandler?

उन लोगों का धन्यवाद जिन्होंने मुझे बताया कि chatbot मेरे बारे में कुछ नहीं जानता। और आप सही हैं! ऐसा इसलिए है क्योंकि मैं "About" Page export करना भूल गया और सिर्फ "published posts" export किए। यह दूसरी बार है जब मैंने यह करना भूला — इसलिए अब मैं eval questions की list में मेरे बारे में basic questions शामिल करूँगा। Lesson learned!

एक quick update

Chatbot के मेरे बारे में कुछ नहीं जानने की issue अब fix हो गई है। यहाँ बताता हूँ मैंने क्या किया:

  • Wordpress से "About me" page export की ऊपर की तरह।
  • Text splitting perform किया और ऊपर की तरह FAISS का उपयोग करके embeddings generate किए। Vector store को locally test करने के लिए एक अलग नाम से save किया।
# save the vector store to local machine
db.save_local("faiss_index_about")
  • जैसा कि निकला, दो FAISS vector stores को merge करने की process surprisingly simple है:
from langchain_community.vectorstores import FAISS
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
db_1 = FAISS.load_local("faiss_index_about", embeddings)
db_2 = FAISS.load_local("faiss_index", embeddings)
db_2.merge_from(db_1)
db_2.save_local("faiss_index_v2")

Feb 14 update: Chatbot v2.10 Unveiled

इस chatbot के deployment के दो हफ्ते बाद, मैंने version 2.10 introduce किया। आप इसके बारे में यहाँ और पढ़ सकते हैं।

Mar 25 update: Frontend Upgrades से Docker Struggles और Breakthroughs तक

आप इसके बारे में यहाँ पढ़ सकते हैं।

पढ़ना जारी रखें

मेरा सफ़र
जुड़ें
भाषा
सेटिंग्स