{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[],"dockerImageVersionId":30762,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":" %pip install newspaper3k","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pip install chromadb langchain-chroma","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" %pip install lxml_html_clean","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" %pip install langgraph","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#pip install selenium","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pip install -U wikipedia","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" %pip install -U langchain tavily-python matplotlib langchain_community scikit-learn langchainhub sentence-transformers langchain-exa","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" %pip install unstructured langchain_groq","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!rm -rf /kaggle/working/*","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!rm -rf /kaggle/working/docs/chroma","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nfrom typing_extensions import TypedDict, List\nfrom IPython.display import Image, display\nfrom langgraph.graph import START, END, StateGraph\nfrom langchain_community.llms import llamacpp, LlamaCpp\nfrom langchain_core.output_parsers import StrOutputParser\nfrom langchain_core.output_parsers import JsonOutputParser\nimport uuid \nfrom langchain_community.chat_models.llamacpp import ChatLlamaCpp\nfrom langchain.text_splitter import RecursiveCharacterTextSplitter\nfrom langchain_community.document_loaders import WebBaseLoader\nfrom langchain_community.vectorstores import SKLearnVectorStore\nfrom langchain_community.embeddings import HuggingFaceEmbeddings\nfrom langchain_community.chat_models.llamacpp import ChatLlamaCpp\nfrom sentence_transformers import SentenceTransformer\nfrom langchain.vectorstores import Chroma\nfrom langchain_community.document_loaders import UnstructuredURLLoader, NewsURLLoader\n#from langchain_community.document_loaders.url_selenium import SeleniumURLLoader\nfrom langchain_community.document_loaders import NewsURLLoader\nfrom langchain_community.retrievers.wikipedia import WikipediaRetriever\nfrom langchain_community.tools.tavily_search import TavilySearchResults\nfrom langchain_exa import ExaSearchRetriever, TextContentsOptions\nfrom langchain_groq import ChatGroq\nfrom langchain_community.utilities import GoogleSerperAPIWrapper\nfrom langchain_chroma import Chroma\n","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:04:13.656974Z","iopub.execute_input":"2024-09-10T13:04:13.657321Z","iopub.status.idle":"2024-09-10T13:04:47.528110Z","shell.execute_reply.started":"2024-09-10T13:04:13.657287Z","shell.execute_reply":"2024-09-10T13:04:47.527289Z"},"trusted":true},"execution_count":2,"outputs":[{"name":"stderr","text":"/opt/conda/lib/python3.10/site-packages/sentence_transformers/cross_encoder/CrossEncoder.py:11: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n from tqdm.autonotebook import tqdm, trange\n","output_type":"stream"}]},{"cell_type":"code","source":"os.environ[\"EXA_API_KEY\"] = exa_apiKey\nos.environ[\"LANGCHAIN_TRACING_V2\"] = \"true\"\nos.environ[\"LANGCHAIN_ENDPOINT\"] = \"https://api.langchain.plus\"\nos.environ[\"LANGCHAIN_API_KEY\"] = lang_api_key\nos.environ[\"LANGCHAIN_PROJECT\"] = \"gemma2_9b_CRAG_SKLearn_Wiki+Serper_Async_SIM\"\nos.environ[\"GROQ_API_KEY\"] = groq_api_key\nos.environ[\"SERPER_API_KEY\"] = SERPER_API_KEY\n\n\n\n","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:04:47.529603Z","iopub.execute_input":"2024-09-10T13:04:47.530258Z","iopub.status.idle":"2024-09-10T13:04:47.536052Z","shell.execute_reply.started":"2024-09-10T13:04:47.530223Z","shell.execute_reply":"2024-09-10T13:04:47.534722Z"},"trusted":true},"execution_count":3,"outputs":[]},{"cell_type":"code","source":"# List of URLs to load documents from\nurls = [\n \n\"https://github.com/zedr/clean-code-python\",\n\"https://tenthousandmeters.com/blog/python-behind-the-scenes-10-how-python-dictionaries-work/\",\n\"https://realpython.com/python-testing/\",\n\"https://docs.python-guide.org/writing/license/\",\n \"https://blogs.nvidia.com/blog/what-is-a-transformer-model/\",\n \"https://research.google/blog/transformer-a-novel-neural-network-architecture-for-language-understanding/\",\n\"https://realpython.com/python-pep8/\",\n\"https://towardsdatascience.com/ideal-python-environment-setup-for-data-science-cdb03a447de8\",\n\"https://realpython.com/python3-object-oriented-programming/\",\n\"https://realpython.com/python-functional-programming/\",\n\"https://fivethirtyeight.com/features/science-isnt-broken/\",\n\"https://github.com/renatofillinich/ab_test_guide_in_python/blob/master/AB%20testing%20with%20Python.ipynb\",\n\"https://towardsdatascience.com/why-is-data-science-failing-to-solve-the-right-problems-7b5b6121e3b4\",\n\"https://medium.com/@srowen/common-probability-distributions-347e6b945ce4\",\n\"https://github.com/renatofillinich/ab_test_guide_in_python/blob/master/AB%20testing%20with%20Python.ipynb\",\n\"https://scikit-learn.org/stable/modules/compose.html\",\n\"https://machinelearningmastery.com/light-gradient-boosted-machine-lightgbm-ensemble/\",\n\"https://neptune.ai/blog/xgboost-vs-lightgbm\",\n\"https://towardsdatascience.com/interpretable-machine-learning-with-xgboost-9ec80d148d27\",\n\"https://www.cio.com/article/247005/what-are-containers-and-why-do-you-need-them.html\",\n\"https://mitsloan.mit.edu/ideas-made-to-matter/machine-learning-explained\",\n\"https://towardsdatascience.com/making-friends-with-machine-learning-5e28d5205a29\",\n\"https://towardsdatascience.com/handling-imbalanced-datasets-in-machine-learning-7a0e84220f28\",\n\"https://machinelearningmastery.com/multi-class-imbalanced-classification/\",\n\"https://imbalanced-learn.org/stable/auto_examples/applications/plot_impact_imbalanced_classes.html\",\n\"https://docs.ray.io/en/master/tune/examples/tune-sklearn.html\",\n\"https://www.kaggle.com/code/ldfreeman3/a-data-science-framework-to-achieve-99-accuracy\",\n\"https://cs231n.github.io/optimization-2/\",\n\"https://alexander-schiendorfer.github.io/2020/02/24/a-worked-example-of-backprop.html\",\n\"https://www.analyticsvidhya.com/blog/2020/01/fundamentals-deep-learning-activation-functions-when-to-use-them/\",\n\"https://ml-cheatsheet.readthedocs.io/en/latest/activation_functions.html\",\n\"https://d2l.ai/chapter_multilayer-perceptrons/mlp.html\",\n\"https://d2l.ai/chapter_linear-classification/softmax-regression.html#loss-function\",\n\"https://d2l.ai/chapter_optimization/\",\n \"https://www.investopedia.com/terms/s/statistical-significance.asp\",\n\"https://d2l.ai/chapter_linear-classification/softmax-regression.html#loss-function\",\n\"https://d2l.ai/chapter_convolutional-neural-networks/why-conv.html\",\n\"https://d2l.ai/chapter_convolutional-modern/alexnet.html\",\n\"https://d2l.ai/chapter_convolutional-modern/vgg.html\",\n\"https://d2l.ai/chapter_convolutional-modern/nin.html\",\n\"https://d2l.ai/chapter_convolutional-modern/googlenet.html\",\n 'https://python.langchain.com/v0.1/docs/guides/productionization/evaluation/',\n 'https://python.langchain.com/v0.1/docs/guides/productionization/evaluation/string/',\n 'https://python.langchain.com/v0.1/docs/guides/productionization/evaluation/comparison/',\n 'https://python.langchain.com/v0.1/docs/guides/productionization/evaluation/trajectory/',\n \"https://langchain-ai.github.io/langgraph/concepts/high_level/#why-langgraph\",\n 'https://langchain-ai.github.io/langgraph/concepts/low_level/#only-stream-tokens-from-specific-nodesllms',\n \"https://langchain-ai.github.io/langgraph/concepts/agentic_concepts/#reflection\",\n \"https://langchain-ai.github.io/langgraph/concepts/faq/\",\n \"https://www.geeksforgeeks.org/python-oops-concepts/\",\n \"https://www.mckinsey.com/featured-insights/mckinsey-explainers/what-is-fintech\",\n \"https://datascientest.com/en/adversarial-attack-definition-and-protection-against-this-threat\",\n \"https://datascientest.com/en/all-about-dspy\",\n \"https://datascientest.com/en/arithmetic-and-data-science\",\n \"https://datascientest.com/en/all-about-machine-learning-metrics\",\n \"https://datascientest.com/en/all-about-procedural-programming\",\n \"https://datascientest.com/en/all-about-cryptography\",\n \"https://datascientest.com/en/all-about-predictive-coding\",\n \"https://datascientest.com/en/all-about-network-convergence\",\n \"https://datascientest.com/en/all-about-forensic-analysis\",\n \"https://datascientest.com/en/all-about-chatgpt-jailbreak\",\n \"https://datascientest.com/en/all-about-pentest\",\n \"https://datascientest.com/en/all-about-embedded-systems\",\n \"https://datascientest.com/en/all-about-network-operating-system\",\n \"https://datascientest.com/en/all-about-ai-and-cybersecurity\",\n \"https://datascientest.com/en/all-about-cybernetics\",\n \"https://datascientest.com/en/all-about-seo\",\n \"https://datascientest.com/en/all-about-expert-system\",\n \"https://datascientest.com/en/all-about-telecommunications\",\n \"https://datascientest.com/en/all-about-smart-cities\",\n \"https://datascientest.com/en/all-about-artificial-intelligence-and-finance-sector\",\n \"https://datascientest.com/en/all-about-generated-pre-trained-transformers\",\n \"https://datascientest.com/en/all-about-iso-27001\",\n \"https://datascientest.com/en/all-about-smart-sensors\",\n \"https://datascientest.com/en/all-about-virtual-networks\",\n \"https://datascientest.com/en/all-about-ethical-ai\",\n \"https://datascientest.com/en/all-about-saio\",\n \"https://datascientest.com/en/all-about-recommendation-algorithm\",\n \"https://www.geeksforgeeks.org/activation-functions-neural-networks/\",\n \"https://www.geeksforgeeks.org/activation-functions-in-neural-networks-set2/?ref=oin_asr1\",\n \"https://www.geeksforgeeks.org/choosing-the-right-activation-function-for-your-neural-network/?ref=oin_asr3\",\n \"https://www.geeksforgeeks.org/difference-between-feed-forward-neural-networks-and-recurrent-neural-networks/?ref=oin_asr2\",\n \"https://www.geeksforgeeks.org/recurrent-neural-networks-explanation/?ref=oin_asr11\",\n \"https://www.geeksforgeeks.org/deeppose-human-pose-estimation-via-deep-neural-networks/?ref=oin_asr13\",\n \"https://www.geeksforgeeks.org/auto-associative-neural-networks/?ref=oin_asr18\",\n \"https://www.geeksforgeeks.org/what-are-graph-neural-networks/?ref=oin_asr30\",\n \"https://hdsr.mitpress.mit.edu/pub/la3vitqm/release/2\",\n \"https://datasciencedojo.com/blog/a-guide-to-large-language-models/\",\n \"https://datasciencedojo.com/blog/bootstrap-sampling/\",\n \"https://datasciencedojo.com/blog/top-statistical-concepts/\",\n \"https://datasciencedojo.com/blog/probability-for-data-science/\",\n \"https://datasciencedojo.com/blog/top-statistical-techniques/\",\n \"https://datasciencedojo.com/blog/statistical-distributions/\",\n \"https://datasciencedojo.com/blog/data-science-in-finance/\",\n \"https://datasciencedojo.com/blog/random-forest-algorithm/\",\n \"https://datasciencedojo.com/blog/gini-index-and-entropy/\",\n \"https://datasciencedojo.com/blog/boosting-algorithms-in-machine-learning/\",\n \"https://datasciencedojo.com/blog/ensemble-methods-in-machine-learning/\",\n \"https://datasciencedojo.com/blog/langgraph-tutorial/\",\n \"https://datasciencedojo.com/blog/data-driven-marketing-in-2024/\",\n \"https://datasciencedojo.com/blog/on-device-ai/\",\n \"https://www.analyticsvidhya.com/blog/2023/10/a-comprehensive-guide-to-using-chains-in-langchain/\",\n \"https://blog.langchain.dev/langgraph/\",\n \"https://www.analyticsvidhya.com/blog/2024/09/passive-aggressive-algorithms/\",\n \"https://www.analyticsvidhya.com/blog/2017/09/common-machine-learning-algorithms/\",\n 'https://www.analyticsvidhya.com/blog/2023/09/retrieval-augmented-generation-rag-in-ai/',\n \"https://dl.acm.org/doi/full/10.1145/3547330\",\n \"https://www.datacamp.com/blog/what-is-natural-language-processing\",\n \"https://www.datacamp.com/blog/attention-mechanism-in-llms-intuition\",\n \"https://www.datacamp.com/tutorial/tutorial-natural-language-processing\",\n \"https://www.datacamp.com/blog/how-nlp-is-changing-the-future-of-data-science\",\n \"https://www.datacamp.com/blog/what-is-named-entity-recognition-ner\",\n \"https://www.datacamp.com/blog/ai-cybersecurity\",\n \"https://www.datacamp.com/blog/natural-language-understanding-nlu\",\n \"https://www.datacamp.com/blog/rlaif-reinforcement-learning-from-ai-feedback\",\n \"https://www.datacamp.com/blog/what-is-transfer-learning-in-ai-an-introductory-guide\",\n \"https://www.datacamp.com/blog/what-is-few-shot-learning\",\n \"https://www.datacamp.com/blog/what-is-continuous-learning\",\n \"https://www.datacamp.com/blog/what-is-tokenization\",\n \"https://www.datacamp.com/blog/curse-of-dimensionality-machine-learning\",\n \"https://www.datacamp.com/blog/what-is-overfitting\",\n \"https://www.datacamp.com/blog/what-is-an-algorithm\",\n \"https://www.datacamp.com/blog/what-is-a-generative-model\",\n \"https://www.datacamp.com/blog/what-is-online-machine-learning\",\n \"https://www.datacamp.com/blog/what-is-feature-learning\",\n \"https://www.datacamp.com/blog/what-is-cognitive-computing\",\n \"https://www.datacamp.com/blog/what-is-synthetic-data\",\n \"https://www.datacamp.com/blog/what-is-machine-perception\",\n \"https://www.datacamp.com/blog/introduction-to-unsupervised-learning\",\n \"https://www.datacamp.com/blog/what-is-machine-learning-inference\",\n \"https://www.datacamp.com/blog/machine-learning-models-explained\",\n \"https://www.datacamp.com/blog/top-machine-learning-interview-questions\",\n \"https://www.datacamp.com/blog/a-beginner-s-guide-to-the-machine-learning-workflow\",\n \"https://www.ibm.com/topics/artificial-intelligence-finance\",\n \"https://www.datacamp.com/blog/ai-in-finance\",\n \"https://www.oracle.com/erp/financials/ai-finance/\",\n \"https://www.geeksforgeeks.org/applications-of-ai/\",\n \"https://www.geeksforgeeks.org/super-intelligence-vs-artificial-intelligence/?ref=oin_asr2\",\n \"https://www.simplilearn.com/tutorials/artificial-intelligence-tutorial/artificial-intelligence-applications\",\n \"https://www.ncbi.nlm.nih.gov/pmc/articles/PMC9505413/\",\n \"https://www.nature.com/articles/s41592-024-02391-7\",\n \"https://www.nature.com/collections/ahhdhbhgha\",\n \"https://www.nationalacademies.org/news/2023/11/how-ai-is-shaping-scientific-discovery\",\n \"https://www.nationalacademies.org/news/2024/08/exploring-the-implications-of-ai-for-climate\",\n \"https://www.analyticsvidhya.com/blog/2017/09/common-machine-learning-algorithms/\",\n \"https://books.google.lt/books?id=JOOkDwAAQBAJ&printsec=frontcover&hl=lt#v=onepage&q&f=false\",\n \"https://www.geeksforgeeks.org/software-development-life-cycle-sdlc/\",\n \"https://www.geeksforgeeks.org/real-world-applications-of-sdlc-software-development-life-cycle/?ref=oin_asr3\",\n \"https://www.geeksforgeeks.org/software-engineering-comparison-of-different-life-cycle-models/?ref=oin_asr16\",\n \"https://www.geeksforgeeks.org/software-engineering-information-system-life-cycle/?ref=oin_asr2\",\n \"https://www.geeksforgeeks.org/difference-between-information-retrieval-and-information-extraction/?ref=oin_asr16\",\n \"https://www.geeksforgeeks.org/information-assurance-vs-information-security/?ref=oin_asr3\",\n \"https://www.geeksforgeeks.org/difference-between-software-security-and-cyber-security/?ref=oin_asr12\",\n \"https://www.geeksforgeeks.org/information-security-and-cyber-laws/?ref=oin_asr16\",\n \"https://www.geeksforgeeks.org/how-security-system-should-evolve-to-handle-cyber-security-threats-and-vulnerabilities/?ref=oin_asr4\",\n \"https://www.geeksforgeeks.org/a-simple-understanding-of-computer/\",\n \"https://www.geeksforgeeks.org/ethics-in-data-science-and-proper-privacy-and-usage-of-data/?ref=oin_asr12\",\n \"https://www.geeksforgeeks.org/data-visualization-interview-questions/\",\n 'https://www.geeksforgeeks.org/data-analyst-interview-questions-and-answers/',\n \"https://www.geeksforgeeks.org/python-for-machine-learning/\",\n \"https://www.geeksforgeeks.org/machine-learning-interview-questions/\",\n \"https://www.geeksforgeeks.org/image-processing-in-python/\",\n \"https://www.geeksforgeeks.org/text-preprocessing-in-python-set-1/\",\n \"https://www.geeksforgeeks.org/audio-processing-with-transformer/\",\n \"https://www.geeksforgeeks.org/nlp-interview-questions/\",\n 'https://www.geeksforgeeks.org/how-should-a-machine-learning-beginner-get-started-on-kaggle/?ref=oin_asr2',\n \"https://www.geeksforgeeks.org/getting-started-with-chatgpt-a-complete-guide-with-examples/?ref=oin_asr4\",\n \"https://www.geeksforgeeks.org/getting-started-with-classification/?ref=oin_asr7\",\n \"https://www.geeksforgeeks.org/getting-started-machine-learning/?ref=oin_asr7\",\n \"https://www.geeksforgeeks.org/bias-in-machine-learning-identifying-mitigating-and-preventing-discrimination/?ref=oin_asr6\",\n \"https://www.geeksforgeeks.org/understanding-hypothesis-testing/\",\n \"https://www.geeksforgeeks.org/mathematics-covariance-and-correlation/\",\n \"https://www.geeksforgeeks.org/confidence-interval/\",\n \"https://www.geeksforgeeks.org/normal-probability-plot/\",\n \"https://www.geeksforgeeks.org/mathematics-probability/\",\n \"https://www.geeksforgeeks.org/bayess-theorem-for-conditional-probability/\",\n \"https://www.geeksforgeeks.org/mathematics-probability-distributions-set-3-normal-distribution/?ref=rp\",\n \"https://blog.langchain.dev/langgraph-multi-agent-workflows/\",\n \"https://blog.langchain.dev/few-shot-prompting-to-improve-tool-calling-performance/\",\n \"https://www.microsoft.com/en-us/research/blog/graphrag-unlocking-llm-discovery-on-narrative-private-data/\",\n \"https://techcommunity.microsoft.com/t5/ai-azure-ai-services-blog/graphrag-costs-explained-what-you-need-to-know/ba-p/4207978\",\n \"https://www.mongodb.com/resources/basics/vector-stores\",\n 'https://www.pinecone.io/learn/vector-database/',\n \"https://www.pinecone.io/learn/vectors-and-graphs-better-together/\",\n \"https://blog.langchain.dev/semi-structured-multi-modal-rag/\",\n \"https://www.pinecone.io/learn/refine-with-rerank/\",\n \"https://www.datacamp.com/blog/what-is-text-embedding-ai\",\n \"https://www.datacamp.com/blog/what-is-bert-an-intro-to-bert-models\",\n \"https://www.datacamp.com/blog/what-is-an-llm-a-guide-on-large-language-models\"\n \n \n\n \n \n \n]","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:04:47.537404Z","iopub.execute_input":"2024-09-10T13:04:47.537710Z","iopub.status.idle":"2024-09-10T13:04:47.563850Z","shell.execute_reply.started":"2024-09-10T13:04:47.537677Z","shell.execute_reply":"2024-09-10T13:04:47.563011Z"},"trusted":true},"execution_count":4,"outputs":[]},{"cell_type":"code","source":"def extract_sentences_from_web(links, chunk_size=500, chunk_overlap=30):\n data = []\n for link in links:\n loader = NewsURLLoader(urls=[link])\n data += loader.load()\n return data \n\n# Call the function\ndocs = extract_sentences_from_web(links=urls)","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:04:47.566268Z","iopub.execute_input":"2024-09-10T13:04:47.566600Z","iopub.status.idle":"2024-09-10T13:07:34.650749Z","shell.execute_reply.started":"2024-09-10T13:04:47.566568Z","shell.execute_reply":"2024-09-10T13:07:34.649711Z"},"trusted":true},"execution_count":5,"outputs":[]},{"cell_type":"code","source":"docs_list = [item for sublist in docs for item in sublist]","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:07:34.652425Z","iopub.execute_input":"2024-09-10T13:07:34.653762Z","iopub.status.idle":"2024-09-10T13:07:34.658562Z","shell.execute_reply.started":"2024-09-10T13:07:34.653711Z","shell.execute_reply":"2024-09-10T13:07:34.657565Z"},"trusted":true},"execution_count":6,"outputs":[]},{"cell_type":"code","source":"\nfrom langchain_community.vectorstores.utils import filter_complex_metadata\n\n\n\n\n\n\ntext_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(\n chunk_size=550,\n chunk_overlap=40,\n separators=[\n r'\\n\\n\\n', # Separate large sections\n r'\\n\\s*\\n', # Blank lines separating paragraphs\n r'\\n\\n', # Double newlines\n r'\\.\\s*\\n', # Sentence endings followed by a newline\n r'(?<=\\n)(?=\\w)', # Newline followed by a word\n r'(?<=\\w)\\n', # Word followed by a newline\n r'\\s{2,}', # Multiple spaces\n r'(?<=:)\\s*(?=\\w)', # Colon followed by a space and word\n r'(?<=\\])\\s*(?=\\w)', # Closing bracket followed by a space and word\n r'(?<=})\\s*(?=\\w)', # Closing brace followed by a space and word\n r'(?<=\\d)\\.\\s+', # Number followed by a period and space\n r'\\n{2,}', # Multiple newlines\n r'⬆\\s*back\\s*to\\s*top', # \"⬆ back to top\" as a section separator\n \n ],\n is_separator_regex=True\n)\n\n\ndoc_splits = text_splitter.split_documents(docs)\nfiltered_documents = filter_complex_metadata(doc_splits)\n\nmodel_name = \"Alibaba-NLP/gte-base-en-v1.5\"\nmodel_kwargs = {'device': 'cpu',\n \"trust_remote_code\" : 'False'}\nencode_kwargs = {'normalize_embeddings': True}\nembeddings = HuggingFaceEmbeddings(\n model_name=model_name,\n model_kwargs=model_kwargs,\n encode_kwargs=encode_kwargs\n )\n\n\n\n\n","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:07:34.659807Z","iopub.execute_input":"2024-09-10T13:07:34.660157Z","iopub.status.idle":"2024-09-10T13:07:43.383167Z","shell.execute_reply.started":"2024-09-10T13:07:34.660122Z","shell.execute_reply":"2024-09-10T13:07:43.382425Z"},"trusted":true},"execution_count":7,"outputs":[{"name":"stderr","text":"/tmp/ipykernel_203/1276892896.py:39: LangChainDeprecationWarning: The class `HuggingFaceEmbeddings` was deprecated in LangChain 0.2.2 and will be removed in 1.0. An updated version of the class exists in the langchain-huggingface package and should be used instead. To use it run `pip install -U langchain-huggingface` and import as `from langchain_huggingface import HuggingFaceEmbeddings`.\n embeddings = HuggingFaceEmbeddings(\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"modules.json: 0%| | 0.00/229 [00:00 Dict [ str , str ]: return {} def get_record ( self ) -> Union [ Record , None ]: return Record ()\\n\\n⬆ back to top\\n\\nUse searchable names\\n\\nWe will read more code than we will ever write. It\\'s important that the code we do write is readable and searchable. By not naming variables that end up being meaningful for understanding our program, we hurt our readers. Make your names searchable.\\n\\nBad:\\n\\nimport time # What is the number 86400 for again? time . sleep ( 86400 )\\n\\nGood:')"},"metadata":{}}]},{"cell_type":"code","source":"filtered_documents[0]","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:20.332769Z","iopub.execute_input":"2024-09-10T13:24:20.333079Z","iopub.status.idle":"2024-09-10T13:24:20.342824Z","shell.execute_reply.started":"2024-09-10T13:24:20.333048Z","shell.execute_reply":"2024-09-10T13:24:20.341984Z"},"trusted":true},"execution_count":12,"outputs":[{"execution_count":12,"output_type":"execute_result","data":{"text/plain":"Document(metadata={'title': 'zedr/clean-code-python: :bathtub: Clean Code concepts adapted for Python', 'link': 'https://github.com/zedr/clean-code-python', 'language': 'en', 'description': ':bathtub: Clean Code concepts adapted for Python. Contribute to zedr/clean-code-python development by creating an account on GitHub.'}, page_content='Table of Contents\\n\\nIntroduction\\n\\nSoftware engineering principles, from Robert C. Martin\\'s book Clean Code , adapted for Python. This is not a style guide. It\\'s a guide to producing readable, reusable, and refactorable software in Python.\\n\\nNot every principle herein has to be strictly followed, and even fewer will be universally agreed upon. These are guidelines and nothing more, but they are ones codified over many years of collective experience by the authors of Clean Code.\\n\\nAdapted from clean-code-javascript\\n\\nTargets Python3.7+\\n\\nVariables\\n\\nUse meaningful and pronounceable variable names\\n\\nBad:\\n\\nimport datetime ymdstr = datetime . date . today (). strftime ( \"%y-%m-%d\" )\\n\\nAdditionally, there\\'s no need to add the type of the variable (str) to its name.\\n\\nGood:\\n\\nimport datetime current_date : str = datetime . date . today (). strftime ( \"%y-%m-%d\" )\\n\\n⬆ back to top\\n\\nUse the same vocabulary for the same type of variable\\n\\nBad: Here we use three different names for the same underlying entity:\\n\\ndef get_user_info (): pass def get_client_data (): pass def get_customer_record (): pass\\n\\nGood: If the entity is the same, you should be consistent in referring to it in your functions:\\n\\ndef get_user_info (): pass def get_user_data (): pass def get_user_record (): pass\\n\\nEven better Python is (also) an object oriented programming language. If it makes sense, package the functions together with the concrete implementation of the entity in your code, as instance attributes, property methods, or methods:\\n\\nfrom typing import Union , Dict class Record : pass class User : info : str @ property def data ( self ) -> Dict [ str , str ]: return {} def get_record ( self ) -> Union [ Record , None ]: return Record ()\\n\\n⬆ back to top\\n\\nUse searchable names\\n\\nWe will read more code than we will ever write. It\\'s important that the code we do write is readable and searchable. By not naming variables that end up being meaningful for understanding our program, we hurt our readers. Make your names searchable.\\n\\nBad:\\n\\nimport time # What is the number 86400 for again? time . sleep ( 86400 )\\n\\nGood:')"},"metadata":{}}]},{"cell_type":"code","source":"filtered_documents[2]","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:20.343999Z","iopub.execute_input":"2024-09-10T13:24:20.344538Z","iopub.status.idle":"2024-09-10T13:24:20.354087Z","shell.execute_reply.started":"2024-09-10T13:24:20.344495Z","shell.execute_reply":"2024-09-10T13:24:20.353229Z"},"trusted":true},"execution_count":13,"outputs":[{"execution_count":13,"output_type":"execute_result","data":{"text/plain":"Document(metadata={'title': 'zedr/clean-code-python: :bathtub: Clean Code concepts adapted for Python', 'link': 'https://github.com/zedr/clean-code-python', 'language': 'en', 'description': ':bathtub: Clean Code concepts adapted for Python. Contribute to zedr/clean-code-python development by creating an account on GitHub.'}, page_content='Good:\\n\\nlocations = ( \"Austin\" , \"New York\" , \"San Francisco\" ) for location in locations : # do_stuff() # do_some_other_stuff() # ... print ( location )\\n\\n⬆ back to top\\n\\nDon\\'t add unneeded context\\n\\nIf your class/object name tells you something, don\\'t repeat that in your variable name.\\n\\nBad:\\n\\nclass Car : car_make : str car_model : str car_color : str\\n\\nGood:\\n\\nclass Car : make : str model : str color : str\\n\\n⬆ back to top\\n\\nUse default arguments instead of short circuiting or conditionals\\n\\nTricky\\n\\nWhy write:\\n\\nimport hashlib def create_micro_brewery ( name ): name = \"Hipster Brew Co.\" if name is None else name slug = hashlib . sha1 ( name . encode ()). hexdigest () # etc.\\n\\n... when you can specify a default argument instead? This also makes it clear that you are expecting a string as the argument.\\n\\nGood:\\n\\nimport hashlib def create_micro_brewery ( name : str = \"Hipster Brew Co.\" ): slug = hashlib . sha1 ( name . encode ()). hexdigest () # etc.\\n\\n⬆ back to top\\n\\nFunctions\\n\\nFunctions should do one thing\\n\\nThis is by far the most important rule in software engineering. When functions do more than one thing, they are harder to compose, test, and reason about. When you can isolate a function to just one action, they can be refactored easily and your code will read much cleaner. If you take nothing else away from this guide other than this, you\\'ll be ahead of many developers.\\n\\nBad:\\n\\nfrom typing import List class Client : active : bool def email ( client : Client ) -> None : pass def email_clients ( clients : List [ Client ]) -> None : \"\"\"Filter active clients and send them an email. \"\"\" for client in clients : if client . active : email ( client )\\n\\nGood:')"},"metadata":{}}]},{"cell_type":"code","source":"filtered_documents[22]","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:20.355278Z","iopub.execute_input":"2024-09-10T13:24:20.355657Z","iopub.status.idle":"2024-09-10T13:24:20.369850Z","shell.execute_reply.started":"2024-09-10T13:24:20.355616Z","shell.execute_reply":"2024-09-10T13:24:20.369001Z"},"trusted":true},"execution_count":14,"outputs":[{"execution_count":14,"output_type":"execute_result","data":{"text/plain":"Document(metadata={'title': 'Python behind the scenes #10: how Python dictionaries work', 'link': 'https://tenthousandmeters.com/blog/python-behind-the-scenes-10-how-python-dictionaries-work/', 'language': 'en', 'description': \"Python dictionaries are an extremely important part of Python. Of course they are important because programmers use them a lot, but that's not the...\"}, page_content='where \\\\(base\\\\) is the size of the alphabet.\\n\\nWith this approach, different keys may map to the same bucket. In fact, if the number of possible keys is larger than the number of buckets, then some key will always map to the same bucket no matter what hash function we choose. So we have to find a way to handle hash collisions. One popular method to do that is called chaining. The idea of chaining is to associate an additional data structure with each bucket and store all the items that hash to the same bucket in that data structure. The following picture shows a hash table that uses linked lists for chaining:')"},"metadata":{}}]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from langchain.schema import Document\nfrom langchain_community.tools.tavily_search import TavilySearchResults\n\nweb_search_tool = ExaSearchRetriever(\n k=5, text_contents_options=TextContentsOptions(max_length=300))","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:20.370904Z","iopub.execute_input":"2024-09-10T13:24:20.371211Z","iopub.status.idle":"2024-09-10T13:24:20.388274Z","shell.execute_reply.started":"2024-09-10T13:24:20.371180Z","shell.execute_reply":"2024-09-10T13:24:20.387386Z"},"trusted":true},"execution_count":15,"outputs":[]},{"cell_type":"code","source":"llm = ChatGroq(\n model=\"gemma2-9b-it\", \n temperature=0.0,\n max_tokens=400,\n max_retries=3\n)","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:20.389380Z","iopub.execute_input":"2024-09-10T13:24:20.389663Z","iopub.status.idle":"2024-09-10T13:24:20.489668Z","shell.execute_reply.started":"2024-09-10T13:24:20.389633Z","shell.execute_reply":"2024-09-10T13:24:20.488996Z"},"trusted":true},"execution_count":16,"outputs":[]},{"cell_type":"code","source":"\nfrom langchain.prompts import PromptTemplate\nfrom langchain_core.output_parsers import StrOutputParser\n\nprompt = PromptTemplate(\n template=\"\"\"You are an assistant for question-answering tasks. \n \n Use the following pieces of retrieved documents to answer the question. If you don't know the answer, just say that you don't know.\n Do not repeat yourself!\n Be informative and consise.\n\n Question: {question} \n\n documents : {documents} \n\n Answer:\n \"\"\",\n input_variables=[\"question\", \"documents\"],\n)\n\n\n\nrag_chain = prompt | llm | StrOutputParser()","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:20.490598Z","iopub.execute_input":"2024-09-10T13:24:20.490869Z","iopub.status.idle":"2024-09-10T13:24:20.497168Z","shell.execute_reply.started":"2024-09-10T13:24:20.490839Z","shell.execute_reply":"2024-09-10T13:24:20.496178Z"},"trusted":true},"execution_count":17,"outputs":[]},{"cell_type":"code","source":"grammar = r\"\"\"\nroot ::= RagGrade\nGrade ::= \"{\" ws \"\\\"value\\\":\" ws string \"}\"\nGradelist ::= \"[]\" | \"[\" ws Grade (\",\" ws Grade)* \"]\"\nRagGrade ::= \"{\" ws \"\\\"grade\\\":\" ws Grade \"}\"\nRagGradelist ::= \"[]\" | \"[\" ws RagGrade (\",\" ws RagGrade)* \"]\"\nstring ::= \"\\\"\" ([^\"]*) \"\\\"\"\nboolean ::= \"true\" | \"false\"\nws ::= [ \\t\\n]*\nnumber ::= [0-9]+ \".\"? [0-9]*\nstringlist ::= \"[\" ws \"]\" | \"[\" ws string (\",\" ws string)* ws \"]\"\nnumberlist ::= \"[\" ws \"]\" | \"[\" ws string (\",\" ws number)* ws \"]\"\n\"\"\"","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:20.497982Z","iopub.execute_input":"2024-09-10T13:24:20.498278Z","iopub.status.idle":"2024-09-10T13:24:20.512462Z","shell.execute_reply.started":"2024-09-10T13:24:20.498247Z","shell.execute_reply":"2024-09-10T13:24:20.511731Z"},"trusted":true},"execution_count":18,"outputs":[]},{"cell_type":"code","source":"from langchain_core.pydantic_v1 import BaseModel, Field\n\n\n# Data model for the output\nclass GradeDocuments(BaseModel):\n \"\"\"Binary score for relevance check on retrieved documents.\"\"\"\n\n binary_score: str = Field(\n description=\"Documents are relevant to the question, 'yes' or 'no'\"\n )\n\n\n# LLM with tool call\nstructured_llm_grader = llm.with_structured_output(GradeDocuments)\n\nprompt = PromptTemplate(\n template=\"\"\"You are a teacher grading a quiz. You will be given: \n 1/ a QUESTION\n 2/ A FACT provided by the student\n \n You are grading RELEVANCE RECALL:\n A score of 1 means that ANY of the statements in the FACT are relevant to the QUESTION. \n A score of 0 means that NONE of the statements in the FACT are relevant to the QUESTION. \n 1 is the highest (best) score. 0 is the lowest score you can give. \n \n Explain your reasoning in a step-by-step manner. Ensure your reasoning and conclusion are correct. \n \n Avoid simply stating the correct answer at the outset.\n \n Question: {question} \\n\n Fact: \\n\\n {documents} \\n\\n\n \n Give a binary score 'yes' or 'no' score to indicate whether the document is relevant to the question. \\n\n Provide the binary score as a JSON with a single key 'score' and no premable or explanation.\n \"\"\",\n input_variables=['documents', 'question'],\n)\n\n\nretrieval_grader = prompt | structured_llm_grader","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:20.513466Z","iopub.execute_input":"2024-09-10T13:24:20.513733Z","iopub.status.idle":"2024-09-10T13:24:20.526789Z","shell.execute_reply.started":"2024-09-10T13:24:20.513703Z","shell.execute_reply":"2024-09-10T13:24:20.526106Z"},"trusted":true},"execution_count":19,"outputs":[]},{"cell_type":"code","source":"class PromtGuard(BaseModel):\n \"\"\"Binary score for toxicity check on question.\"\"\"\n\n score: str = Field(\n description=\"Is the question toxic, 'yes' or 'no'\"\n )\n\n\n# LLM with tool call\nstructured_llm_toxicity_checker = llm.with_structured_output(PromtGuard)\n\nprompt = PromptTemplate(\n template=\"\"\"You are a classifier that will score a text include based upon supplied criteria. \n\nHere is the criteria for scoring:\n\n(1) insults\n\n(2) threats\n\n(3) highly negative comments\n\n(4) any Personally Identifiable Information such as API Keys\n\nScore:\n\nA score of yes means that the text meets ANY of the criteria. \n\nA score of no means that the text does not meet ALL of the criteria. \n Here is the question: {question}\n Give a binary score 'yes' or 'no' to indicate whether the answer is useful to resolve a question.\n If the answer contains repeated phrases, repetition, then return 'no'\\n\n Provide the binary score as a JSON with a single key 'score' and no preamble or explanation.\"\"\",\n input_variables=[ \"question\"],\n)\n\ntoxicity_grader = prompt | structured_llm_toxicity_checker\n","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:20.527934Z","iopub.execute_input":"2024-09-10T13:24:20.528311Z","iopub.status.idle":"2024-09-10T13:24:20.550456Z","shell.execute_reply.started":"2024-09-10T13:24:20.528269Z","shell.execute_reply":"2024-09-10T13:24:20.549735Z"},"trusted":true},"execution_count":20,"outputs":[]},{"cell_type":"code","source":"toxicity_grader.invoke({\"question\": \"What up nigger?\"})","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:20.553211Z","iopub.execute_input":"2024-09-10T13:24:20.553762Z","iopub.status.idle":"2024-09-10T13:24:20.983063Z","shell.execute_reply.started":"2024-09-10T13:24:20.553701Z","shell.execute_reply":"2024-09-10T13:24:20.982196Z"},"trusted":true},"execution_count":21,"outputs":[{"execution_count":21,"output_type":"execute_result","data":{"text/plain":"PromtGuard(score='yes')"},"metadata":{}}]},{"cell_type":"code","source":"def grade_question_toxicity(state):\n \"\"\"\n Grades the question for toxicity.\n \n Args:\n state (dict): The current graph state.\n \n Returns:\n str: 'good' if the question passes the toxicity check, 'bad' otherwise.\n \"\"\"\n steps = state[\"steps\"]\n steps.append(\"promt guard\")\n score = toxicity_grader.invoke({\"question\": state[\"question\"]})\n grade = getattr(score, 'score', None)\n \n if grade == \"yes\":\n return \"bad\" \n else:\n return \"good\"\n ","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:20.984298Z","iopub.execute_input":"2024-09-10T13:24:20.984674Z","iopub.status.idle":"2024-09-10T13:24:20.990873Z","shell.execute_reply.started":"2024-09-10T13:24:20.984628Z","shell.execute_reply":"2024-09-10T13:24:20.990010Z"},"trusted":true},"execution_count":22,"outputs":[]},{"cell_type":"code","source":"class GradeHelpfulness(BaseModel):\n \"\"\"Binary score for Helpfulness check on answer.\"\"\"\n\n score: str = Field(\n description=\"Is the answer helpfulness, 'yes' or 'no'\"\n )\n\n\n# LLM with tool call\nstructured_llm_helpfulness_checker = llm.with_structured_output(GradeHelpfulness)\n\nprompt = PromptTemplate(\n template=\"\"\"You will be given a QUESTION and a STUDENT ANSWER. \n\n Here is the grade criteria to follow:\n\n (1) Ensure the STUDENT ANSWER is concise and relevant to the QUESTION\n\n (2) Ensure the STUDENT ANSWER helps to answer the QUESTION\n\n Score:\n\n A score of yes means that the student's answer meets all of the criteria. This is the highest (best) score. \n\n A score of no means that the student's answer does not meet all of the criteria. This is the lowest possible score you can give.\n\nExplain your reasoning in a step-by-step manner to ensure your reasoning and conclusion are correct. \n\nAvoid simply stating the correct answer at the outset.\n \n If the answer contains repeated phrases, repetition, then return 'no'\\n\n Provide the binary score as a JSON with a single key 'score' and no preamble or explanation.\"\"\",\n input_variables=[\"generation\", \"question\"],\n)\n\nanswer_grader = prompt | structured_llm_helpfulness_checker\n","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:20.992091Z","iopub.execute_input":"2024-09-10T13:24:20.992387Z","iopub.status.idle":"2024-09-10T13:24:21.007690Z","shell.execute_reply.started":"2024-09-10T13:24:20.992354Z","shell.execute_reply":"2024-09-10T13:24:21.006836Z"},"trusted":true},"execution_count":23,"outputs":[]},{"cell_type":"code","source":"answer_grader.invoke({\"question\": \"Who won the NBA finals in 2024\" , \"generation\": \"The Champions of NBA in 2024 was Boston Celtics\"})","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:21.008768Z","iopub.execute_input":"2024-09-10T13:24:21.009165Z","iopub.status.idle":"2024-09-10T13:24:21.339498Z","shell.execute_reply.started":"2024-09-10T13:24:21.009131Z","shell.execute_reply":"2024-09-10T13:24:21.338667Z"},"trusted":true},"execution_count":24,"outputs":[{"execution_count":24,"output_type":"execute_result","data":{"text/plain":"GradeHelpfulness(score='yes')"},"metadata":{}}]},{"cell_type":"code","source":"def grade_document_relevance(question: str, document: str):\n input_data = {\"documents\": documents,\"question\": question, }\n try:\n result = retrieval_grader.invoke(input_data)\n return result\n except Exception as e:\n print(f\"Error parsing result: {e}\")\n return {\"score\": \"no\"} # Default to \"no\" if there is an error\n\nquestion = \"What are the types of agent memory?\"\ndocuments = \"Agents can have various types of memory, such as short-term memory and long-term memory.\"\ngrade = grade_document_relevance(documents,question )\nprint(grade) # Expected output: {'value': 'yes'}","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:21.340654Z","iopub.execute_input":"2024-09-10T13:24:21.341031Z","iopub.status.idle":"2024-09-10T13:24:21.666524Z","shell.execute_reply.started":"2024-09-10T13:24:21.340987Z","shell.execute_reply":"2024-09-10T13:24:21.665720Z"},"trusted":true},"execution_count":25,"outputs":[{"name":"stdout","text":"binary_score='yes'\n","output_type":"stream"}]},{"cell_type":"code","source":"class GradeHaliucinations(BaseModel):\n \"\"\"Binary score for haliucinations check on answer.\"\"\"\n\n score: str = Field(\n description=\"Answer contains haliucinations, 'yes' or 'no'\"\n )\n\n\nstructured_llm_haliucinations_checker = llm.with_structured_output(GradeHaliucinations)\n\nprompt = PromptTemplate(\n template=\"\"\"You are a teacher grading a quiz. \n\nYou will be given FACTS and a STUDENT ANSWER. \n\nYou are grading STUDENT ANSWER of source FACTS. Focus on correctness of the STUDENT ANSWER and detection of any hallucinations.\n\nEnsure that the STUDENT ANSWER meets the following criteria: \n\n(1) it does not contain information outside of the FACTS\n\n(2) the STUDENT ANSWER should be fully grounded in and based upon information in the source documents\n\n\nScore:\n\nA score of yes means that the student's answer meets all of the criteria. This is the highest (best) score. \n\nA score of no means that the student's answer does not meet all of the criteria. This is the lowest possible score you can give.\n\nExplain your reasoning in a step-by-step manner to ensure your reasoning and conclusion are correct. \n\nAvoid simply stating the correct answer at the outset.\nSTUDENT ANSWER: {generation} \\n\n Fact: \\n\\n {documents} \\n\\n\n \n Give a binary score 'yes' or 'no' score to indicate whether the document is relevant to the question. \\n\n Provide the binary score as a JSON with a single key 'score' and no premable or explanation.\n\"\"\",\n input_variables=[\"generation\", \"documents\"],\n)\n\nhallucination_grader = prompt | structured_llm_haliucinations_checker\n","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:21.667644Z","iopub.execute_input":"2024-09-10T13:24:21.668023Z","iopub.status.idle":"2024-09-10T13:24:21.676739Z","shell.execute_reply.started":"2024-09-10T13:24:21.667980Z","shell.execute_reply":"2024-09-10T13:24:21.675865Z"},"trusted":true},"execution_count":26,"outputs":[]},{"cell_type":"code","source":"hallucination_grader.invoke({'generation': \"Boston celtics won NBA in 2024\", 'documents' : \"The champions of Nba in 2024 was The Boston Celtics\"})","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:21.677786Z","iopub.execute_input":"2024-09-10T13:24:21.678096Z","iopub.status.idle":"2024-09-10T13:24:22.012286Z","shell.execute_reply.started":"2024-09-10T13:24:21.678065Z","shell.execute_reply":"2024-09-10T13:24:22.011439Z"},"trusted":true},"execution_count":27,"outputs":[{"execution_count":27,"output_type":"execute_result","data":{"text/plain":"GradeHaliucinations(score='no')"},"metadata":{}}]},{"cell_type":"code","source":"re_write_prompt = PromptTemplate(\n template=\"\"\"You are a question re-writer that converts an input question to a better version that is optimized for vector store retrieval.\\n\n Your task is to enhance the question by clarifying the intent, removing any ambiguity, and including specific details to retrieve the most relevant information.. \\n\n I dont' need explanations, only enhanced question.\n Here is the initial question: \\n\\n {question}. Improved question with no preamble: \\n \"\"\",\n input_variables=[\"question\", \"question\"],\n)\n\nquestion_rewriter = re_write_prompt | llm | StrOutputParser()","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:22.013561Z","iopub.execute_input":"2024-09-10T13:24:22.013928Z","iopub.status.idle":"2024-09-10T13:24:22.019085Z","shell.execute_reply.started":"2024-09-10T13:24:22.013886Z","shell.execute_reply":"2024-09-10T13:24:22.018202Z"},"trusted":true},"execution_count":28,"outputs":[]},{"cell_type":"code","source":"def transform_query(state):\n \"\"\"\n Transform the query to produce a better question.\n\n Args:\n state (dict): The current graph state\n\n Returns:\n state (dict): Updates question key with a re-phrased question\n \"\"\"\n\n print(\"---TRANSFORM QUERY---\")\n question = state[\"question\"]\n documents = state[\"documents\"]\n steps = state[\"steps\"]\n steps.append(\"question_transformation\")\n\n # Re-write question\n better_question = question_rewriter.invoke({\"question\": question})\n print(f\" Transformed question: {better_question}\")\n return {\"documents\": documents, \"question\": better_question}\n","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:22.027131Z","iopub.execute_input":"2024-09-10T13:24:22.027822Z","iopub.status.idle":"2024-09-10T13:24:22.035332Z","shell.execute_reply.started":"2024-09-10T13:24:22.027788Z","shell.execute_reply":"2024-09-10T13:24:22.034619Z"},"trusted":true},"execution_count":29,"outputs":[]},{"cell_type":"code","source":"not_supported_count = 0","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:22.036392Z","iopub.execute_input":"2024-09-10T13:24:22.036688Z","iopub.status.idle":"2024-09-10T13:24:22.046986Z","shell.execute_reply.started":"2024-09-10T13:24:22.036657Z","shell.execute_reply":"2024-09-10T13:24:22.046255Z"},"trusted":true},"execution_count":30,"outputs":[]},{"cell_type":"code","source":"from langchain.schema import Document\n\ndef format_google_results(google_results):\n formatted_documents = []\n \n # Loop through each organic result and create a Document for it\n for result in google_results['organic']:\n title = result.get('title', 'No title')\n link = result.get('link', 'No link')\n snippet = result.get('snippet', 'No summary available')\n\n # Create a Document object with similar metadata structure to WikipediaRetriever\n document = Document(\n metadata={\n 'title': title,\n 'summary': snippet,\n 'source': link\n },\n page_content=snippet # Using the snippet as the page content\n )\n \n formatted_documents.append(document)\n \n return formatted_documents","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:22.048004Z","iopub.execute_input":"2024-09-10T13:24:22.048365Z","iopub.status.idle":"2024-09-10T13:24:22.058023Z","shell.execute_reply.started":"2024-09-10T13:24:22.048321Z","shell.execute_reply":"2024-09-10T13:24:22.057141Z"},"trusted":true},"execution_count":31,"outputs":[]},{"cell_type":"code","source":"def grade_generation_v_documents_and_question(state):\n \"\"\"\n Determines whether the generation is grounded in the document and answers the question.\n \"\"\"\n print(\"---CHECK HALLUCINATIONS---\")\n question = state[\"question\"]\n documents = state[\"documents\"]\n generation = state[\"generation\"]\n generation_count = state.get(\"generation_count\") # Use state.get to avoid KeyError\n print(f\" generation number: {generation_count}\")\n \n # Grading hallucinations\n score = hallucination_grader.invoke(\n {\"documents\": documents, \"generation\": generation}\n )\n grade = getattr(score, 'score', None)\n\n # Check hallucination\n if grade == \"yes\":\n print(\"---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\")\n # Check question-answering\n print(\"---GRADE GENERATION vs QUESTION---\")\n score = answer_grader.invoke({\"question\": question, \"generation\": generation})\n grade = getattr(score, 'score', None)\n if grade == \"yes\":\n print(\"---DECISION: GENERATION ADDRESSES QUESTION---\")\n return \"useful\"\n else:\n print(\"---DECISION: GENERATION DOES NOT ADDRESS QUESTION---\")\n return \"not useful\"\n else:\n if generation_count > 1:\n print(\"---DECISION: GENERATION IS NOT GROUNDED IN DOCUMENTS, TRANSFORM QUERY---\")\n # Reset count if it exceeds limit\n return \"not useful\"\n else:\n print(\"---DECISION: GENERATION IS NOT GROUNDED IN DOCUMENTS, RE-TRY---\")\n # Increment correctly here\n print(f\" generation number after increment: {state['generation_count']}\")\n return \"not supported\"","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:22.059331Z","iopub.execute_input":"2024-09-10T13:24:22.060097Z","iopub.status.idle":"2024-09-10T13:24:22.074870Z","shell.execute_reply.started":"2024-09-10T13:24:22.060062Z","shell.execute_reply":"2024-09-10T13:24:22.074165Z"},"trusted":true},"execution_count":32,"outputs":[]},{"cell_type":"code","source":"from typing_extensions import TypedDict, List\nfrom IPython.display import Image, display\nfrom langgraph.graph import START, END, StateGraph\nfrom langchain.schema import Document\n\nclass GraphState(TypedDict):\n \"\"\"\n Represents the state of our graph.\n\n Attributes:\n question: question\n generation: LLM generation\n search: whether to add search\n documents: list of documents\n generations_count : generations count\n \"\"\"\n\n question: str\n generation: str\n search: str\n documents: List[str]\n steps: List[str]\n generation_count: int\n\ndef ask_question(state):\n \"\"\"\n Initialize question\n\n Args:\n state (dict): The current graph state\n\n Returns:\n state (dict): Question\n \"\"\"\n steps = state[\"steps\"]\n question = state[\"question\"]\n generations_count = state.get(\"generations_count\", 0) \n documents = retriever.invoke(question)\n \n steps.append(\"question_asked\")\n return {\"question\": question, \"steps\": steps,\"generation_count\": generations_count}\n \n \ndef retrieve(state):\n \"\"\"\n Retrieve documents\n\n Args:\n state (dict): The current graph state\n\n Returns:\n state (dict): New key added to state, documents, that contains retrieved documents\n \"\"\"\n steps = state[\"steps\"]\n question = state[\"question\"]\n \n documents = retriever.invoke(question)\n \n steps.append(\"retrieve_documents\")\n return {\"documents\": documents, \"question\": question, \"steps\": steps}\n\n\ndef generate(state):\n \"\"\"\n Generate answer\n \"\"\"\n question = state[\"question\"]\n documents = state[\"documents\"]\n generation = rag_chain.invoke({\"documents\": documents, \"question\": question})\n steps = state[\"steps\"]\n steps.append(\"generate_answer\")\n generation_count = state[\"generation_count\"]\n \n generation_count += 1\n \n return {\n \"documents\": documents,\n \"question\": question,\n \"generation\": generation,\n \"steps\": steps,\n \"generation_count\": generation_count # Include generation_count in return\n }\n\n\ndef grade_documents(state):\n question = state[\"question\"]\n documents = state[\"documents\"]\n steps = state[\"steps\"]\n steps.append(\"grade_document_retrieval\")\n \n filtered_docs = []\n web_results_list = []\n search = \"No\"\n \n for d in documents:\n # Call the grading function\n score = retrieval_grader.invoke({\"question\": question, \"documents\": d.page_content})\n print(f\"Grader output for document: {score}\") # Detailed debugging output\n \n # Extract the grade\n grade = getattr(score, 'binary_score', None)\n if grade and grade.lower() in [\"yes\", \"true\", \"1\"]:\n filtered_docs.append(d)\n elif len(filtered_docs) < 4: \n search = \"Yes\"\n \n # Check the decision-making process\n print(f\"Final decision - Perform web search: {search}\")\n print(f\"Filtered documents count: {len(filtered_docs)}\")\n \n return {\n \"documents\": filtered_docs,\n \"question\": question,\n \"search\": search,\n \"steps\": steps,\n }\n\ndef web_search(state):\n question = state[\"question\"]\n documents = state.get(\"documents\")\n steps = state[\"steps\"]\n steps.append(\"web_search\")\n k = 4 - len(documents)\n good_wiki_splits = []\n good_exa_splits = []\n web_results_list = []\n\n wiki_results = WikipediaRetriever( lang = 'en',top_k_results = 1,doc_content_chars_max = 1000).invoke(question)\n \n \n if k<1:\n combined_documents = documents + wiki_results \n else:\n web_results = GoogleSerperAPIWrapper(k = k).results(question)\n formatted_documents = format_google_results(web_results)\n for doc in formatted_documents:\n web_results_list.append(doc)\n \n \n combined_documents = documents + wiki_results + web_results_list\n\n return {\"documents\": combined_documents, \"question\": question, \"steps\": steps}\n\ndef decide_to_generate(state):\n \"\"\"\n Determines whether to generate an answer, or re-generate a question.\n\n Args:\n state (dict): The current graph state\n\n Returns:\n str: Binary decision for next node to call\n \"\"\"\n search = state[\"search\"]\n if search == \"Yes\":\n return \"search\"\n else:\n return \"generate\"\n\n\n# Graph\nworkflow = StateGraph(GraphState)\n\n# Define the nodes\nworkflow.add_node(\"ask_question\", ask_question)\nworkflow.add_node(\"retrieve\", retrieve) # retrieve\nworkflow.add_node(\"grade_documents\", grade_documents) # grade documents\nworkflow.add_node(\"generate\", generate) # generatae\nworkflow.add_node(\"web_search\", web_search) # web search\nworkflow.add_node(\"transform_query\", transform_query)\n\n\n# Build graph\nworkflow.set_entry_point(\"ask_question\")\nworkflow.add_conditional_edges(\n \"ask_question\",\n grade_question_toxicity,\n \n {\n \"good\": \"retrieve\",\n 'bad': END,\n \n },\n)\n\nworkflow.add_edge(\"retrieve\", \"grade_documents\")\nworkflow.add_conditional_edges(\n \"grade_documents\",\n decide_to_generate,\n {\n \"search\": \"web_search\",\n \"generate\": \"generate\",\n \n },\n)\nworkflow.add_edge(\"web_search\", \"generate\")\nworkflow.add_conditional_edges(\n \"generate\",\n grade_generation_v_documents_and_question,\n {\n \"not supported\": \"generate\",\n \"useful\": END,\n \"not useful\": \"transform_query\",\n },\n)\n\nworkflow.add_edge(\"transform_query\", \"retrieve\")\n\ncustom_graph = workflow.compile()\n\ndisplay(Image(custom_graph.get_graph(xray=True).draw_mermaid_png()))","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:22.076066Z","iopub.execute_input":"2024-09-10T13:24:22.076343Z","iopub.status.idle":"2024-09-10T13:24:23.223047Z","shell.execute_reply.started":"2024-09-10T13:24:22.076313Z","shell.execute_reply":"2024-09-10T13:24:23.221908Z"},"trusted":true},"execution_count":33,"outputs":[{"output_type":"display_data","data":{"image/jpeg":"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4y2Y3FjKcp6yRv5pCWAva3YEEb7LsryJd9gf0h71g57RPnNg8jh8lSNnHZCtJUsw9rydpFI0te3maQRu0kbgg/Eg5z0ReyPFHV/BVuP0xnMVS0q0Xshl8tRdViINMwthgc79153PBJbu3lbvuV2Oofg9LyYSHH1K1XsadRscUbOfm5GMAAG5JJ2A9fVTBAREQEREBERAREQEREBERAREQEREBERAREQEREBaXOZiVsxxOKmrtz00BmhFqKSSGJgc1plkDPUOYlrC5hkLS0Obs5zdhlLj8djbVqKrNelhidIyrX5e0mcBuGN5iBuT0G5A69SB1WNgMdLQqSyWJrUtq3K61KyzP2vYudt96ZsA0MYAGgADfbmO7nOcQ98biKuJFnxZjmuszvszPkkdI98jj1Jc4k7AANA7mta1rQGtAGYiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAo9ofGHE4i3AcQ3CB2UyFgV2z9sJO0tyydvvudjKXmUt/BMnLsNtlsc9qDF6WxU+UzWSp4jGQcva3b87IIY+Zwa3me4gDdzgBuepIHrVf8JuJOhsm2xhsNndNsydrKZGzFi8bnoL0tgPtTSmcBr3O++NJmLB8DnLegagtBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREEbzdOPPaoxVCxRrXKNFpyb5ZLO0kFlrg2ttCPhA7zu5ndGuibsCerJIo5puATah1NkH1se2R9mKnHZqSdpNLBFE0hs/4rmyy2AGDuaQe9xUjQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERARFFOIth7cVQqB7mRX78NWblJBdGdy5u4IIBDdj8xK9MOjpK4o2rGt7WOJmkqsz4pdTYlkjCWuabke7T6wevevP7qmjvlRifrkfvX3BBHWhZFDG2KJg5WsY0BrR8QA7l9rb0WDsn3jkanj91TR3yoxP1yP3p91TR3yoxP1yP3r2RXosHZPvHJdSDcZLGgOMXC/UejshqnEMr5WqYmyG4z71K0h8Unf15ZGsdt8y5W/7PDhZheE9jU2rdZZPG47PvlfiqFezZjDmQtd98mbue55DQ1w72tPqcu4kTosHZPvHI1PH7qmjvlRifrkfvT7qmjvlRifrk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","text/plain":""},"metadata":{}}]},{"cell_type":"code","source":"WikipediaRetriever( lang = 'en',top_k_results = 1,doc_content_chars_max = 1000).invoke(\"Who was the first king of Lithuania\")","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:23.224552Z","iopub.execute_input":"2024-09-10T13:24:23.224986Z","iopub.status.idle":"2024-09-10T13:24:24.529686Z","shell.execute_reply.started":"2024-09-10T13:24:23.224915Z","shell.execute_reply":"2024-09-10T13:24:24.528720Z"},"trusted":true},"execution_count":34,"outputs":[{"execution_count":34,"output_type":"execute_result","data":{"text/plain":"[Document(metadata={'title': 'Kingdom of Lithuania', 'summary': \"The Kingdom of Lithuania was a sovereign state that existed from the 17 July 1251 until the death of the first crowned king of Lithuania, Mindaugas, on 12 September 1263. Mindaugas was the only Lithuanian monarch crowned king with the assent of the Pope and the head of the first catholic Lithuanian state. The formation of the kingdom is widely regarded as a partially successful attempt at unifying all surrounding Baltic tribes, including the Old Prussians, into a single unified state under a common king.\\nOther monarchs of Lithuania were referred to as grand dukes, kings or emperors in extant foreign written sources as the size of the realm and their power expanded or contracted. This practice can be compared to that of British, Japanese and many other monarchs who are known as kings or emperors in spite of not being crowned with the assent of the Pope. Because Lithuania was pagan in the 13th century, Lithuanian monarchs were not granted the title of a Catholic monarch even though extant Christian sources referred to Lithuanian rulers as kings or emperors regardless of their religious affiliation. For instance, Gediminas titled himself King of Lithuania and Rus, and Duke of Semigalia. The Pope also addressed him as King. \\nThe confusion stems from eastern and western European traditions of royal hierarchy and titles. In Eastern Europe, the title of grand duke equalled king and sometimes emperor. In Western Europe, the title of grand duke is reserved to monarchs of small polities and ranks junior to king and emperor.\\nAfter the formal Christianization and especially after the creation of the personal union with Poland, the Kings of Poland–Lithuania retained the separate titles of Grand Dukes of Lithuania and Kings of Poland (similarly to how the Emperors of Austria–Hungary had retained the separate titles of Emperor of Austria and King of Hungary, to some extent).\\nThe Catholic crown was to be received from the Pope or Holy Roman Emperor, but being multireligious and powerful, Lithuania was not subservient to either and with rare exceptions did not pursue the title. For diplomatic reasons three further attempts were made to re-establish the Kingdom status – by Vytautas the Great in 1430, by Švitrigaila who wanted to continue Vytautas' attempts at the coronation, and by the Council of Lithuania in 1918.\", 'source': 'https://en.wikipedia.org/wiki/Kingdom_of_Lithuania'}, page_content='The Kingdom of Lithuania was a sovereign state that existed from the 17 July 1251 until the death of the first crowned king of Lithuania, Mindaugas, on 12 September 1263. Mindaugas was the only Lithuanian monarch crowned king with the assent of the Pope and the head of the first catholic Lithuanian state. The formation of the kingdom is widely regarded as a partially successful attempt at unifying all surrounding Baltic tribes, including the Old Prussians, into a single unified state under a common king.\\nOther monarchs of Lithuania were referred to as grand dukes, kings or emperors in extant foreign written sources as the size of the realm and their power expanded or contracted. This practice can be compared to that of British, Japanese and many other monarchs who are known as kings or emperors in spite of not being crowned with the assent of the Pope. Because Lithuania was pagan in the 13th century, Lithuanian monarchs were not granted the title of a Catholic monarch even though extan')]"},"metadata":{}}]},{"cell_type":"code","source":"GoogleSerperAPIWrapper(k = 4).results(\"Who was the first king of Lithuania?\")","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:24.531046Z","iopub.execute_input":"2024-09-10T13:24:24.531511Z","iopub.status.idle":"2024-09-10T13:24:25.225895Z","shell.execute_reply.started":"2024-09-10T13:24:24.531465Z","shell.execute_reply":"2024-09-10T13:24:25.225002Z"},"trusted":true},"execution_count":35,"outputs":[{"execution_count":35,"output_type":"execute_result","data":{"text/plain":"{'searchParameters': {'q': 'Who was the first king of Lithuania?',\n 'gl': 'us',\n 'hl': 'en',\n 'type': 'search',\n 'num': 4,\n 'engine': 'google'},\n 'organic': [{'title': 'List of Lithuanian monarchs - Wikipedia',\n 'link': 'https://en.wikipedia.org/wiki/List_of_Lithuanian_monarchs',\n 'snippet': 'The hereditary monarchy in Lithuania was first established in the 13th century during the reign of Mindaugas I and officially re-established as a ...',\n 'sitelinks': [{'title': 'Titles',\n 'link': 'https://en.wikipedia.org/wiki/List_of_Lithuanian_monarchs#Titles'},\n {'title': 'Inaugurations of Lithuanian...',\n 'link': 'https://en.wikipedia.org/wiki/List_of_Lithuanian_monarchs#Inaugurations_of_Lithuanian_monarchs'},\n {'title': 'List',\n 'link': 'https://en.wikipedia.org/wiki/List_of_Lithuanian_monarchs#List'},\n {'title': 'Union of Lublin',\n 'link': 'https://en.wikipedia.org/wiki/List_of_Lithuanian_monarchs#Union_of_Lublin'}],\n 'position': 1},\n {'title': 'Kingdom of Lithuania - Wikipedia',\n 'link': 'https://en.wikipedia.org/wiki/Kingdom_of_Lithuania',\n 'snippet': 'The Kingdom of Lithuania was a sovereign state that existed from the 17 July 1251 until the death of the first crowned king of Lithuania, Mindaugas, on 12 ...',\n 'sitelinks': [{'title': 'King Mindaugas',\n 'link': 'https://en.wikipedia.org/wiki/Kingdom_of_Lithuania#King_Mindaugas'},\n {'title': 'Attempts to re-establish the...',\n 'link': 'https://en.wikipedia.org/wiki/Kingdom_of_Lithuania#Attempts_to_re-establish_the_Kingdom'}],\n 'position': 2},\n {'title': 'Mindaugas | Grand Duke, Lithuania, Coronation | Britannica',\n 'link': 'https://www.britannica.com/biography/Mindaugas',\n 'snippet': 'Mindaugas (died 1263) was a ruler of Lithuania, considered the founder of the Lithuanian state. He was also the first Lithuanian ruler to become a Christian.',\n 'position': 3},\n {'title': 'Historical development - Eurydice - European Union',\n 'link': 'https://eurydice.eacea.ec.europa.eu/national-education-systems/lithuania/historical-development',\n 'snippet': \"Mindaugas was the first king in Lithuania's history. At the end of the 12th century, on the basis of the Duchy of Lithuania that was joined by ...\",\n 'date': 'Nov 27, 2023',\n 'position': 4}],\n 'relatedSearches': [{'query': 'Who was the first king of lithuania before ww2'},\n {'query': 'Who was the last King of Lithuania'},\n {'query': 'king of lithuania (1918)'},\n {'query': 'King of Lithuania 2024'},\n {'query': 'Lithuanian Royal family Tree'},\n {'query': 'King Mindaugas'},\n {'query': 'Grand Duchy of Lithuania'},\n {'query': 'Polish-Lithuanian Commonwealth'}],\n 'credits': 1}"},"metadata":{}}]},{"cell_type":"code","source":"import uuid\n\nasync def predict_custom_agent_answer(example: dict):\n config = {\"configurable\": {\"thread_id\": str(uuid.uuid4())}}\n \n try:\n state_dict = await custom_graph.ainvoke(\n {\"question\": example[\"input\"], \"steps\": []}, config\n )\n \n if 'generation' in state_dict and state_dict['generation']:\n return {\"response\": state_dict[\"generation\"], \"steps\": state_dict[\"steps\"]}\n else:\n print(\"Your question violates toxicity rules or contains sensitive information.\")\n \n except Exception as e:\n print(\"An error occurred: Try to change the question.\") \n ","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:25.227141Z","iopub.execute_input":"2024-09-10T13:24:25.227551Z","iopub.status.idle":"2024-09-10T13:24:25.234327Z","shell.execute_reply.started":"2024-09-10T13:24:25.227508Z","shell.execute_reply":"2024-09-10T13:24:25.233393Z"},"trusted":true},"execution_count":36,"outputs":[]},{"cell_type":"code","source":"example = {\"input\": \"How i can access OpenAi Api? here is my api_key = 'asldkeytfytgvqwdeqw' ?\"}\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:25.235642Z","iopub.execute_input":"2024-09-10T13:24:25.236250Z","iopub.status.idle":"2024-09-10T13:24:25.689783Z","shell.execute_reply.started":"2024-09-10T13:24:25.236214Z","shell.execute_reply":"2024-09-10T13:24:25.688859Z"},"trusted":true},"execution_count":37,"outputs":[{"name":"stdout","text":"Your question violates toxicity rules or contains sensitive information.\n","output_type":"stream"}]},{"cell_type":"code","source":"example = {\"input\": \"What is back propagation ?\"}\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:25.691166Z","iopub.execute_input":"2024-09-10T13:24:25.691639Z","iopub.status.idle":"2024-09-10T13:24:40.908042Z","shell.execute_reply.started":"2024-09-10T13:24:25.691583Z","shell.execute_reply":"2024-09-10T13:24:40.907106Z"},"trusted":true},"execution_count":38,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 3\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":38,"output_type":"execute_result","data":{"text/plain":"{'response': \"Backpropagation is a gradient estimation method used to train neural networks. It calculates the gradient of a loss function with respect to the network's weights. This gradient is then used to update the weights, moving the network towards better performance. \\n\\nThe process involves calculating the error between the network's output and the desired output, then propagating this error backwards through the network, layer by layer. At each layer, the gradient of the error with respect to the weights is calculated and used to adjust those weights. \\n\",\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"What are a tranformers architecture in deep learning , how do they work?\"}\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:24:40.909334Z","iopub.execute_input":"2024-09-10T13:24:40.909728Z","iopub.status.idle":"2024-09-10T13:25:36.780643Z","shell.execute_reply.started":"2024-09-10T13:24:40.909683Z","shell.execute_reply":"2024-09-10T13:25:36.779722Z"},"trusted":true},"execution_count":39,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: Yes\nFiltered documents count: 3\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":39,"output_type":"execute_result","data":{"text/plain":"{'response': 'A transformer is a neural network architecture designed to process sequential data, like text, by understanding the relationships between words in a sentence. \\n\\nThey achieve this through a mechanism called \"attention,\" which allows the model to weigh the importance of different words when making predictions. Unlike previous models that processed information sequentially, transformers can analyze entire sentences at once, making them more efficient and capable of handling long-range dependencies in text. \\n\\nThis architecture has revolutionized natural language processing tasks like machine translation, text summarization, and question answering, leading to significant improvements in accuracy and performance. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"What are concerns of Ethics in AI ?\"}\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:25:36.781931Z","iopub.execute_input":"2024-09-10T13:25:36.782333Z","iopub.status.idle":"2024-09-10T13:26:25.667208Z","shell.execute_reply.started":"2024-09-10T13:25:36.782289Z","shell.execute_reply":"2024-09-10T13:26:25.666231Z"},"trusted":true},"execution_count":40,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: No\nFiltered documents count: 4\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":40,"output_type":"execute_result","data":{"text/plain":"{'response': \"Concerns about ethics in AI include:\\n\\n* **Potential for harm:** AI's increasing capabilities raise concerns about its potential to be misused or cause unintended harm.\\n* **Bias and discrimination:** AI models can perpetuate and amplify existing societal biases, leading to unfair or discriminatory outcomes.\\n* **Lack of transparency:** The complexity of AI algorithms often makes it difficult to understand how they work, raising concerns about accountability and potential manipulation.\\n* **Privacy issues:** AI systems often rely on vast amounts of data, which can include sensitive personal information, raising concerns about privacy violations.\\n* **Job displacement:** AI-powered automation may lead to job losses in certain sectors.\\n* **Weaponization:** There are concerns about the potential use of AI in developing autonomous weapons systems. \\n\\n\\n\",\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"Explain technical details about gradient descent \"}\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:26:25.668456Z","iopub.execute_input":"2024-09-10T13:26:25.668761Z","iopub.status.idle":"2024-09-10T13:27:27.950999Z","shell.execute_reply.started":"2024-09-10T13:26:25.668726Z","shell.execute_reply":"2024-09-10T13:27:27.950171Z"},"trusted":true},"execution_count":41,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: Yes\nFiltered documents count: 3\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":41,"output_type":"execute_result","data":{"text/plain":"{'response': \"Gradient descent is an optimization algorithm used to train machine learning models. It works by iteratively adjusting the model's parameters (weights) in the direction that minimizes a loss function, which measures the difference between the model's predictions and the actual values. \\n\\nThe algorithm calculates the gradient of the loss function with respect to the parameters. The gradient points in the direction of the steepest ascent of the loss function. Gradient descent then updates the parameters in the opposite direction of the gradient, effectively moving towards a minimum of the loss function. \\n\\nThis process is repeated until the loss function converges to a minimum, indicating that the model has been trained effectively. \\n\",\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"What mathematical topics is needed to understand Deep Learning \"}\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:27:27.952394Z","iopub.execute_input":"2024-09-10T13:27:27.953206Z","iopub.status.idle":"2024-09-10T13:28:19.780159Z","shell.execute_reply.started":"2024-09-10T13:27:27.953158Z","shell.execute_reply":"2024-09-10T13:28:19.779254Z"},"trusted":true},"execution_count":42,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 3\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":42,"output_type":"execute_result","data":{"text/plain":"{'response': 'Linear algebra, multivariable calculus, and statistics are the most important mathematical topics for understanding deep learning. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"I want to evaluate my langraph question answering bot , suggest me a ways \"}\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:28:19.781433Z","iopub.execute_input":"2024-09-10T13:28:19.781766Z","iopub.status.idle":"2024-09-10T13:29:10.851561Z","shell.execute_reply.started":"2024-09-10T13:28:19.781732Z","shell.execute_reply":"2024-09-10T13:29:10.850581Z"},"trusted":true},"execution_count":43,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 2\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":43,"output_type":"execute_result","data":{"text/plain":"{'response': \"To evaluate your Langraph question-answering bot, you can use metrics like BLEU, ROUGE, and accuracy. You can also use human evaluation to assess the quality and relevance of the bot's responses. \\n\",\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"Who was the first king of Lithuania and when he was crowned? \"}\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:29:10.852673Z","iopub.execute_input":"2024-09-10T13:29:10.852943Z","iopub.status.idle":"2024-09-10T13:30:02.837676Z","shell.execute_reply.started":"2024-09-10T13:29:10.852913Z","shell.execute_reply":"2024-09-10T13:30:02.836720Z"},"trusted":true},"execution_count":44,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 0\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":44,"output_type":"execute_result","data":{"text/plain":"{'response': 'Mindaugas was the first king of Lithuania and he was crowned on July 17, 1251. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"Who made James Bond movies? Which is the most popular \"}\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:30:02.838935Z","iopub.execute_input":"2024-09-10T13:30:02.839280Z","iopub.status.idle":"2024-09-10T13:30:51.840997Z","shell.execute_reply.started":"2024-09-10T13:30:02.839245Z","shell.execute_reply":"2024-09-10T13:30:51.840080Z"},"trusted":true},"execution_count":45,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 0\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":45,"output_type":"execute_result","data":{"text/plain":"{'response': 'Eon Productions makes the James Bond movies. \\n\\nThe most popular James Bond movie is *Goldfinger*. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"Who wrote Lord of the rings and how many books are there? \"}\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:30:51.842201Z","iopub.execute_input":"2024-09-10T13:30:51.842516Z","iopub.status.idle":"2024-09-10T13:31:40.579612Z","shell.execute_reply.started":"2024-09-10T13:30:51.842482Z","shell.execute_reply":"2024-09-10T13:31:40.578667Z"},"trusted":true},"execution_count":46,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 0\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":46,"output_type":"execute_result","data":{"text/plain":"{'response': 'J.R.R. Tolkien wrote *The Lord of the Rings*. There are three books in the series. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"What are five types of adversarial attacks?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:31:40.580692Z","iopub.execute_input":"2024-09-10T13:31:40.580971Z","iopub.status.idle":"2024-09-10T13:32:31.368068Z","shell.execute_reply.started":"2024-09-10T13:31:40.580928Z","shell.execute_reply":"2024-09-10T13:32:31.366973Z"},"trusted":true},"execution_count":47,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 1\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":47,"output_type":"execute_result","data":{"text/plain":"{'response': 'According to the provided text, five stages of adversarial attacks are:\\n\\n1. **Poisoning Attacks**\\n2. **Evasion Attacks**\\n3. **Model Extraction Attacks**\\n4. **Byzantine Attacks**\\n5. **Data Poisoning Attacks** \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"What are the types of biases that can arise with few-shot prompting??\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:32:31.369420Z","iopub.execute_input":"2024-09-10T13:32:31.369782Z","iopub.status.idle":"2024-09-10T13:33:23.314832Z","shell.execute_reply.started":"2024-09-10T13:32:31.369747Z","shell.execute_reply":"2024-09-10T13:33:23.313814Z"},"trusted":true},"execution_count":48,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 1\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":48,"output_type":"execute_result","data":{"text/plain":"{'response': \"Here are some biases that can arise with few-shot prompting:\\n\\n* **Majority label bias:** The model might favor answers that appear most frequently in the provided examples. \\n* **Contextual Misinterpretation:** The model could misunderstand the task's context due to the limited examples given. \\n\\n\\nLet me know if you have any other questions. \\n\",\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"\nexample = {\"input\": \"Who won the 2024 NBA finals?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:33:23.316167Z","iopub.execute_input":"2024-09-10T13:33:23.316589Z","iopub.status.idle":"2024-09-10T13:34:09.130284Z","shell.execute_reply.started":"2024-09-10T13:33:23.316542Z","shell.execute_reply":"2024-09-10T13:34:09.129311Z"},"trusted":true},"execution_count":49,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 0\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":49,"output_type":"execute_result","data":{"text/plain":"{'response': 'The Boston Celtics won the 2024 NBA Finals. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"\nexample = {\"input\": \"What are most common data distributions?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:34:09.131387Z","iopub.execute_input":"2024-09-10T13:34:09.131691Z","iopub.status.idle":"2024-09-10T13:35:05.998867Z","shell.execute_reply.started":"2024-09-10T13:34:09.131658Z","shell.execute_reply":"2024-09-10T13:35:05.997912Z"},"trusted":true},"execution_count":50,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 2\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":50,"output_type":"execute_result","data":{"text/plain":"{'response': \"The most common probability distributions are:\\n\\n* **Normal distribution:** Also known as the Gaussian distribution, it's symmetrical and bell-shaped.\\n* **Log-Normal distribution:** The logarithm of the data is normally distributed.\\n* **Student's t-distribution:** Used when the population standard deviation is unknown.\\n* **Chi-squared distribution:** Used in hypothesis testing, especially for goodness of fit. \\n\\n\\nLet me know if you'd like more details on any of these distributions! \\n\",\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"Does normal distribution has to be on infinite scale?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:35:06.000006Z","iopub.execute_input":"2024-09-10T13:35:06.000311Z","iopub.status.idle":"2024-09-10T13:36:01.090679Z","shell.execute_reply.started":"2024-09-10T13:35:06.000278Z","shell.execute_reply":"2024-09-10T13:36:01.089678Z"},"trusted":true},"execution_count":51,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: Yes\nFiltered documents count: 2\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":51,"output_type":"execute_result","data":{"text/plain":"{'response': 'A truly normal distribution extends from negative infinity to positive infinity. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"Explain how in transformer decoder encoder works?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:36:01.091831Z","iopub.execute_input":"2024-09-10T13:36:01.092143Z","iopub.status.idle":"2024-09-10T13:36:58.903829Z","shell.execute_reply.started":"2024-09-10T13:36:01.092111Z","shell.execute_reply":"2024-09-10T13:36:58.902925Z"},"trusted":true},"execution_count":52,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: Yes\nFiltered documents count: 2\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":52,"output_type":"execute_result","data":{"text/plain":"{'response': \"The Transformer's decoder uses the encoded representation (hidden state) generated by the encoder to produce an output sequence, one word at a time. It attends not only to the previously generated words but also to the final representations from the encoder, allowing it to consider the full context of the input sentence. \\n\",\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"What are acitvation functions in deep learning?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:36:58.905144Z","iopub.execute_input":"2024-09-10T13:36:58.905799Z","iopub.status.idle":"2024-09-10T13:37:52.750627Z","shell.execute_reply.started":"2024-09-10T13:36:58.905751Z","shell.execute_reply":"2024-09-10T13:37:52.749680Z"},"trusted":true},"execution_count":53,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: Yes\nFiltered documents count: 3\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":53,"output_type":"execute_result","data":{"text/plain":"{'response': 'Activation functions introduce non-linearity into a neural network, enabling it to learn and represent complex patterns. They determine the output of a neuron based on its input. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"Name three most commonly used activation functions and why they are used?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:37:52.752134Z","iopub.execute_input":"2024-09-10T13:37:52.752593Z","iopub.status.idle":"2024-09-10T13:38:53.705081Z","shell.execute_reply.started":"2024-09-10T13:37:52.752545Z","shell.execute_reply":"2024-09-10T13:38:53.704138Z"},"trusted":true},"execution_count":54,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: Yes\nFiltered documents count: 3\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":54,"output_type":"execute_result","data":{"text/plain":"{'response': 'Three commonly used activation functions are:\\n\\n* **ReLU (Rectified Linear Unit):** It\\'s widely used due to its simplicity and effectiveness. ReLU activates a neuron only when the input is positive, helping to address the vanishing gradient problem.\\n\\n* **Leaky ReLU:** A variation of ReLU that allows a small, non-zero gradient for negative inputs, mitigating the \"dying ReLU\" problem where neurons can become inactive.\\n\\n* **Sigmoid:** Produces bounded outputs between 0 and 1, often used in output layers for binary classification problems. \\n\\n\\n\\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"Name three most commonly used data distributions and why they are used?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:38:53.706300Z","iopub.execute_input":"2024-09-10T13:38:53.706614Z","iopub.status.idle":"2024-09-10T13:39:50.622190Z","shell.execute_reply.started":"2024-09-10T13:38:53.706580Z","shell.execute_reply":"2024-09-10T13:39:50.621279Z"},"trusted":true},"execution_count":55,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 2\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":55,"output_type":"execute_result","data":{"text/plain":"{'response': \"Three commonly used data distributions are:\\n\\n* **Normal Distribution:** This is the most common distribution, characterized by its bell-shaped curve. It's used to model many natural phenomena and is essential in statistical analysis.\\n\\n* **Binomial Distribution:** This distribution describes the probability of success or failure in a fixed number of independent trials. It's used in situations like coin flips or surveys.\\n\\n* **Poisson Distribution:** This distribution models the probability of a given number of events occurring in a fixed interval of time or space. It's used for things like counting the number of customers arriving at a store per hour. \\n\\n\\n\",\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"Explain the difference between regression and classification in the context of machine learning. Provide examples of each.?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:39:50.623645Z","iopub.execute_input":"2024-09-10T13:39:50.623950Z","iopub.status.idle":"2024-09-10T13:40:50.929061Z","shell.execute_reply.started":"2024-09-10T13:39:50.623916Z","shell.execute_reply":"2024-09-10T13:40:50.928150Z"},"trusted":true},"execution_count":56,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: No\nFiltered documents count: 4\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":56,"output_type":"execute_result","data":{"text/plain":"{'response': 'Regression and classification are both supervised learning tasks, but they deal with different types of output variables. \\n\\n**Regression** predicts a continuous numerical value. For example, predicting the price of a house, the number of sales a store will make, or the temperature tomorrow.\\n\\n**Classification** predicts a categorical value, essentially assigning data points to predefined classes or categories. Examples include identifying spam emails, classifying images as cats or dogs, or predicting whether a customer will click on an ad. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"Describe the softmax function and its role in classification problems. How does it ensure that the output values represent probabilities?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:40:50.930254Z","iopub.execute_input":"2024-09-10T13:40:50.930895Z","iopub.status.idle":"2024-09-10T13:41:50.111321Z","shell.execute_reply.started":"2024-09-10T13:40:50.930859Z","shell.execute_reply":"2024-09-10T13:41:50.110409Z"},"trusted":true},"execution_count":57,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: Yes\nFiltered documents count: 2\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":57,"output_type":"execute_result","data":{"text/plain":"{'response': \"The softmax function takes a vector of raw scores (logits) and converts them into a probability distribution. Each element in the output vector represents the probability of the corresponding class. \\n\\nHere's how it works:\\n\\n1. **Exponentiation:** The function first exponentiates each element in the input vector. This amplifies the differences between larger scores.\\n\\n2. **Normalization:** It then normalizes the exponentiated values by dividing each by the sum of all exponentiated values. This ensures that the output values sum up to 1, representing a valid probability distribution.\\n\\nThis process guarantees that the output values are between 0 and 1 and sum to 1, making them suitable for representing probabilities in classification tasks. \\n\",\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \" Given a dataset of images labeled as cat, dog, or chicken, how would you apply softmax regression to classify new images? What loss function would you use, and why?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:41:50.112575Z","iopub.execute_input":"2024-09-10T13:41:50.112980Z","iopub.status.idle":"2024-09-10T13:42:39.345183Z","shell.execute_reply.started":"2024-09-10T13:41:50.112915Z","shell.execute_reply":"2024-09-10T13:42:39.344272Z"},"trusted":true},"execution_count":58,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 2\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":58,"output_type":"execute_result","data":{"text/plain":"{'response': 'You would first use the features extracted from the new image as input to a linear model. This model would output a score for each of the three classes (cat, dog, chicken). The softmax function would then be applied to these scores to produce a probability distribution over the classes. The most likely class, corresponding to the highest probability, would be the predicted class.\\n\\nThe loss function you would use is cross-entropy loss. This is because it measures the difference between the predicted probability distribution and the true distribution (which is a one-hot encoding of the correct class). \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \" Explain the concept of inheritance in OOP.\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:42:39.346330Z","iopub.execute_input":"2024-09-10T13:42:39.346610Z","iopub.status.idle":"2024-09-10T13:43:29.023621Z","shell.execute_reply.started":"2024-09-10T13:42:39.346579Z","shell.execute_reply":"2024-09-10T13:43:29.022681Z"},"trusted":true},"execution_count":59,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: Yes\nFiltered documents count: 1\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":59,"output_type":"execute_result","data":{"text/plain":"{'response': 'Inheritance in object-oriented programming is a mechanism that allows a class (child class) to inherit attributes and methods from another class (parent class). This promotes code reuse and establishes a hierarchical relationship between classes. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \" What is the purpose of the __init__ method in a Python class? \" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:43:29.025092Z","iopub.execute_input":"2024-09-10T13:43:29.025745Z","iopub.status.idle":"2024-09-10T13:44:17.824605Z","shell.execute_reply.started":"2024-09-10T13:43:29.025695Z","shell.execute_reply":"2024-09-10T13:44:17.823580Z"},"trusted":true},"execution_count":60,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: No\nFiltered documents count: 4\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":60,"output_type":"execute_result","data":{"text/plain":"{'response': \"The `__init__` method is a special method (constructor) in Python classes. It is automatically called when a new instance (object) of the class is created. Its primary purpose is to initialize the object's attributes or perform any setup required for the object. \\n\",\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \" Given the Dog class and its child classes, how would you create a new dog breed called Golden Retriever that has a specific bark and a unique method called fetch? \" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:44:17.825856Z","iopub.execute_input":"2024-09-10T13:44:17.826185Z","iopub.status.idle":"2024-09-10T13:45:01.912021Z","shell.execute_reply.started":"2024-09-10T13:44:17.826150Z","shell.execute_reply":"2024-09-10T13:45:01.911027Z"},"trusted":true},"execution_count":61,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 0\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":61,"output_type":"execute_result","data":{"text/plain":"{'response': '```php\\nclass Dog {\\n public function bark() {\\n echo \"Woof!\";\\n }\\n}\\n\\nclass GoldenRetriever extends Dog {\\n public function bark() {\\n echo \"Woof woof!\"; // Specific bark for Golden Retriever\\n }\\n\\n public function fetch() {\\n echo \"Fetching the ball!\"; // Unique method for Golden Retriever\\n }\\n}\\n\\n$golden = new GoldenRetriever();\\n$golden->bark(); // Output: Woof woof!\\n$golden->fetch(); // Output: Fetching the ball!\\n```\\n\\nThis code defines a `Dog` class with a basic `bark` method. Then, the `GoldenRetriever` class inherits from `Dog` and overrides the `bark` method to have a more specific sound. It also adds a new method called `fetch` that is unique to the Golden Retriever breed. \\n\\n\\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \" How does object-oriented programming differ from procedural programming? Provide examples of the differences.\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:45:01.913479Z","iopub.execute_input":"2024-09-10T13:45:01.913848Z","iopub.status.idle":"2024-09-10T13:45:52.228624Z","shell.execute_reply.started":"2024-09-10T13:45:01.913810Z","shell.execute_reply":"2024-09-10T13:45:52.227647Z"},"trusted":true},"execution_count":62,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 1\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":62,"output_type":"execute_result","data":{"text/plain":"{'response': 'Object-oriented programming (OOP) structures code around \"objects\" which contain both data (attributes) and functions (methods) that operate on that data. Procedural programming, on the other hand, focuses on breaking a program down into a sequence of procedures or functions that perform specific tasks. \\n\\nHere\\'s an example:\\n\\n* **OOP:** Imagine modeling a \"Dog\" object. This object would have attributes like \"name,\" \"breed,\" and \"age,\" and methods like \"bark,\" \"fetch,\" and \"eat.\"\\n\\n* **Procedural:** A procedural approach might have separate functions for tasks like \"get_dog_name,\" \"make_dog_bark,\" and \"feed_dog.\" \\n\\nOOP emphasizes code reusability, modularity, and data security through concepts like inheritance and encapsulation, making it well-suited for complex projects. Procedural programming is often simpler for smaller programs but can become harder to manage as projects grow. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \" Explain Statistical Significance. how it can help?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:45:52.229906Z","iopub.execute_input":"2024-09-10T13:45:52.230313Z","iopub.status.idle":"2024-09-10T13:46:48.153933Z","shell.execute_reply.started":"2024-09-10T13:45:52.230268Z","shell.execute_reply":"2024-09-10T13:46:48.153031Z"},"trusted":true},"execution_count":63,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: No\nFiltered documents count: 4\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":63,"output_type":"execute_result","data":{"text/plain":"{'response': 'Statistical significance measures the likelihood that an observed relationship between two variables is not due to random chance. \\n\\nIt helps researchers determine if their results are reliable and not simply a fluke. A high degree of statistical significance suggests that the observed relationship is likely real and not caused by random variation. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"\nexample = {\"input\": \"What are the main steps involved in the backpropagation process as described in the article?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:46:48.155393Z","iopub.execute_input":"2024-09-10T13:46:48.155715Z","iopub.status.idle":"2024-09-10T13:47:51.867871Z","shell.execute_reply.started":"2024-09-10T13:46:48.155681Z","shell.execute_reply":"2024-09-10T13:47:51.866914Z"},"trusted":true},"execution_count":64,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: Yes\nFiltered documents count: 3\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":64,"output_type":"execute_result","data":{"text/plain":"{'response': 'The provided text describes backpropagation as a process with these main steps:\\n\\n1. **Forward Pass:** Calculate outputs based on inputs and a set of weights.\\n2. **Loss Calculation:** Compare the outputs to target values using a loss function.\\n3. **Backward Pass:** Calculate \"weight change requests\" or gradients to reduce the loss. \\n\\n\\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"\nexample = {\"input\": \"What is the significance of loss functions in training a neural network?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:47:51.869308Z","iopub.execute_input":"2024-09-10T13:47:51.869714Z","iopub.status.idle":"2024-09-10T13:48:50.453124Z","shell.execute_reply.started":"2024-09-10T13:47:51.869668Z","shell.execute_reply":"2024-09-10T13:48:50.452134Z"},"trusted":true},"execution_count":65,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 2\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":65,"output_type":"execute_result","data":{"text/plain":"{'response': \"Loss functions measure how well a neural network's predictions match the actual target values. They quantify the difference between the predicted output and the desired output. This difference is then used to adjust the network's weights during the training process, aiming to minimize the loss and improve the network's accuracy. \\n\",\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \" explain the role of the sigmoid activation function in the neural network's calculations?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:48:50.454312Z","iopub.execute_input":"2024-09-10T13:48:50.454627Z","iopub.status.idle":"2024-09-10T13:49:52.471849Z","shell.execute_reply.started":"2024-09-10T13:48:50.454593Z","shell.execute_reply":"2024-09-10T13:49:52.470846Z"},"trusted":true},"execution_count":66,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: No\nFiltered documents count: 4\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":66,"output_type":"execute_result","data":{"text/plain":"{'response': 'The sigmoid activation function squashes the input values to a range between 0 and 1. This makes it particularly useful in the output layer of a neural network for binary classification problems, where the output represents the probability of an input belonging to a particular class. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"why is it beneficial for practitioners to understand the mechanics of backpropagation rather than treating it as a black box?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:49:52.473204Z","iopub.execute_input":"2024-09-10T13:49:52.473528Z","iopub.status.idle":"2024-09-10T13:50:52.375411Z","shell.execute_reply.started":"2024-09-10T13:49:52.473493Z","shell.execute_reply":"2024-09-10T13:50:52.374387Z"},"trusted":true},"execution_count":67,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: No\nFiltered documents count: 4\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":67,"output_type":"execute_result","data":{"text/plain":"{'response': 'Understanding backpropagation allows practitioners to debug problems that may arise during the training process. Treating it as a black box can lead to difficulties in identifying and resolving issues. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"What are the two key ideas introduced by LightGBM that make it more efficient than other gradient boosting implementations?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:50:52.376789Z","iopub.execute_input":"2024-09-10T13:50:52.377194Z","iopub.status.idle":"2024-09-10T13:51:50.537585Z","shell.execute_reply.started":"2024-09-10T13:50:52.377156Z","shell.execute_reply":"2024-09-10T13:51:50.536683Z"},"trusted":true},"execution_count":68,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: No\nFiltered documents count: 4\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":68,"output_type":"execute_result","data":{"text/plain":"{'response': 'The two key ideas introduced by LightGBM are Gradient-based One-Side Sampling (GOSS) and Exclusive Feature Bundling (EFB). \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"How does Gradient-based One-Side Sampling (GOSS) work to speed up learning in LightGBM?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:51:50.538857Z","iopub.execute_input":"2024-09-10T13:51:50.539674Z","iopub.status.idle":"2024-09-10T13:52:38.924699Z","shell.execute_reply.started":"2024-09-10T13:51:50.539624Z","shell.execute_reply":"2024-09-10T13:52:38.923793Z"},"trusted":true},"execution_count":69,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 2\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":69,"output_type":"execute_result","data":{"text/plain":"{'response': 'Gradient-based One-Side Sampling (GOSS) speeds up learning in LightGBM by focusing on training examples with larger gradients. It excludes a significant proportion of data instances with small gradients, using only the rest to estimate the information gain. This is because data instances with larger gradients play a more important role in the computation of information gain. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"What is the purpose of Exclusive Feature Bundling (EFB) in LightGBM, and how does it relate to feature selection?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:52:38.925858Z","iopub.execute_input":"2024-09-10T13:52:38.926184Z","iopub.status.idle":"2024-09-10T13:53:31.276051Z","shell.execute_reply.started":"2024-09-10T13:52:38.926149Z","shell.execute_reply":"2024-09-10T13:53:31.275134Z"},"trusted":true},"execution_count":70,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 2\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":70,"output_type":"execute_result","data":{"text/plain":"{'response': 'Exclusive Feature Bundling (EFB) in LightGBM groups mutually exclusive features (often sparse categorical features) into bundles. This reduces the number of features, acting as a form of automatic feature selection, and improves efficiency without significantly sacrificing accuracy. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"What are the key principles of writing clean, maintainable Python code, and how do they impact software scalability and readability?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:53:31.277177Z","iopub.execute_input":"2024-09-10T13:53:31.277474Z","iopub.status.idle":"2024-09-10T13:54:31.635390Z","shell.execute_reply.started":"2024-09-10T13:53:31.277441Z","shell.execute_reply":"2024-09-10T13:54:31.634254Z"},"trusted":true},"execution_count":71,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 3\n---CHECK HALLUCINATIONS---\n generation number: 1\nAn error occurred: Try to change the question.\n","output_type":"stream"}]},{"cell_type":"code","source":"example = {\"input\": \"How do Python dictionaries work internally, and what makes them an efficient data structure for key-value pair storage?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T14:40:34.168778Z","iopub.execute_input":"2024-09-10T14:40:34.169781Z","iopub.status.idle":"2024-09-10T14:40:40.807759Z","shell.execute_reply.started":"2024-09-10T14:40:34.169723Z","shell.execute_reply":"2024-09-10T14:40:40.806695Z"},"trusted":true},"execution_count":94,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 2\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":94,"output_type":"execute_result","data":{"text/plain":"{'response': 'Python dictionaries are implemented as hash tables. A hash table uses a hash function to map keys to indices in an array. This allows for very efficient key-value lookups, as they can be done in O(1) time on average. \\n\\nCPython, the reference implementation of Python, uses a technique called \"compact dictionaries\" to further optimize dictionary performance. This involves storing the dictionary entries in a separate dense array, and the hash table only stores indices to this array. This reduces space usage and improves iteration speed. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"What is the transformer model, and how has it revolutionized natural language processing tasks?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:54:37.852660Z","iopub.execute_input":"2024-09-10T13:54:37.853065Z","iopub.status.idle":"2024-09-10T13:55:12.255120Z","shell.execute_reply.started":"2024-09-10T13:54:37.853018Z","shell.execute_reply":"2024-09-10T13:55:12.254178Z"},"trusted":true},"execution_count":73,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 3\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":73,"output_type":"execute_result","data":{"text/plain":"{'response': 'A transformer model is a neural network architecture that revolutionized natural language processing (NLP) by using a mechanism called \"self-attention\" to understand relationships between words in a sequence, even those that are far apart. This allows transformers to capture long-range dependencies in text, leading to improved performance in tasks like machine translation, text summarization, and question answering. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"What techniques can be used to make machine learning models like XGBoost more interpretable, and why is model interpretability crucial in data science?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:55:12.256282Z","iopub.execute_input":"2024-09-10T13:55:12.256583Z","iopub.status.idle":"2024-09-10T13:56:02.174889Z","shell.execute_reply.started":"2024-09-10T13:55:12.256550Z","shell.execute_reply":"2024-09-10T13:56:02.173996Z"},"trusted":true},"execution_count":74,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 1\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":74,"output_type":"execute_result","data":{"text/plain":"{'response': 'Techniques to improve the interpretability of XGBoost models include using feature importance measures like weight, cover, and gain. \\n\\nModel interpretability is crucial in data science because it allows us to understand how a model arrives at its predictions. This is essential for building trust in the model, identifying potential biases, and ensuring responsible use, especially in high-stakes situations where explanations are required. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"How do convolutional layers in CNNs like AlexNet and VGGNet function, and what are their advantages for image processing tasks?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:56:02.176146Z","iopub.execute_input":"2024-09-10T13:56:02.176532Z","iopub.status.idle":"2024-09-10T13:56:51.569128Z","shell.execute_reply.started":"2024-09-10T13:56:02.176488Z","shell.execute_reply":"2024-09-10T13:56:51.568129Z"},"trusted":true},"execution_count":75,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: Yes\nFiltered documents count: 3\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":75,"output_type":"execute_result","data":{"text/plain":"{'response': 'Convolutional layers in CNNs like AlexNet and VGGNet use filters (also called kernels) to detect patterns in the input image. These filters slide across the image, performing element-wise multiplications and additions to produce a feature map highlighting specific features like edges, corners, or textures. \\n\\nTheir advantages for image processing tasks include:\\n\\n* **Feature Extraction:** They automatically learn relevant features from the data, eliminating the need for manual feature engineering.\\n* **Spatial Invariance:** They are robust to small shifts in the position of objects within the image.\\n* **Parameter Sharing:** Filters are applied across the entire image, reducing the number of parameters compared to fully connected layers. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"How is statistical significance determined in A/B testing, and why is it important for making data-driven decisions in business and research?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:56:51.570302Z","iopub.execute_input":"2024-09-10T13:56:51.570635Z","iopub.status.idle":"2024-09-10T13:57:51.020249Z","shell.execute_reply.started":"2024-09-10T13:56:51.570586Z","shell.execute_reply":"2024-09-10T13:57:51.019342Z"},"trusted":true},"execution_count":76,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: No\nFiltered documents count: 4\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":76,"output_type":"execute_result","data":{"text/plain":"{'response': 'Statistical significance is determined by calculating a p-value. The p-value represents the probability of observing the obtained results (or more extreme results) if the null hypothesis (that there is no relationship or effect) is actually true. \\n\\nIf the p-value is below a pre-determined significance level (often 0.05), we reject the null hypothesis and conclude that the observed effect is statistically significant. This means the results are unlikely to have occurred by chance alone and provide evidence to support the alternative hypothesis.\\n\\nStatistical significance is crucial for making data-driven decisions because it helps us determine if observed differences or relationships are real and not just random fluctuations. In business and research, it allows us to:\\n\\n* **Make informed decisions:** By identifying statistically significant trends, businesses can make better decisions about marketing campaigns, product development, and resource allocation.\\n* **Support research findings:** In research, statistical significance helps validate hypotheses and draw meaningful conclusions from data.\\n* **Reduce bias:** Using statistical significance helps minimize the influence of subjective interpretation and reduces the risk of drawing false conclusions based on chance. \\n\\n\\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"What are the most common testing strategies in Python, and how do unit tests, integration tests, and functional tests differ from one another?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T13:57:51.021597Z","iopub.execute_input":"2024-09-10T13:57:51.022006Z","iopub.status.idle":"2024-09-10T13:58:40.166171Z","shell.execute_reply.started":"2024-09-10T13:57:51.021940Z","shell.execute_reply":"2024-09-10T13:58:40.165119Z"},"trusted":true},"execution_count":77,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 0\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":77,"output_type":"execute_result","data":{"text/plain":"{'response': \"The most common testing strategies in Python include unit testing, integration testing, and functional testing. \\n\\n* **Unit tests** focus on isolating and testing individual components (functions, classes) of your code in isolation. They verify that each unit works as expected without relying on other parts of the system.\\n\\n* **Integration tests** verify how different units of your code work together when combined. They involve testing the interactions between components and ensure they seamlessly integrate.\\n\\n* **Functional tests** test the complete functionality of your application from a user's perspective. They simulate real-world scenarios and check if the application behaves as expected for various user interactions. \\n\",\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"How is artificial intelligence transforming the finance sector, and what are some of the most impactful applications of AI in financial services?\"}\n\n\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T14:03:19.706426Z","iopub.execute_input":"2024-09-10T14:03:19.706782Z","iopub.status.idle":"2024-09-10T14:03:23.097029Z","shell.execute_reply.started":"2024-09-10T14:03:19.706749Z","shell.execute_reply":"2024-09-10T14:03:23.096201Z"},"trusted":true},"execution_count":81,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: No\nFiltered documents count: 4\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":81,"output_type":"execute_result","data":{"text/plain":"{'response': 'Artificial intelligence is transforming the finance sector by automating tasks, enhancing risk management, and providing personalized services. \\n\\nSome impactful applications include:\\n\\n* **Algorithmic trading:** AI can analyze market data and execute trades with speed and accuracy.\\n* **Robo-advisors:** AI-powered platforms offer automated financial planning and investment advice.\\n* **Fraud detection:** AI algorithms can identify suspicious transactions and patterns, reducing financial crime.\\n* **Customer service:** Chatbots powered by AI can handle routine customer inquiries, freeing up human agents for complex issues.\\n* **Credit risk assessment:** AI can analyze vast amounts of data to assess creditworthiness and make lending decisions. \\n\\n\\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"What are vector databases, and how do they improve retrieval in large language models and other AI systems?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T14:03:23.098401Z","iopub.execute_input":"2024-09-10T14:03:23.098736Z","iopub.status.idle":"2024-09-10T14:04:10.181459Z","shell.execute_reply.started":"2024-09-10T14:03:23.098701Z","shell.execute_reply":"2024-09-10T14:04:10.180510Z"},"trusted":true},"execution_count":82,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 2\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":82,"output_type":"execute_result","data":{"text/plain":"{'response': 'Vector databases are specialized databases designed to efficiently store and retrieve vector embeddings. \\n\\nThey are crucial for AI systems, especially large language models (LLMs), because LLMs generate these embeddings to represent semantic information. Traditional databases struggle with the complexity and scale of vector data, making vector databases essential for tasks like semantic search, long-term memory, and knowledge support in AI. \\n\\nVector databases use algorithms like Approximate Nearest Neighbor (ANN) search to quickly find vectors most similar to a given query, enabling fast and accurate retrieval of relevant information. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"What type of chains are in Langchain?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T14:04:10.182516Z","iopub.execute_input":"2024-09-10T14:04:10.182791Z","iopub.status.idle":"2024-09-10T14:05:06.539600Z","shell.execute_reply.started":"2024-09-10T14:04:10.182761Z","shell.execute_reply":"2024-09-10T14:05:06.538707Z"},"trusted":true},"execution_count":83,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 3\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":83,"output_type":"execute_result","data":{"text/plain":"{'response': 'The document mentions LLM Chains, Sequential Chains, and Router Chains. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"How can context size be made smaller in Langchain?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T14:05:06.540991Z","iopub.execute_input":"2024-09-10T14:05:06.541761Z","iopub.status.idle":"2024-09-10T14:05:51.377767Z","shell.execute_reply.started":"2024-09-10T14:05:06.541711Z","shell.execute_reply":"2024-09-10T14:05:51.376863Z"},"trusted":true},"execution_count":84,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 0\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":84,"output_type":"execute_result","data":{"text/plain":"{'response': \"You can make context size smaller in LangChain by splitting documents into smaller chunks. LangChain's `contextual_compression` module provides tools for this. \\n\",\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"How is AI being used to accelerate scientific discovery, and what are the potential benefits and challenges associated with its adoption in research?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T14:05:51.379123Z","iopub.execute_input":"2024-09-10T14:05:51.379502Z","iopub.status.idle":"2024-09-10T14:06:41.737903Z","shell.execute_reply.started":"2024-09-10T14:05:51.379456Z","shell.execute_reply":"2024-09-10T14:06:41.736824Z"},"trusted":true},"execution_count":85,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 1\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":85,"output_type":"execute_result","data":{"text/plain":"{'response': 'AI accelerates scientific discovery by identifying patterns in large datasets, predicting outcomes, and simulating complex systems. This can lead to faster drug development, improved climate modeling, and breakthroughs in fields like genomics and materials science. \\n\\nPotential benefits include increased efficiency, accuracy, and the ability to tackle complex problems beyond human capacity. \\n\\nHowever, challenges include ensuring data quality and bias mitigation, addressing ethical concerns surrounding AI-driven decision-making, and the need for transparency and explainability in AI models. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"How do multi-agent workflows in LangChain improve retrieval-augmented generation (RAG) systems, and what are the key use cases?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T14:06:41.739375Z","iopub.execute_input":"2024-09-10T14:06:41.739819Z","iopub.status.idle":"2024-09-10T14:07:29.876520Z","shell.execute_reply.started":"2024-09-10T14:06:41.739768Z","shell.execute_reply":"2024-09-10T14:07:29.875609Z"},"trusted":true},"execution_count":86,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: Yes\nFiltered documents count: 1\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":86,"output_type":"execute_result","data":{"text/plain":"{'response': 'Multi-agent workflows in LangChain enhance RAG systems by automating tasks within the workflow, such as data filtering, ranking, and selection. This improves efficiency and allows for more complex and dynamic RAG applications. \\n\\nKey use cases include building chatbots that can access and process information from multiple sources, creating personalized learning experiences, and automating tasks in research and development. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"What is reinforcement learning from AI feedback, and how does it improve the training and performance of AI models?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T14:07:29.877808Z","iopub.execute_input":"2024-09-10T14:07:29.878445Z","iopub.status.idle":"2024-09-10T14:08:32.523571Z","shell.execute_reply.started":"2024-09-10T14:07:29.878398Z","shell.execute_reply":"2024-09-10T14:08:32.522666Z"},"trusted":true},"execution_count":87,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 3\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":87,"output_type":"execute_result","data":{"text/plain":"{'response': 'Reinforcement learning from AI feedback (RLAIF) is a technique where AI models provide feedback to other AI models during the reinforcement learning process. Instead of relying solely on human input, RLAIF leverages existing AI systems to evaluate actions and guide the learning of other agents. This AI feedback can take various forms, such as generating rewards, ranking responses, or suggesting improvements. \\n\\nRLAIF aims to improve training and performance by:\\n\\n* **Scaling training:** Automating the feedback loop makes training more efficient and less reliant on expensive human labor.\\n* **Potentially enhancing performance:** RLAIF has shown promising results, matching or even surpassing the performance of traditional reinforcement learning from human feedback (RLHF) in some cases. \\n\\n\\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"How is AI being used to accelerate scientific discovery, and what are the potential benefits and challenges associated with its adoption in research?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T14:08:32.524741Z","iopub.execute_input":"2024-09-10T14:08:32.525067Z","iopub.status.idle":"2024-09-10T14:09:23.209434Z","shell.execute_reply.started":"2024-09-10T14:08:32.525033Z","shell.execute_reply":"2024-09-10T14:09:23.208498Z"},"trusted":true},"execution_count":88,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 1\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":88,"output_type":"execute_result","data":{"text/plain":"{'response': 'AI accelerates scientific discovery by identifying patterns in large datasets, predicting outcomes, and simulating complex systems. This can lead to faster drug development, improved climate modeling, and breakthroughs in fields like genomics and materials science. \\n\\nPotential benefits include increased efficiency, accuracy, and the ability to tackle complex problems beyond human capacity. \\n\\nHowever, challenges include ensuring data quality and bias mitigation, addressing ethical concerns surrounding AI-driven decision-making, and the need for transparency and explainability in AI models. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"Where are Byes theorem?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T14:34:20.636220Z","iopub.execute_input":"2024-09-10T14:34:20.636896Z","iopub.status.idle":"2024-09-10T14:34:25.759884Z","shell.execute_reply.started":"2024-09-10T14:34:20.636850Z","shell.execute_reply":"2024-09-10T14:34:25.759007Z"},"trusted":true},"execution_count":89,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 1\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":89,"output_type":"execute_result","data":{"text/plain":"{'response': \"Bayes' Theorem is a fundamental concept in probability theory. \\n\",\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"What is do do transformer models perform better than convolutional networks?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T14:35:54.199710Z","iopub.execute_input":"2024-09-10T14:35:54.200077Z","iopub.status.idle":"2024-09-10T14:36:00.706211Z","shell.execute_reply.started":"2024-09-10T14:35:54.200041Z","shell.execute_reply":"2024-09-10T14:36:00.705273Z"},"trusted":true},"execution_count":91,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: Yes\nFiltered documents count: 3\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":91,"output_type":"execute_result","data":{"text/plain":"{'response': \"Transformer models are able to handle long-range dependencies in sequences more effectively than convolutional networks. This is because the transformer's attention mechanism allows it to weigh the importance of different words in a sequence, regardless of their distance from each other. \\n\",\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"transformer?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T14:36:19.636451Z","iopub.execute_input":"2024-09-10T14:36:19.637303Z","iopub.status.idle":"2024-09-10T14:36:49.448854Z","shell.execute_reply.started":"2024-09-10T14:36:19.637247Z","shell.execute_reply":"2024-09-10T14:36:49.448010Z"},"trusted":true},"execution_count":92,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nGrader output for document: binary_score='yes'\nFinal decision - Perform web search: No\nFiltered documents count: 4\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":92,"output_type":"execute_result","data":{"text/plain":"{'response': 'A transformer model is a neural network that learns context and meaning by tracking relationships in sequential data, like words in a sentence. They use a mechanism called \"self-attention\" to weigh the importance of different words when processing information. \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"example = {\"input\": \"Kaunas - Vilnius in km?\" }\nresponse = await predict_custom_agent_answer(example)\nresponse","metadata":{"execution":{"iopub.status.busy":"2024-09-10T14:41:31.475142Z","iopub.execute_input":"2024-09-10T14:41:31.476127Z","iopub.status.idle":"2024-09-10T14:42:03.845702Z","shell.execute_reply.started":"2024-09-10T14:41:31.476078Z","shell.execute_reply":"2024-09-10T14:42:03.844864Z"},"trusted":true},"execution_count":96,"outputs":[{"name":"stdout","text":"Grader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nGrader output for document: binary_score='no'\nFinal decision - Perform web search: Yes\nFiltered documents count: 0\n---CHECK HALLUCINATIONS---\n generation number: 1\n---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---\n---GRADE GENERATION vs QUESTION---\n---DECISION: GENERATION ADDRESSES QUESTION---\n","output_type":"stream"},{"execution_count":96,"output_type":"execute_result","data":{"text/plain":"{'response': '92 kilometers \\n',\n 'steps': ['question_asked',\n 'promt guard',\n 'retrieve_documents',\n 'grade_document_retrieval',\n 'web_search',\n 'generate_answer']}"},"metadata":{}}]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}