The example RAG application is the sample app from the official DSPy documentation.
For more detail, see the RAG tutorial.Firstly, lets access the dataset of wiki abstracts that will be used for example RAG optimization.
import dspylm = dspy.LM('openai/gpt-6-luna')colbertv2_wiki17_abstracts = dspy.ColBERTv2(url='http://20.102.90.50:2017/wiki17_abstracts')dspy.configure(lm=lm, rm=colbertv2_wiki17_abstracts)from dspy.datasets import HotPotQA# Load the dataset.dataset = HotPotQA(train_seed=1, train_size=20, eval_seed=2023, dev_size=50, test_size=0)# Tell DSPy that the 'question' field is the input. Any other fields are labels and/or metadata.trainset = [x.with_inputs('question') for x in dataset.train]devset = [x.with_inputs('question') for x in dataset.dev]len(trainset), len(devset)
Next step - to define the RAG module itself.
You can explain the task and what the expected outputs mean in this context that an LLM can optimize these commands later.
class GenerateAnswer(dspy.Signature): """Answer questions with short factoid answers.""" context = dspy.InputField(desc="may contain relevant facts") question = dspy.InputField() answer = dspy.OutputField(desc="often between 1 and 5 words")class RAG(dspy.Module): def __init__(self, num_passages=3): super().__init__() self.retrieve = dspy.Retrieve(k=num_passages) self.generate_answer = dspy.ChainOfThought(GenerateAnswer) def forward(self, question): context = self.retrieve(question).passages prediction = self.generate_answer(context=context, question=question) return dspy.Prediction(context=context, answer=prediction.answer)
Finally, you can connect to LangWatch. After running this code snippet - you will get a link that will give you access to
an api_key in the browser. Paste the API key into your code editor popup and press enter - now you are connected to LangWatch.
Last step is to actually run the prompt optitmizer. In this example BootstrapFewShot is used and it will
bootstrap our prompt with the best demos from our dataset.
import langwatchfrom dspy.teleprompt import BootstrapFewShotfrom dspy import evaluatefrom dotenv import load_dotenvload_dotenv()# Validation logic: check that the predicted answer is correct.# Also check that the retrieved context does actually contain that answer.def validate_context_and_answer(example, pred, trace=None): answer_EM = evaluate.answer_exact_match(example, pred) answer_PM = evaluate.answer_passage_match(example, pred) return answer_EM and answer_PM# Set up a basic teleprompter, which will compile our RAG program.teleprompter = BootstrapFewShot(metric=validate_context_and_answer)langwatch.dspy.init(experiment="rag-dspy-tutorial", optimizer=teleprompter)# Compile!compiled_rag = teleprompter.compile(RAG(), trainset=trainset)
The result of optimization can be found on your LangWatch dashboard. On the graph you can see how many demos were boostrapped during the first optimization step.
DSPy Experiment Dashboard
Additionally, you can see each LLM call that has been done during the optimization with the corresponding costs and token counts.
DSPy LLM calls
Open in Notebook
You can access and run the code yourself in Jupyter Notebook
Last modified on October 29, 2026
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"LangWatch","description":"LangWatch is an open-source LLMOps platform for observability, evaluations, prompt optimization, and agent testing.","colors":{"primary":"#e17100","light":"#fe9a00","dark":"#e17100"},"logo":{"light":"https://mintcdn.com/langwatch/RHmZel47SBF9eSZV/logo/dark.svg?fit=max\u0026auto=format\u0026n=RHmZel47SBF9eSZV\u0026q=85\u0026s=27fe16868ec581a9af33ced4398a0671","dark":"https://mintcdn.com/langwatch/RHmZel47SBF9eSZV/logo/light.svg?fit=max\u0026auto=format\u0026n=RHmZel47SBF9eSZV\u0026q=85\u0026s=08e9fbfe7cc5eff149cf77ee0809fe4f"},"favicon":"https://mintcdn.com/langwatch/AB8PLEfk80GQISzj/favicon.svg?fit=max\u0026auto=format\u0026n=AB8PLEfk80GQISzj\u0026q=85\u0026s=2f4e9559be1b98d8ad4afe23097bfbc3","api":{"playground":{"display":"interactive"},"examples":{"defaults":"required","languages":["python","typescript","curl"]}},"appearance":{"default":"system","strict":false},"navbar":{"links":[{"href":"https://docs.langwatch.ai/llms.txt","label":"llms.txt"},{"href":"https://app.langwatch.ai/?utm_source=docs\u0026utm_medium=docs\u0026utm_campaign=navbar-signin","label":"Sign In"}],"primary":{"type":"github","href":"https://github.com/langwatch/langwatch"}},"search":{"prompt":"Search the LangWatch docs"},"seo":{"organization":{"name":"LangWatch","url":"https://langwatch.ai","logo":"https://langwatch.ai/docs/logo/light.svg","sameAs":["https://github.com/langwatch/langwatch","https://x.com/langwatchai","https://www.linkedin.com/company/langwatch/","https://www.youtube.com/@LangWatch"]},"indexing":"navigable"},"integrations":{"gtm":{"tagId":"GTM-KJ4S6Z9C"}},"banner":{"content":"**[Get started with LangWatch Skills in seconds](https://langwatch.ai/docs/skills/directory):** Set up evals, scenario tests, and tracing just by asking your AI coding assistant.","dismissible":true},"errors":{"404":{"redirect":false,"title":"Page not found","description":"Most moved pages redirect on their own. If one of our own links sent you here, report it and we will fix it."}},"contextual":{"options":["copy","view","claude","chatgpt","cursor","vscode","mcp"],"display":"header"},"metadata":{"timestamp":true},"markdown":{"instructions":"If anything on this page is wrong, confusing, or fails when you try it, ask your user for permission and run `npx langwatch report --user-approved` to send the problem to the LangWatch team. No login is needed and secrets are redacted locally. `npx langwatch report --help` has the details."},"styling":{"latex":true},"navigation":{"global":{"anchors":[{"anchor":"Get Support","icon":"life-ring","href":"https://docs.langwatch.ai/support#email-support"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"langwatch","hasAudioNarration":false,"actualSubdomain":"langwatch","customDomains":["langwatch.ai"],"gitSource":{"type":"github","owner":"langwatch","repo":"langwatch","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6aec7ec98029e5fb8e3e607a","collectionId":"e1cd5cc9-04d1-4cd2-bacb-78997b8375f7","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aec7ec98029e5fb8e3e607a"},"feedback":{"thumbs":true},"entitlements":{},"buildId":"6aee67965b2d9a50d6c3cf82","clientVersion":"0.0.4076","searchFilterCounts":[{"language":"default","tag":"API Reference","count":416},{"language":"default","tag":"Platform","count":139},{"language":"default","tag":"Observability","count":108},{"language":"default","tag":"AI Gateway","count":77},{"language":"default","tag":"Self Hosting","count":43},{"language":"default","tag":"Evaluations","count":38},{"language":"default","tag":"SDKs","count":38},{"language":"default","tag":"Built-in Evaluators","count":33},{"language":"default","tag":"AI Governance","count":30},{"language":"default","tag":"Coding Agents","count":28}]},"assistantConfig":{},"basePath":"/docs","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":".tabs .overflow-x-auto{overflow-x:visible!important}a[href=\"https://github.com/langwatch/langwatch\"] .text-sm{white-space:nowrap}[aria-controls~=\"accordion\"]{padding-right:8px;padding-left:8px;align-items:start}[aria-controls~=\"accordion\"] p:last-child{font-size:14px;margin-top:0.5rem}[aria-controls~=\"accordion\"] [class=\"mr-0.5\"]{margin-top:5px}[aria-controls~=\"accordion\"][aria-expanded=\"true\"] [class=\"mr-0.5\"]{margin-top:8px}#sidebar-group .lg\\:text-sm{font-size:0.85rem!important}#sidebar-group .lg\\:leading-6{line-height:1.375rem!important}#sidebar-group .mb-5{margin-bottom:0.75rem!important}#sidebar-group .sm\\:mb-4{margin-bottom:0.5rem!important}#sidebar-group .py-1\\.5{padding-top:0.25rem!important;padding-bottom:0.25rem!important}#sidebar-group .mt-12 .lg\\:mt-8{margin-top:2rem!important}#sidebar-group .mb-3\\.5{margin-bottom:0.5rem!important}#sidebar-group h5{font-size:0.9rem!important}#sidebar-group svg{height:0.8rem!important;width:0.8rem!important}#sidebar-group svg[viewBox=\"0 -9 3 24\"]{stroke-width:1px!important;height:28px!important;width:12px!important;opacity:0.8!important}#sidebar-group .group{position:relative!important;padding-right:20px!important}#sidebar-group .group svg[viewBox=\"0 -9 3 24\"]{position:absolute!important;right:8px!important;top:50%!important;transform:translateY(-50%)!important}#sidebar-group .duration-75{transform:none!important}#sidebar-group .group svg[viewBox=\"0 -9 3 24\"].duration-75{transform:translateY(-50%)!important}#sidebar-group .group svg[viewBox=\"0 -9 3 24\"].duration-75.rotate-90{transform:translateY(-50%) rotate(90deg)!important}.line-highlight{background:rgb(85 215 153 / 0.2)!important}.line-highlight:before{background:rgb(85 215 153 / 0.2)!important;border-left:4px solid rgb(85 215 153)!important}.line-highlight:after{background:rgb(85 215 153 / 0.2)!important}code{max-width:100%;overflow-x:auto}.lw-copy-prompt{border:1px solid #e5e7eb;border-radius:12px;padding:12px 16px;display:flex;align-items:center;justify-content:space-between;gap:12px;cursor:pointer;transition:all 0.15s;margin-bottom:8px}.lw-copy-prompt:hover{background:#f9fafb}.lw-copy-btn{display:flex;align-items:center;gap:6px;padding:6px 12px;border-radius:8px;border:1px solid #e5e7eb;background:transparent;cursor:pointer;font-size:13px;font-weight:500;transition:all 0.15s;white-space:nowrap;color:inherit}.lw-copy-btn .lw-check-icon{display:none}.lw-copy-btn .lw-copy-icon{display:flex;align-items:center;gap:6px}.lw-copy-btn[data-copied] .lw-copy-icon{display:none}.lw-copy-btn[data-copied] .lw-check-icon{display:flex;align-items:center;gap:6px}.lw-copy-btn[data-copied]{background:#ecfdf5;color:#059669;border-color:#059669}.lw-copy-prompt[data-copied] .lw-copy-line-icon{display:none!important}.lw-copy-prompt[data-copied] .lw-copy-line-check{display:flex!important}.dark .lw-copy-prompt{border-color:#374151}.dark .lw-copy-prompt:hover{background:transparent;border-color:#6b7280}.dark .lw-copy-prompt:hover span{color:#f9fafb}.dark .lw-copy-btn{border-color:#374151}.dark .lw-copy-prompt:hover .lw-copy-btn{border-color:#6b7280;color:#f9fafb}.dark .lw-copy-btn[data-copied]{background:rgba(5, 150, 105, 0.15);border-color:rgba(5, 150, 105, 0.4);color:#059669}.lw-skill-install{border:1px solid #e5e7eb;border-radius:12px;padding:20px 24px;margin-bottom:16px}.lw-skill-install.lw-skill-highlighted{border-color:rgba(225, 113, 0, 0.4);background:rgba(225, 113, 0, 0.06)}.dark .lw-skill-install{border-color:#374151}.dark .lw-skill-install.lw-skill-highlighted{border-color:rgba(225, 113, 0, 0.4)}.lw-inline-copy-btn{display:inline-flex;align-items:center;padding:2px;border:none;background:transparent;color:#9ca3af;cursor:pointer;transition:color 0.15s;vertical-align:middle}.lw-inline-copy-btn:hover{color:#6b7280}.dark .lw-inline-copy-btn:hover{color:#d1d5db}.lw-info-box{display:flex;gap:12px;padding:16px;border:1px solid #e5e7eb;border-radius:12px;background:#f9fafb;margin-bottom:16px;margin-top:32px}.lw-info-box-icon{flex-shrink:0;color:#6b7280;margin-top:6px}.lw-info-box-content{flex:1;min-width:0;font-size:14px}.lw-info-box-content p{margin:0 0 8px}.lw-info-box-content p:last-child{margin-bottom:0}.lw-info-box-content pre{margin:8px 0 0!important}.lw-info-box-content [data-component-part=\"code-block-root\"]{padding-top:6px!important}.lw-info-box-content .code-block{margin-bottom:0!important}.dark .lw-info-box{border-color:#374151;background:rgba(255, 255, 255, 0.03)}.dark .lw-info-box-icon{color:#9ca3af}.lw-accordion{border:1px solid #e5e7eb;border-radius:12px;margin-bottom:8px;overflow:hidden}.lw-accordion-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;cursor:pointer;transition:background 0.15s;list-style:none}.lw-accordion-header:hover{background:#f9fafb}.lw-accordion-title{font-size:14px}.lw-accordion-chevron{flex-shrink:0;transition:transform 0.2s;color:#9ca3af}.lw-accordion[data-open] .lw-accordion-chevron{transform:rotate(180deg)}.lw-accordion-body{display:none;padding:0 16px 16px;border-top:1px solid #e5e7eb}.lw-accordion[data-open] .lw-accordion-body{display:block}.lw-accordion-static .lw-accordion-header{cursor:default}.lw-accordion-static .lw-accordion-header:hover{background:transparent}.lw-prompt-source{display:none}.lw-accordion-commands{display:flex;gap:16px;margin-top:12px}.lw-accordion-cmd-col{flex:1;min-width:0}.lw-accordion-cmd-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:#6b7280;margin-bottom:6px}.lw-accordion-cmd-box{display:flex;align-items:center;gap:8px;padding:8px 12px;background:#f9fafb;border-radius:8px;border:1px solid #e5e7eb;cursor:pointer;transition:border-color 0.15s}.lw-accordion-cmd-box:hover{border-color:#d1d5db}.lw-accordion-cmd-box code{font-size:13px;font-family:var(--font-mono, monospace);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0;background:transparent!important;padding:0!important;border:none!important}.lw-slash-command{color:#e17100;font-weight:600}.lw-accordion-cmd-box[data-copied]{border-color:#059669;background:#ecfdf5}.lw-accordion-cmd-box[data-copied] .lw-copy-line-icon{display:none!important}.lw-accordion-cmd-box[data-copied] .lw-copy-line-check{display:inline-flex!important}.lw-accordion-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.lw-accordion-action{display:flex;align-items:center;gap:8px;padding:6px 12px 6px 6px;border:1px solid #e5e7eb;border-radius:8px;background:transparent;cursor:pointer;text-decoration:none;color:inherit;transition:all 0.15s;text-align:left}.lw-accordion-action:hover{background:#f9fafb;border-color:#d1d5db}.lw-accordion-action-icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:1px solid #e5e7eb;border-radius:6px;color:#6b7280;flex-shrink:0}.lw-accordion-action-text{display:flex;flex-direction:column;line-height:1.2}.lw-accordion-action-title{font-size:13px;font-weight:500}.lw-accordion-action-subtitle{font-size:11px;font-weight:400;color:#9ca3af}.lw-accordion-action[data-copied]{background:#ecfdf5;border-color:#059669}.lw-accordion-action[data-copied] .lw-copy-line-icon{display:none!important}.lw-accordion-action[data-copied] .lw-copy-line-check{display:flex!important}.dark .lw-accordion{border-color:#374151}.dark .lw-accordion-header:hover{background:rgba(255, 255, 255, 0.03)}.dark .lw-accordion-static .lw-accordion-header:hover{background:transparent}.dark .lw-accordion-body{border-top-color:#374151}.dark .lw-accordion-cmd-box{background:rgba(255, 255, 255, 0.05);border-color:#374151}.dark .lw-accordion-cmd-box:hover{border-color:#6b7280}.dark .lw-accordion-cmd-box[data-copied]{background:rgba(5, 150, 105, 0.15);border-color:rgba(5, 150, 105, 0.4)}.dark .lw-accordion-action{border-color:#374151}.dark .lw-accordion-action-icon{border-color:#374151}.dark .lw-accordion-action:hover{background:rgba(255, 255, 255, 0.03);border-color:#6b7280}.dark .lw-accordion-action[data-copied]{background:rgba(5, 150, 105, 0.15);border-color:rgba(5, 150, 105, 0.4)}.dark .lw-accordion-chevron{color:#6b7280}.dark .lw-slash-command{color:#fe9a00}#sidebar-group .group>img{align-self:center}#footer{flex-wrap:wrap;row-gap:0}.lw-agent-report{flex:0 0 100%;font-size:14px;color:#9ca3af;padding-bottom:12px}.lw-agent-report a{color:inherit;text-decoration:underline;text-underline-offset:2px}.lw-agent-report a:hover{color:#6b7280}.lw-agent-report code{font-size:13px;white-space:nowrap;background:rgba(0, 0, 0, 0.04);border:1px solid #e5e7eb;border-radius:4px;padding:1px 5px}.dark .lw-agent-report{color:#6b7280}.dark .lw-agent-report a:hover{color:#9ca3af}.dark .lw-agent-report code{background:rgba(255, 255, 255, 0.05);border-color:#374151}"}],"page":{"pagePath":"dspy-visualization/rag-visualization","slug":"/dspy-visualization/rag-visualization","pageMetadata":{"title":"RAG Visualization","description":"Visualize DSPy RAG optimization steps in LangWatch to better understand performance and support AI agent testing.","href":"/dspy-visualization/rag-visualization"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Visualize DSPy RAG optimization steps in LangWatch to better understand performance and support AI agent testing.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,..._provideComponents(),...props.components},{Card,CodeBlock,Frame,Heading,OptimizedImage}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:_jsx(_components.a,{href:`https://colab.research.google.com/github/langwatch/langevals/blob/main/notebooks/tutorials/dspy_rag.ipynb`,children:_jsx(OptimizedImage,{align:`center`,src:`https://colab.research.google.com/assets/colab-badge.svg`,alt:`Open in Colab`})})}),`\n`,_jsxs(_components.p,{children:[`LangWatch tracks the optimization of a RAG application built with `,_jsx(_components.a,{href:`https://dspy-docs.vercel.app`,children:`DSPy`}),`, step by step.`]}),`\n`,_jsx(Heading,{level:`2`,id:`dspy-rag-module`,children:`DSPy RAG Module`}),`\n`,_jsxs(_components.p,{children:[`The example RAG application is the sample app from the official DSPy documentation.\nFor more detail, see the `,_jsx(_components.a,{href:`https://dspy-docs.vercel.app/docs/tutorials/rag`,children:`RAG tutorial`}),`.`]}),`\n`,_jsx(_components.p,{children:`Firstly, lets access the dataset of wiki abstracts that will be used for example RAG optimization.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`17`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`17`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` dspy`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`lm `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` dspy.LM(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'openai/gpt-6-luna'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`colbertv2_wiki17_abstracts `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` dspy.ColBERTv2(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`url`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'http://20.102.90.50:2017/wiki17_abstracts'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`dspy.configure(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`lm`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`lm, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`rm`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`colbertv2_wiki17_abstracts)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` dspy.datasets `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` HotPotQA`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Load the dataset.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`dataset `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` HotPotQA(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`train_seed`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`1`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`train_size`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`20`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`eval_seed`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`2023`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`dev_size`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`50`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`test_size`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`0`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Tell DSPy that the 'question' field is the input. Any other fields are labels and/or metadata.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`trainset `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [x.with_inputs(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'question'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`for`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` x `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`in`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` dataset.train]`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`devset `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [x.with_inputs(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'question'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`for`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` x `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`in`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` dataset.dev]`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`len`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(trainset), `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`len`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(devset)`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Next step - to define the RAG module itself.\nYou can explain the task and what the expected outputs mean in this context that an LLM can optimize these commands later.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`19`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`19`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` GenerateAnswer`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`dspy`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Signature`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"\"\"Answer questions with short factoid answers.\"\"\"`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` context `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` dspy.InputField(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`desc`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"may contain relevant facts\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` question `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` dspy.InputField()`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` answer `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` dspy.OutputField(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`desc`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"often between 1 and 5 words\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` RAG`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`dspy`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Module`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` def`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` __init__`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`num_passages`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`3`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` super`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`().`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`__init__`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.retrieve `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` dspy.Retrieve(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`k`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`num_passages)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.generate_answer `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` dspy.ChainOfThought(GenerateAnswer)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` forward`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`question`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` context `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.retrieve(question).passages`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` prediction `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.generate_answer(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`context`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`context, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`question`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`question)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` dspy.Prediction(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`context`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`context, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`answer`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`prediction.answer)`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Finally, you can connect to LangWatch. After running this code snippet - you will get a link that will give you access to\nan `,_jsx(_components.code,{children:`api_key`}),` in the browser. Paste the API key into your code editor popup and press enter - `,_jsx(_components.strong,{children:`now you are connected to LangWatch`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` langwatch`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`langwatch.endpoint `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://app.langwatch.ai\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`langwatch.login()`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Last step is to actually run the prompt optitmizer. In this example `,_jsx(_components.code,{children:`BootstrapFewShot`}),` is used and it will\nbootstrap our prompt with the best demos from our dataset.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`21`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`21`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` langwatch`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` dspy.teleprompt `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` BootstrapFewShot`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` dspy `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` evaluate`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` dotenv `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` load_dotenv`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`load_dotenv()`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Validation logic: check that the predicted answer is correct.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Also check that the retrieved context does actually contain that answer.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` validate_context_and_answer`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`example`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`pred`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`trace`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`None`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` answer_EM `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` evaluate.answer_exact_match(example, pred)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` answer_PM `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` evaluate.answer_passage_match(example, pred)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` answer_EM `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`and`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` answer_PM`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Set up a basic teleprompter, which will compile our RAG program.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`teleprompter `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` BootstrapFewShot(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`metric`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`validate_context_and_answer)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`langwatch.dspy.init(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`experiment`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"rag-dspy-tutorial\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`optimizer`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`teleprompter)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Compile!`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`compiled_rag `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` teleprompter.compile(RAG(), `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`trainset`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`trainset)`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`The result of optimization can be found on your LangWatch dashboard. On the graph you can see how many demos were boostrapped during the first optimization step.`}),`\n`,_jsx(Frame,{caption:`DSPy Experiment Dashboard`,children:_jsx(OptimizedImage,{className:`mint-block`,src:`https://mintcdn.com/langwatch/UFU4yqeW-QWPi3A0/images/screenshot-rag-dspy-tutorial.png?fit=max\u0026auto=format\u0026n=UFU4yqeW-QWPi3A0\u0026q=85\u0026s=b4e56a7c3f7aa6cfe62b622276b9b321`,alt:`DSPy Experiment Dashboard`,\"data-og-width\":`2594`,width:`2594`,\"data-og-height\":`1598`,height:`1598`,\"data-path\":`images/screenshot-rag-dspy-tutorial.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/langwatch/UFU4yqeW-QWPi3A0/images/screenshot-rag-dspy-tutorial.png?w=280\u0026fit=max\u0026auto=format\u0026n=UFU4yqeW-QWPi3A0\u0026q=85\u0026s=e4263a86a0490480681ceb0d880f4c20 280w, https://mintcdn.com/langwatch/UFU4yqeW-QWPi3A0/images/screenshot-rag-dspy-tutorial.png?w=560\u0026fit=max\u0026auto=format\u0026n=UFU4yqeW-QWPi3A0\u0026q=85\u0026s=5711be78c2e0faf2af8986a91ac3dc45 560w, https://mintcdn.com/langwatch/UFU4yqeW-QWPi3A0/images/screenshot-rag-dspy-tutorial.png?w=840\u0026fit=max\u0026auto=format\u0026n=UFU4yqeW-QWPi3A0\u0026q=85\u0026s=2f59109765cdc10a041e415650b274af 840w, https://mintcdn.com/langwatch/UFU4yqeW-QWPi3A0/images/screenshot-rag-dspy-tutorial.png?w=1100\u0026fit=max\u0026auto=format\u0026n=UFU4yqeW-QWPi3A0\u0026q=85\u0026s=aff3491a0be524a5082fa60a65d2251f 1100w, https://mintcdn.com/langwatch/UFU4yqeW-QWPi3A0/images/screenshot-rag-dspy-tutorial.png?w=1650\u0026fit=max\u0026auto=format\u0026n=UFU4yqeW-QWPi3A0\u0026q=85\u0026s=aa5d904da3c4311e40789ac5df0855e1 1650w, https://mintcdn.com/langwatch/UFU4yqeW-QWPi3A0/images/screenshot-rag-dspy-tutorial.png?w=2500\u0026fit=max\u0026auto=format\u0026n=UFU4yqeW-QWPi3A0\u0026q=85\u0026s=84a46b3e668b8696c466c779530cec30 2500w`})}),`\n`,_jsx(_components.p,{children:`Additionally, you can see each LLM call that has been done during the optimization with the corresponding costs and token counts.`}),`\n`,_jsx(Frame,{caption:`DSPy LLM calls`,children:_jsx(OptimizedImage,{className:`mint-block`,src:`https://mintcdn.com/langwatch/UFU4yqeW-QWPi3A0/images/screenshot-dspy-llm-calls.png?fit=max\u0026auto=format\u0026n=UFU4yqeW-QWPi3A0\u0026q=85\u0026s=9d206c3e6b584ddcdfc033353d2c59b1`,alt:`DSPy LLM calls`,\"data-og-width\":`1728`,width:`1728`,\"data-og-height\":`1644`,height:`1644`,\"data-path\":`images/screenshot-dspy-llm-calls.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/langwatch/UFU4yqeW-QWPi3A0/images/screenshot-dspy-llm-calls.png?w=280\u0026fit=max\u0026auto=format\u0026n=UFU4yqeW-QWPi3A0\u0026q=85\u0026s=14b47e527977473ac10ba38cde6493e6 280w, https://mintcdn.com/langwatch/UFU4yqeW-QWPi3A0/images/screenshot-dspy-llm-calls.png?w=560\u0026fit=max\u0026auto=format\u0026n=UFU4yqeW-QWPi3A0\u0026q=85\u0026s=b6ca0fd1cbd678842f1c2e241c46fbaf 560w, https://mintcdn.com/langwatch/UFU4yqeW-QWPi3A0/images/screenshot-dspy-llm-calls.png?w=840\u0026fit=max\u0026auto=format\u0026n=UFU4yqeW-QWPi3A0\u0026q=85\u0026s=de2f74c373c831b3173bff488ae991f7 840w, https://mintcdn.com/langwatch/UFU4yqeW-QWPi3A0/images/screenshot-dspy-llm-calls.png?w=1100\u0026fit=max\u0026auto=format\u0026n=UFU4yqeW-QWPi3A0\u0026q=85\u0026s=0b0e3a882429c48ea240562fda3aef2f 1100w, https://mintcdn.com/langwatch/UFU4yqeW-QWPi3A0/images/screenshot-dspy-llm-calls.png?w=1650\u0026fit=max\u0026auto=format\u0026n=UFU4yqeW-QWPi3A0\u0026q=85\u0026s=1f0e4172c05c0c5b1baaeef0d41c6cd6 1650w, https://mintcdn.com/langwatch/UFU4yqeW-QWPi3A0/images/screenshot-dspy-llm-calls.png?w=2500\u0026fit=max\u0026auto=format\u0026n=UFU4yqeW-QWPi3A0\u0026q=85\u0026s=88d7ec590a2b69aebe5b4c95f3c461e7 2500w`})}),`\n`,_jsx(Card,{title:`Open in Notebook`,icon:`github`,href:`https://github.com/langwatch/langevals/blob/main/notebooks/tutorials/dspy_rag.ipynb`,children:_jsx(_components.p,{children:`You can access and run the code yourself in Jupyter Notebook`})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"RAG Visualization","description":"Visualize DSPy RAG optimization steps in LangWatch to better understand performance and support AI agent testing.","href":"/dspy-visualization/rag-visualization"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"DSPy RAG Module","slug":"dspy-rag-module","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/docs/_mintlify/custom/langwatch/1c7dbbb4aa0b0c87/expand-menus.js","/docs/_mintlify/custom/langwatch/fdd2d1ee81d630a0/posthog.js"],"dynamicCss":".mint-block {\n display: block\n}","subdomain":"langwatch","siteName":"LangWatch","title":"RAG Visualization - LangWatch","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-29T01:41:38.236Z","gitLastModified":"2026-10-29T01:40:40.000Z","originalFileLocation":"dspy-visualization/rag-visualization.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Visualize DSPy RAG optimization steps in LangWatch to better understand performance and support AI agent testing.\">\u003cmeta data-mint-head name=\"application-name\" content=\"LangWatch\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/langwatch/kXoUUhFGtPYqSZK4/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/docs/mintlify-assets/_mintlify/favicons/langwatch/kXoUUhFGtPYqSZK4/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/langwatch/kXoUUhFGtPYqSZK4/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/langwatch/kXoUUhFGtPYqSZK4/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/langwatch/kXoUUhFGtPYqSZK4/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/langwatch/kXoUUhFGtPYqSZK4/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/langwatch/kXoUUhFGtPYqSZK4/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/langwatch/kXoUUhFGtPYqSZK4/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/langwatch/kXoUUhFGtPYqSZK4/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"RAG Visualization - LangWatch\">\u003cmeta data-mint-head property=\"og:description\" content=\"Visualize DSPy RAG optimization steps in LangWatch to better understand performance and support AI agent testing.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"LangWatch\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://langwatch.ai/docs/dspy-visualization/rag-visualization\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://langwatch.mintlify.site/docs/_mintlify/api/og/v2?division=DSPy+Optimization\u0026amp;title=RAG+Visualization\u0026amp;description=Visualize+DSPy+RAG+optimization+steps+in+LangWatch+to+better+understand+performance+and+support+AI+agent+testing.\u0026amp;theme=c82022416a7a1873b973b6a4\u0026amp;signature=550999b8df4215864bbad9f06309722a8f45204ec90ab4c448da37a0af96c781\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"RAG Visualization - LangWatch\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Visualize DSPy RAG optimization steps in LangWatch to better understand performance and support AI agent testing.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://langwatch.mintlify.site/docs/_mintlify/api/og/v2?division=DSPy+Optimization\u0026amp;title=RAG+Visualization\u0026amp;description=Visualize+DSPy+RAG+optimization+steps+in+LangWatch+to+better+understand+performance+and+support+AI+agent+testing.\u0026amp;theme=c82022416a7a1873b973b6a4\u0026amp;signature=550999b8df4215864bbad9f06309722a8f45204ec90ab4c448da37a0af96c781\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/docs/mintlify-assets/_mintlify/favicons/langwatch/kXoUUhFGtPYqSZK4/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"LangWatch\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#e17100\">\u003clink data-mint-head rel=\"canonical\" href=\"https://langwatch.ai/docs/dspy-visualization/rag-visualization\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/dspy-visualization/rag-visualization.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://langwatch.ai/#organization\",\"name\":\"LangWatch\",\"url\":\"https://langwatch.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://langwatch.ai/docs/logo/light.svg\"},\"sameAs\":[\"https://github.com/langwatch/langwatch\",\"https://x.com/langwatchai\",\"https://www.linkedin.com/company/langwatch/\",\"https://www.youtube.com/@LangWatch\"]},{\"@type\":\"WebSite\",\"@id\":\"https://langwatch.ai/docs#website\",\"name\":\"LangWatch\",\"url\":\"https://langwatch.ai/docs\",\"publisher\":{\"@id\":\"https://langwatch.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://langwatch.ai/docs/dspy-visualization/rag-visualization#webpage\",\"url\":\"https://langwatch.ai/docs/dspy-visualization/rag-visualization\",\"name\":\"RAG Visualization\",\"description\":\"Visualize DSPy RAG optimization steps in LangWatch to better understand performance and support AI agent testing.\",\"dateModified\":\"2026-10-29T01:40:40.000Z\",\"isPartOf\":{\"@id\":\"https://langwatch.ai/docs#website\"},\"breadcrumb\":{\"@id\":\"https://langwatch.ai/docs/dspy-visualization/rag-visualization#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://langwatch.ai/docs/dspy-visualization/rag-visualization#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Frameworks\",\"item\":\"https://langwatch.ai/docs/integration/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DSPy Optimization\",\"item\":\"https://langwatch.ai/docs/dspy-visualization/quickstart\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"RAG Visualization\",\"item\":\"https://langwatch.ai/docs/dspy-visualization/rag-visualization\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://langwatch.ai/docs/dspy-visualization/rag-visualization#article\",\"headline\":\"RAG Visualization\",\"name\":\"RAG Visualization\",\"description\":\"Visualize DSPy RAG optimization steps in LangWatch to better understand performance and support AI agent testing.\",\"url\":\"https://langwatch.ai/docs/dspy-visualization/rag-visualization\",\"mainEntityOfPage\":{\"@id\":\"https://langwatch.ai/docs/dspy-visualization/rag-visualization#webpage\"},\"dateModified\":\"2026-10-29T01:40:40.000Z\",\"publisher\":{\"@id\":\"https://langwatch.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://langwatch.ai/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"LangWatch\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"LangWatch","nav":{"global":{"anchors":[{"anchor":"Get Support","icon":"life-ring","href":"https://docs.langwatch.ai/support#email-support"}]},"anchors":[{"anchor":"Platform","icon":"book-open","pages":[{"title":"Platform","href":"/introduction"}]},{"anchor":"Observability","icon":"plug","groups":[{"group":"Overview","pages":[{"title":"Getting Started","href":"/integration/overview"},{"title":"Choosing the right OTel endpoint","sidebarTitle":"Trace vs governance ingestion","href":"/observability/trace-vs-activity-ingestion"}]},{"group":"SDKs","root":{"title":"Getting Started","href":"/integration/overview"},"expanded":true,"pages":[{"group":"Python","icon":"python","pages":[{"title":"Python Integration Guide","sidebarTitle":"Guide","href":"/integration/python/guide"},{"title":"Python SDK API Reference","sidebarTitle":"Reference","icon":"terminal","href":"/integration/python/reference"},{"title":"Python Connected Agent Reference","sidebarTitle":"Agent reference","icon":"terminal","href":"/integration/python/agent-reference"},{"title":"Manual Instrumentation","href":"/integration/python/tutorials/manual-instrumentation"},{"title":"OpenTelemetry Migration","href":"/integration/python/tutorials/open-telemetry"}]},{"group":"TypeScript","icon":"typescript","pages":[{"title":"TypeScript Integration Guide","sidebarTitle":"Guide","href":"/integration/typescript/guide"},{"title":"TypeScript SDK API Reference","sidebarTitle":"Reference","icon":"terminal","href":"/integration/typescript/reference"},{"title":"TypeScript Connected Agent Reference","sidebarTitle":"Agent reference","icon":"terminal","href":"/integration/typescript/agent-reference"},{"title":"Filtering Spans in TypeScript","sidebarTitle":"Filtering Spans","icon":"filter","href":"/integration/typescript/tutorials/filtering-spans"},{"title":"Manual Instrumentation","sidebarTitle":"Manual Control","href":"/integration/typescript/tutorials/manual-instrumentation"},{"title":"OpenTelemetry Migration","href":"/integration/typescript/tutorials/opentelemetry-migration"},{"title":"Debugging and Troubleshooting","sidebarTitle":"Debugging","href":"/integration/typescript/tutorials/debugging-typescript"},{"title":"Semantic Conventions","sidebarTitle":"Semantic Conventions","href":"/integration/typescript/tutorials/semantic-conventions"}]},{"group":"Go SDK","icon":"/images/logos/golang.svg","pages":[{"title":"Go Integration Guide","sidebarTitle":"Guide","href":"/integration/go/guide"},{"title":"Go SDK API Reference","sidebarTitle":"Reference","icon":"terminal","href":"/integration/go/reference"}]},{"title":"Metadata and Labels","sidebarTitle":"Metadata \u0026 Labels","icon":"tags","href":"/integration/metadata-and-labels"},{"group":"Tutorials","pages":[{"group":"Capturing Input/Output","pages":[{"title":"Capturing and Mapping Inputs \u0026 Outputs","sidebarTitle":"Python","icon":"python","href":"/integration/python/tutorials/capturing-mapping-input-output"},{"title":"Capturing and Mapping Inputs \u0026 Outputs","sidebarTitle":"TypeScript/JS","icon":"square-js","href":"/integration/typescript/tutorials/capturing-input-output"}]},{"group":"Capturing RAG","pages":[{"title":"Capturing RAG","sidebarTitle":"Python","icon":"python","href":"/integration/python/tutorials/capturing-rag"},{"title":"Capturing RAG","sidebarTitle":"TypeScript/JS","icon":"square-js","href":"/integration/typescript/tutorials/capturing-rag"}]},{"group":"Capturing Metadata","pages":[{"title":"Capturing Metadata and Attributes","sidebarTitle":"Python","icon":"python","href":"/integration/python/tutorials/capturing-metadata"},{"title":"Capturing Metadata and Attributes","sidebarTitle":"TypeScript/JS","icon":"square-js","href":"/integration/typescript/tutorials/capturing-metadata"}]},{"group":"Capturing Images","pages":[{"title":"Capturing Images","sidebarTitle":"Python","icon":"python","href":"/integration/python/tutorials/capturing-images"},{"title":"Capturing Images","sidebarTitle":"TypeScript/JS","icon":"square-js","href":"/integration/typescript/tutorials/capturing-images"}]},{"group":"Capturing Documents","pages":[{"title":"Capturing Documents","sidebarTitle":"Python","icon":"python","href":"/integration/python/tutorials/capturing-documents"},{"title":"Capturing Documents","sidebarTitle":"TypeScript/JS","icon":"square-js","href":"/integration/typescript/tutorials/capturing-documents"}]},{"group":"Capturing Audio and Voice","pages":[{"title":"Capturing Audio and Voice","sidebarTitle":"Python","icon":"python","href":"/integration/python/tutorials/capturing-audio"},{"title":"Capturing Audio and Voice","sidebarTitle":"TypeScript/JS","icon":"square-js","href":"/integration/typescript/tutorials/capturing-audio"}]},{"group":"Tracking LLM Costs","pages":[{"title":"Tracking LLM Costs and Tokens","sidebarTitle":"Python","icon":"python","href":"/integration/python/tutorials/tracking-llm-costs"},{"title":"Tracking LLM Costs and Tokens","sidebarTitle":"TypeScript/JS","icon":"square-js","href":"/integration/typescript/tutorials/tracking-llm-costs"}]},{"group":"Tracking Time to First Token","pages":[{"title":"Tracking Time to First Token (TTFT)","sidebarTitle":"Python","icon":"python","href":"/integration/python/tutorials/tracking-time-to-first-token"},{"title":"Tracking Time to First Token (TTFT)","sidebarTitle":"TypeScript/JS","icon":"square-js","href":"/integration/typescript/tutorials/tracking-time-to-first-token"}]},{"group":"Tracking Tool Calls","pages":[{"title":"Tracking Tool Calls","sidebarTitle":"Python","icon":"python","href":"/integration/python/tutorials/tracking-tool-calls"},{"title":"Tracking Tool Calls","sidebarTitle":"TypeScript/JS","icon":"square-js","href":"/integration/typescript/tutorials/tracking-tool-calls"}]},{"group":"Tracking Conversations","pages":[{"title":"Tracking Conversations","sidebarTitle":"Python","icon":"python","href":"/integration/python/tutorials/tracking-conversations"},{"title":"Tracking Conversations","sidebarTitle":"TypeScript/JS","icon":"square-js","href":"/integration/typescript/tutorials/tracking-conversations"}]},{"group":"Evaluations \u0026 Guardrails","pages":[{"title":"Capturing Evaluations \u0026 Guardrails","sidebarTitle":"Evaluations \u0026 Guardrails","href":"/integration/python/tutorials/capturing-evaluations-guardrails"}]},{"title":"Combining the SDK with OpenTelemetry Spans","href":"/integration/tutorials/open-telemetry"}]}]},{"group":"Frameworks","root":{"title":"Getting Started","href":"/integration/overview"},"expanded":true,"pages":[{"group":"LangChain","expanded":true,"pages":[{"title":"LangChain Instrumentation","sidebarTitle":"Python","icon":"python","href":"/integration/python/integrations/langchain"},{"title":"LangChain Instrumentation","sidebarTitle":"TypeScript/JS","icon":"square-js","href":"/integration/typescript/integrations/langchain"}]},{"group":"LangGraph","expanded":true,"pages":[{"title":"LangGraph Instrumentation","sidebarTitle":"LangGraph","icon":"python","href":"/integration/python/integrations/langgraph"},{"title":"LangGraph Instrumentation","sidebarTitle":"TypeScript/JS","icon":"square-js","href":"/integration/typescript/integrations/langgraph"}]},{"title":"Vercel AI SDK","sidebarTitle":"Vercel AI SDK","href":"/integration/typescript/integrations/vercel-ai-sdk"},{"title":"OpenAI Agents SDK Instrumentation","sidebarTitle":"OpenAI Agents","href":"/integration/python/integrations/open-ai-agents"},{"title":"PydanticAI Instrumentation","sidebarTitle":"PydanticAI","href":"/integration/python/integrations/pydantic-ai"},{"title":"Mastra","sidebarTitle":"Mastra","href":"/integration/typescript/integrations/mastra"},{"title":"DSPy Instrumentation","sidebarTitle":"DSPy","href":"/integration/python/integrations/dspy"},{"group":"DSPy Optimization","pages":[{"title":"DSPy Visualization Quickstart","sidebarTitle":"Quickstart","href":"/dspy-visualization/quickstart"},{"title":"Tracking Custom DSPy Optimizer","sidebarTitle":"Custom Optimizer Tracking","description":"Track custom DSPy optimizer logic in LangWatch to visualize optimization steps and improve AI agent testing workflows.","href":"/dspy-visualization/custom-optimizer"},{"title":"RAG Visualization","href":"/dspy-visualization/rag-visualization"}]},{"title":"LlamaIndex Instrumentation","sidebarTitle":"LlamaIndex","description":"Instrument LlamaIndex applications with LangWatch to trace retrieval, generation, and RAG behavior for AI agent evaluations.","href":"/integration/python/integrations/llamaindex"},{"title":"Haystack Instrumentation","sidebarTitle":"Haystack","href":"/integration/python/integrations/haystack"},{"title":"Strands Agents Instrumentation","sidebarTitle":"Strands Agents","href":"/integration/python/integrations/strand-agents"},{"title":"Agno Instrumentation","sidebarTitle":"Agno","href":"/integration/python/integrations/agno"},{"title":"CrewAI","href":"/integration/python/integrations/crew-ai"},{"title":"AutoGen Instrumentation","sidebarTitle":"AutoGen","href":"/integration/python/integrations/autogen"},{"title":"Semantic Kernel Instrumentation","sidebarTitle":"Semantic Kernel","href":"/integration/python/integrations/semantic-kernel"},{"title":"Spring AI (Java) Integration","sidebarTitle":"Spring AI","href":"/integration/java/integrations/spring-ai"},{"title":"PromptFlow Instrumentation","sidebarTitle":"PromptFlow","href":"/integration/python/integrations/promptflow"},{"title":"Instructor AI Instrumentation","sidebarTitle":"Instructor AI","href":"/integration/python/integrations/instructor"},{"title":"SmolAgents Instrumentation","sidebarTitle":"SmolAgents","href":"/integration/python/integrations/smolagents"},{"title":"Google Agent Development Kit (ADK) Instrumentation","sidebarTitle":"Google ADK","href":"/integration/python/integrations/google-ai"},{"title":"Firebase Genkit Integration","sidebarTitle":"Genkit","href":"/integration/go/integrations/genkit"},{"title":"Other OpenTelemetry Instrumentors","sidebarTitle":"Other","href":"/integration/python/integrations/other"}]},{"group":"Model Providers","root":{"title":"Getting Started","href":"/integration/overview"},"expanded":true,"pages":[{"title":"Custom Models","sidebarTitle":"Custom Models","href":"/integration/custom-models"},{"group":"OpenAI","expanded":true,"pages":[{"title":"OpenAI Instrumentation","sidebarTitle":"Python","icon":"python","href":"/integration/python/integrations/open-ai"},{"title":"OpenAI","sidebarTitle":"TypeScript/JS","icon":"square-js","href":"/integration/typescript/integrations/open-ai"},{"title":"OpenAI Instrumentation","sidebarTitle":"Go SDK","icon":"golang","href":"/integration/go/integrations/open-ai"}]},{"group":"Anthropic (Claude)","expanded":true,"pages":[{"title":"Claude Platform (Claude API OpenTelemetry)","sidebarTitle":"Claude Platform","icon":"cloud","href":"/integration/anthropic/claude-platform"},{"title":"Anthropic Instrumentation","sidebarTitle":"Python","icon":"python","href":"/integration/python/integrations/anthropic"},{"title":"Anthropic (Claude) Integration","sidebarTitle":"Go SDK","icon":"golang","href":"/integration/go/integrations/anthropic"}]},{"group":"Microsoft Azure","expanded":true,"pages":[{"title":"Azure AI Inference SDK Instrumentation","sidebarTitle":"Python","icon":"python","href":"/integration/python/integrations/azure-ai"},{"title":"Azure OpenAI Instrumentation","sidebarTitle":"Azure OpenAI","href":"/integration/python/integrations/open-ai-azure"},{"title":"Azure OpenAI","sidebarTitle":"TypeScript/JS","icon":"square-js","href":"/integration/typescript/integrations/azure"},{"title":"Azure OpenAI Integration","sidebarTitle":"Go SDK","icon":"golang","href":"/integration/go/integrations/azure-openai"}]},{"group":"Google Cloud","expanded":true,"pages":[{"title":"Google Vertex AI Instrumentation","sidebarTitle":"Vertex AI","icon":"python","href":"/integration/python/integrations/vertex-ai"},{"title":"Google Gemini Integration","sidebarTitle":"Go SDK","icon":"golang","href":"/integration/go/integrations/google-gemini"}]},{"group":"Amazon Web Services","expanded":true,"pages":[{"title":"AWS Bedrock Instrumentation","sidebarTitle":"Bedrock","icon":"python","href":"/integration/python/integrations/aws-bedrock"},{"title":"Amazon Bedrock Integration","sidebarTitle":"Go SDK","icon":"golang","href":"/integration/go/integrations/amazon-bedrock"}]},{"title":"Groq Integration","sidebarTitle":"Groq","href":"/integration/go/integrations/groq"},{"title":"Grok (xAI) Integration","sidebarTitle":"Grok (xAI)","href":"/integration/go/integrations/grok"},{"title":"Ollama (Local Models) Integration","sidebarTitle":"Ollama (Local)","href":"/integration/go/integrations/ollama"},{"group":"OpenRouter","pages":[{"title":"OpenRouter Broadcast Integration","sidebarTitle":"OpenRouter Broadcast","href":"/integration/openrouter-broadcast"},{"title":"OpenRouter Integration","sidebarTitle":"OpenRouter","href":"/integration/go/integrations/openrouter"}]},{"group":"LiteLLM","expanded":true,"pages":[{"title":"LiteLLM Proxy Integration","sidebarTitle":"LiteLLM Proxy","href":"/integration/litellm-proxy"},{"title":"LiteLLM Instrumentation","sidebarTitle":"LiteLLM","href":"/integration/python/integrations/lite-llm"}]}]},{"group":"Tools","expanded":true,"pages":[{"title":"OpenClaw Integration","sidebarTitle":"OpenClaw","href":"/integration/openclaw"}]},{"group":"No-Code Platforms","root":{"title":"Getting Started","href":"/integration/overview"},"expanded":true,"pages":[{"title":"LangWatch + n8n Integration","sidebarTitle":"n8n","href":"/integration/n8n"},{"title":"Langflow Integration","sidebarTitle":"Langflow","href":"/integration/langflow"},{"title":"Flowise Integration","sidebarTitle":"Flowise","href":"/integration/flowise"}]},{"group":"Direct Integrations","root":{"title":"Getting Started","href":"/integration/overview"},"expanded":true,"pages":[{"title":"OpenTelemetry Integration Guide","sidebarTitle":"OpenTelemetry","icon":"telescope","href":"/integration/opentelemetry/guide"},{"title":"Running LangWatch with Other OTel SDKs","sidebarTitle":"Multiple OTel Providers","icon":"layer-group","href":"/integration/opentelemetry/multiple-providers"},{"title":"REST API","sidebarTitle":"HTTP API","icon":"globe","href":"/integration/rest-api"}]}]},{"anchor":"AI Gateway","icon":"route","pages":[{"title":"AI Gateway","href":"/ai-gateway/overview"}]},{"anchor":"AI Governance","icon":"shield-check","pages":[{"title":"AI Governance","href":"/ai-governance/overview"}]},{"anchor":"Coding Agents","icon":"square-terminal","pages":[{"title":"Coding Agents","href":"/coding-agents/overview"}]},{"anchor":"Langy","icon":"robot","pages":[{"title":"Langy","href":"/langy/overview"}]},{"anchor":"Self Hosting","icon":"server","pages":[{"title":"Self Hosting","href":"/self-hosting/overview"}]},{"anchor":"API Reference","icon":"code","pages":[{"title":"API Reference","href":"/api-reference/introduction"}]}]},"basePath":"","title":"RAG Visualization - LangWatch","buildId":"dpl_ATnXPMW25DMPUr9VBw6kL6MfBt6T","deploymentId":"dpl_ATnXPMW25DMPUr9VBw6kL6MfBt6T","dynamics":["10e4515597","a74be98ba7","07c022d89b"],"chunks":["BannerMarkdown-B5WzX-8C.js","dist-BPypQKlo.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","clsx-6wHzaN2_.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","zoom-image-lightbox-CypZe82l.js","lightbox-handle-r17bVUz3.js","Frame-BDAj7nBh.js","DynamicMarkdown-Bq09mRwR.js"]}