{"id":4667,"date":"2025-04-23T04:50:54","date_gmt":"2025-04-23T11:50:54","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/couchbase-partners-arize-ai\/"},"modified":"2025-04-23T04:50:54","modified_gmt":"2025-04-23T11:50:54","slug":"couchbase-partners-arize-ai","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/ko\/couchbase-partners-arize-ai\/","title":{"rendered":"Couchbase Partners with Arize AI to Enable Trustworthy, Production-Ready AI Agent Applications"},"content":{"rendered":"\n<p>As enterprises look to deploy production-ready AI agent applications, Large Language Model (LLM) observability has emerged as a critical requirement for ensuring both performance and trust. Organizations need visibility into how agents interact with data, make decisions, and retrieve information to maintain reliability, security, and compliance. Without proper observability, enterprises risk deploying models that produce inconsistent, inaccurate, or biased results, leading to poor user experiences and operational inefficiencies. The new partnership between <a href=\"https:\/\/www.couchbase.com\/\" target=\"_blank\" rel=\"noopener\">Couchbase <\/a>and <a href=\"https:\/\/arize.com\/\" target=\"_blank\" rel=\"noopener\">Arize AI<\/a> plays a vital role in bringing robust monitoring, evaluation, and optimization capabilities to AI-driven applications.<\/p>\n\n\n\n<p>The integration of Couchbase and Arize AI delivers a powerful solution for building and monitoring Retrieval Augmented Generation (RAG) and agent applications at scale. By leveraging Couchbase&#8217;s high-performance vector database and the Arize AI observability platform and enhanced monitoring capabilities, enterprises can confidently build, deploy and optimize Agentic RAG solutions in production.<\/p>\n\n\n\n<p>In this blog, we\u2019ll walk through creating an Agentic RAG QA chatbot using LangGraph and the Couchbase <a href=\"https:\/\/couchbaselabs.github.io\/agent-catalog\/index.html#\" target=\"_blank\" rel=\"noopener\">Agent Catalog<\/a> component of the recently announced <a href=\"https:\/\/www.couchbase.com\/products\/ai-services\/\" target=\"_blank\" rel=\"noopener\">Capella AI services<\/a> (in preview), and evaluating and optimizing its performance with Arize AI. This is a tangible example of how Couchbase and Arize AI enable developers to enhance retrieval workflows, improve response accuracy, and monitor LLM-powered interactions in real time.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Value of the Couchbase and Arize AI Partnership<\/h2>\n\n\n\n<p>By joining forces, Couchbase and Arize AI are revolutionizing how developers build and evaluate AI agent applications. Developers can construct sophisticated agent applications by leveraging Couchbase Capella as a single data platform for LLM caching, long-term and short-term agent memory, vector embedding use cases, analytics, and operational workloads along with their favorite agent development framework for orchestrating agent workflows.<\/p>\n\n\n\n<p>Couchbase Agent Catalog further enhances this system by providing a centralized store for multi-agent workflows within an organization that allows for storage, management, and discovery of various agent tools, prompt versioning, and LLM trace debugging.<\/p>\n\n\n\n<p>To ensure high reliability and transparency, Arize AI provides critical observability features, including:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>Tracing Agent Function Calls<\/b>: Arize enables detailed monitoring of the agent\u2019s function calls, including retrieval steps and LLM interactions, to track how responses are generated.<\/li>\n\n\n<li><b>Dataset Benchmarking<\/b>: Developers can create a structured dataset to evaluate and compare agent performance over time.<\/li>\n\n\n<li><b>Performance Evaluation with LLM as a Judge<\/b>: Using built-in evaluators, Arize leverages LLMs to assess response accuracy, relevance, and overall agent effectiveness.<\/li>\n\n\n<li><b>Experimenting with Retrieval Strategies<\/b>: By adjusting chunk sizes, overlaps, and the number of retrieved documents (K-value), developers can analyze their impact on agent performance.<\/li>\n\n\n<li><b>Comparative Analysis in Arize<\/b>: The platform allows side-by-side comparisons of different retrieval strategies, helping teams determine the optimal configuration for their agent.<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">The Importance of LLM Observability<\/h3>\n\n\n\n<p>To ensure that AI applications perform well in production, enterprises need a robust evaluation framework. Observability tools like Arize AI allow developers to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Assess LLM outputs based on factors such as relevance, hallucination rates, and latency<\/li>\n\n\n<li>Conduct systematic evaluations to measure the impact of prompt changes, retrieval modifications, and parameter adjustments<\/li>\n\n\n<li>Curate comprehensive datasets to benchmark performance across different use cases<\/li>\n\n\n<li>Automate evaluation processes within CI\/CD pipelines, ensuring consistent application reliability<\/li>\n\n<\/ul>\n\n\n\n<p>Using an LLM as a judge, Arize AI allows developers to measure agent effectiveness using pre-tested evaluators, multi-level custom evaluation techniques, and large-scale performance benchmarking. By running thousands of evaluations, teams can iterate quickly and refine LLM prompts, retrieval methods, and agent workflows to improve overall application quality.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Building an Agentic RAG QA Chatbot<\/h3>\n\n\n\n<p>Agentic RAG combines the power of traditional retrieval-augmented generation with intelligent decision-making. In this implementation, we enable an LLM to dynamically decide whether retrieval is necessary based on the query context.<\/p>\n\n\n\n<figure id=\"attachment_17062\" aria-describedby=\"caption-attachment-17062\" style=\"width: 900px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-17062 size-large\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image1-1-1024x373-1.png\" alt=\"Arize AI for Agentic RAG with Couchbase\" width=\"900\" height=\"328\"><figcaption id=\"caption-attachment-17062\" class=\"wp-caption-text\">Illustration depicting the agent workflow from <a href=\"https:\/\/github.com\/langchain-ai\/langgraph\/blob\/main\/examples\/rag\/langgraph_agentic_rag.ipynb\" target=\"_blank\" rel=\"noopener\">Langgraph\u2019s agentic RAG example<\/a>.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Step-by-Step Implementation<\/h2>\n\n\n\n<p>The rest of this blog is based on the accompanying <a href=\"https:\/\/github.com\/Arize-ai\/tutorials\/blob\/main\/python\/llm\/agents\/couchbase_langgraph_agentic_rag.ipynb\" target=\"_blank\" rel=\"noopener\">tutorial notebook<\/a>. Before building and deploying an observable AI agent, you\u2019ll need to configure your development environment.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Prerequisites:<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>To follow along with this tutorial, you&#8217;ll need to <a href=\"https:\/\/app.arize.com\/auth\/join\" target=\"_blank\" rel=\"noopener\">sign up for Arize<\/a> and get your Space, API and Developer keys. You can see the <a href=\"https:\/\/docs.arize.com\/arize\/llm-tracing\/quickstart-llm#get-your-api-keys\" target=\"_blank\" rel=\"noopener\">guide here<\/a>. You will also need an <a href=\"https:\/\/openai.com\/\" target=\"_blank\" rel=\"noopener\">OpenAI API key<\/a>.<\/li>\n\n\n<li>You&#8217;ll need to setup your Couchbase cluster by doing the following:\n<ol>\n<li aria-level=\"2\">Create an account at <a href=\"https:\/\/cloud.couchbase.com\/\" target=\"_blank\" rel=\"noopener\">Couchbase Cloud<\/a><\/li>\n<li aria-level=\"2\">Create a free cluster with the Data, Index, and Search services enabled*<\/li>\n<li aria-level=\"2\">Create cluster access credentials<\/li>\n<li aria-level=\"2\">Allow access to the cluster from your local machine<\/li>\n<li aria-level=\"2\">Create a bucket to store your documents<\/li>\n<li aria-level=\"2\">Create a <a href=\"https:\/\/docs.couchbase.com\/cloud\/vector-search\/create-vector-search-index-ui.html\" target=\"_blank\" rel=\"noopener\">search index<\/a><\/li>\n<\/ol>\n<\/li>\n\n\n<li>Create tools and prompts required by agents using Couchbase Agent Catalog (for installation and more instructions, explore documentation <a href=\"https:\/\/couchbaselabs.github.io\/agent-catalog\/index.html\" target=\"_blank\" rel=\"noopener\">here<\/a>)<\/li>\n\n<\/ol>\n\n\n\n<p>*The Search Service will be used to perform Semantic Search later when we use Agent catalog.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">1) Create an Agentic RAG chatbot using LangGraph, Couchbase as the vector store and Agent Catalog to manage AI agents<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Setting Up Dependencies<\/h4>\n\n\n<p>[crayon nums=&#8221;false&#8221; wrap=&#8221;true&#8221; lang=&#8221;python&#8221; decode=&#8221;true&#8221;]%pip install -qU langchain-openai langchain-community langchain langgraph langgraph.prebuilt openai langchain-couchbase agentc langchain-huggingface langchain_core<\/p>\n<p>%pip install -qq &#8220;arize-phoenix[evals]&gt;=7.0.0&#8221; &#8220;arize-otel&gt;=0.7.0&#8221; &#8220;openinference-instrumentation-openai&gt;=0.1.18&#8221; &#8220;openinference-instrumentation-langchain&gt;=0.1.29&#8243;[\/crayon]<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Connecting to Couchbase<\/h4>\n\n\n\n<p>We&#8217;ll use Couchbase as our vector store. Here&#8217;s how to set up the connection:<\/p>\n\n\n<p>[crayon nums=&#8221;false&#8221; wrap=&#8221;true&#8221; lang=&#8221;python&#8221; decode=&#8221;true&#8221;]from datetime import timedelta<br \/>\nfrom couchbase.auth import PasswordAuthenticator<br \/>\nfrom couchbase.cluster import Cluster<br \/>\nfrom couchbase.options import ClusterOptions<br \/>\nfrom langchain_couchbase.vectorstores import CouchbaseSearchVectorStore<br \/>\nfrom langchain_huggingface import HuggingFaceEmbeddings<\/p>\n<p># Cluster settings<br \/>\nCB_CONN_STRING = &#8220;your-connection-string&#8221;<br \/>\nCB_USERNAME = &#8220;your-username&#8221;<br \/>\nCB_PASSWORD = &#8220;your-password&#8221;<br \/>\nBUCKET_NAME = &#8220;your-bucket-name&#8221;<br \/>\nSCOPE_NAME = &#8220;your-scope-name&#8221;<br \/>\nCOLLECTION_NAME = &#8220;your-collection-name&#8221;<br \/>\nSEARCH_INDEX_NAME = &#8220;your-search-index-name&#8221;<\/p>\n<p># Connect to couchbase cluster<br \/>\nauth = PasswordAuthenticator(CB_USERNAME, CB_PASSWORD)<br \/>\noptions = ClusterOptions(auth)<br \/>\noptions.apply_profile(&#8220;wan_development&#8221;)<br \/>\ncluster = Cluster(CB_CONN_STRING, options)<br \/>\ncluster.wait_until_ready(timedelta(seconds=5))<\/p>\n<p># Initialize vector store<br \/>\nembeddings = HuggingFaceEmbeddings(model_name=&#8221;sentence-transformers\/all-MiniLM-L12-v2&#8243;)<br \/>\nvector_store = CouchbaseVectorStore(<br \/>\n\u00a0\u00a0\u00a0\u00a0cluster=cluster,<br \/>\n\u00a0\u00a0\u00a0\u00a0bucket_name=BUCKET_NAME,<br \/>\n\u00a0\u00a0\u00a0\u00a0scope_name=SCOPE_NAME,<br \/>\n\u00a0\u00a0\u00a0\u00a0collection_name=COLLECTION_NAME,<br \/>\n\u00a0\u00a0\u00a0\u00a0embedding=embeddings,<br \/>\n\u00a0\u00a0\u00a0\u00a0index_name=SEARCH_INDEX_NAME,<br \/>\n)[\/crayon]<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Document Ingestion<\/h4>\n\n\n\n<p>We&#8217;ll create a helper function to load and index documents with configurable chunking parameters:<\/p>\n\n\n<p>[crayon nums=&#8221;false&#8221; wrap=&#8221;true&#8221; lang=&#8221;python&#8221; decode=&#8221;true&#8221;]from langchain_community.document_loaders import WebBaseLoader<br \/>\nfrom langchain_text_splitters import RecursiveCharacterTextSplitter<\/p>\n<p>def reset_vector_store(vector_store, chunk_size=1024, chunk_overlap=20):<br \/>\n\u00a0\u00a0\u00a0\u00a0try:\u00a0\u00a0\u00a0\u00a0<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# Delete existing documents<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0results = vector_store.similarity_search(<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0k=1000,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0query=&#8221;&#8221;,\u00a0\u00a0<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0search_options={<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;query&#8221;: {&#8220;field&#8221;: &#8220;metadata.source&#8221;, &#8220;match&#8221;: &#8220;lilian_weng_blog&#8221;}<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if results:<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0deleted_ids = [result.id for result in results]<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0vector_store.delete(ids=deleted_ids)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# Load documents from URLs<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0urls = [<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;https:\/\/lilianweng.github.io\/posts\/2024-07-07-hallucination\/&#8221;,<br \/>\n&#8220;https:\/\/lilianweng.github.io\/posts\/2023-03-15-prompt-engineering\/&#8221;,<br \/>\n&#8220;https:\/\/lilianweng.github.io\/posts\/2023-10-25-adv-attack-llm\/&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0docs = [WebBaseLoader(url).load() for url in urls]<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0docs_list = [item for sublist in docs for item in sublist]<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# Use RecursiveCharacterTextSplitter with configurable parameters<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0text_splitter = RecursiveCharacterTextSplitter(<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0chunk_size=chunk_size,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0chunk_overlap=chunk_overlap,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0separators=[&#8220;nn&#8221;, &#8220;n&#8221;, &#8221; &#8220;, &#8220;&#8221;],\u00a0\u00a0<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0doc_splits = text_splitter.split_documents(docs_list)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# Add metadata to documents<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for doc in doc_splits:<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0doc.metadata[&#8220;source&#8221;] = &#8220;lilian_weng_blog&#8221;<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# Add documents to vector store<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0vector_store.add_documents(doc_splits)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return vector_store<br \/>\n\u00a0\u00a0\u00a0\u00a0except ValueError as e:<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(f&#8221;Error: {e}&#8221;)<\/p>\n<p># Initialize with default settings<br \/>\nreset_vector_store(vector_store)[\/crayon]<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Setting Up the Retriever Tool<\/h4>\n\n\n\n<p>Fetch our retriever tool from the Agent Catalog using the <code>agentc<\/code> provider. In the future, when more tools (and\/or prompts) are required and the application grows more complex, Agent Catalog SDK and CLI can be used to automatically fetch the tools based on the use case (semantic search) or by name.<\/p>\n\n\n\n<p>For instructions on how this tool was created and more capabilities of Agent catalog, please refer to the documentation <a href=\"https:\/\/couchbaselabs.github.io\/agent-catalog\/index.html\" target=\"_blank\" rel=\"noopener\">here<\/a>.<\/p>\n\n\n<p>[crayon nums=&#8221;false&#8221; wrap=&#8221;true&#8221; lang=&#8221;python&#8221; decode=&#8221;true&#8221;]import agentc.langchain<br \/>\nimport agentc<br \/>\nfrom langchain_core.tools import tool<\/p>\n<p>provider = agentc.Provider(<br \/>\n\u00a0\u00a0\u00a0\u00a0decorator=lambda t: tool(t.func),\u00a0<br \/>\n\u00a0\u00a0\u00a0\u00a0secrets={&#8220;CB_USERNAME&#8221;: CB_USERNAME,\u00a0<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;CB_PASSWORD&#8221;: CB_PASSWORD,\u00a0<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;CB_CONN_STRING&#8221;: CB_CONN_STRING})<\/p>\n<p># Get the retriever tool from Agent Catalog<br \/>\nretriever_tool = provider.get_item(name=&#8221;retriever_tool&#8221;, item_type=&#8221;tool&#8221;)<br \/>\ntools = retriever_tool[\/crayon]<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Defining the Agent State<\/h4>\n\n\n\n<p>We will define a graph of agents to help all involved agents communicate with each other better. Agents communicate through a `state` object that is passed around to each node and modified with output from that node.<\/p>\n\n\n\n<p>Our state will be a list of <em>messages<\/em> and each node in our graph will append to it:<\/p>\n\n\n<p>[crayon nums=&#8221;false&#8221; wrap=&#8221;true&#8221; lang=&#8221;python&#8221; decode=&#8221;true&#8221;]from typing import Annotated, Sequence, TypedDict<br \/>\nfrom langchain_core.messages import BaseMessage<br \/>\nfrom langgraph.graph.message import add_messages<\/p>\n<p>class AgentState(TypedDict):<br \/>\n\u00a0\u00a0\u00a0\u00a0# The add_messages function defines how an update should be processed<br \/>\n\u00a0\u00a0\u00a0\u00a0# Default is to replace. add_messages says &#8220;append&#8221;<br \/>\n\u00a0\u00a0\u00a0\u00a0messages: Annotated[Sequence[BaseMessage], add_messages][\/crayon]<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Creating Agent Nodes<\/h4>\n\n\n\n<p>We&#8217;ll define the core components of our agent pipeline:<\/p>\n\n\n\n<p>Nodes: Relevance Checking Function, Query Rewriter, Main Agent, Response Generation<\/p>\n\n\n<p>[crayon nums=&#8221;false&#8221; wrap=&#8221;true&#8221; lang=&#8221;python&#8221; decode=&#8221;true&#8221;]from typing import Annotated, Literal, Sequence, TypedDict<br \/>\nfrom langchain import hub<br \/>\nfrom langchain_core.messages import BaseMessage, HumanMessage<br \/>\nfrom langchain_core.output_parsers import StrOutputParser<br \/>\nfrom langchain_core.prompts import PromptTemplate<br \/>\nfrom langchain_core.pydantic_v1 import BaseModel, Field<br \/>\nfrom langchain_openai import ChatOpenAI<br \/>\nfrom langgraph.prebuilt import tools_condition<\/p>\n<p>### Relevance Checking Function<br \/>\ndef grade_documents(state) -&gt; Literal[&#8220;generate&#8221;, &#8220;rewrite&#8221;]:<br \/>\n\u00a0\u00a0\u00a0\u00a0&#8220;&#8221;&#8221;<br \/>\n\u00a0\u00a0\u00a0\u00a0Determines whether the retrieved documents are relevant to the question.<br \/>\n\u00a0\u00a0\u00a0\u00a0&#8220;&#8221;&#8221;<br \/>\n\u00a0\u00a0\u00a0\u00a0print(&#8220;&#8212;CHECK RELEVANCE&#8212;&#8220;)<br \/>\n\u00a0\u00a0\u00a0\u00a0# Data model<br \/>\n\u00a0\u00a0\u00a0\u00a0class grade(BaseModel):<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;&#8221;&#8221;Binary score for relevance check.&#8221;&#8221;&#8221;<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0binary_score: str = Field(description=&#8221;Relevance score &#8216;yes&#8217; or &#8216;no'&#8221;)<br \/>\n\u00a0\u00a0\u00a0\u00a0# LLM<br \/>\n\u00a0\u00a0\u00a0\u00a0model = ChatOpenAI(temperature=0, model=&#8221;gpt-4o&#8221;, streaming=True)<br \/>\n\u00a0\u00a0\u00a0\u00a0llm_with_tool = model.with_structured_output(grade)<br \/>\n\u00a0\u00a0\u00a0\u00a0#fetch a prompt from Agent Catalog<br \/>\n\u00a0\u00a0\u00a0\u00a0grade_documents_prompt = PromptTemplate(<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0template=provider.get_item(name=&#8221;grade_documents&#8221;, item_type=&#8221;prompt&#8221;).prompt.render(),<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0input_variables=[&#8220;context&#8221;, &#8220;question&#8221;],<br \/>\n\u00a0\u00a0\u00a0\u00a0)<br \/>\n\u00a0\u00a0\u00a0\u00a0# Chain<br \/>\n\u00a0\u00a0\u00a0\u00a0chain = grade_documents_prompt | llm_with_tool<br \/>\n\u00a0\u00a0\u00a0\u00a0messages = state[&#8220;messages&#8221;]<br \/>\n\u00a0\u00a0\u00a0\u00a0last_message = messages[-1]<br \/>\n\u00a0\u00a0\u00a0\u00a0question = messages[0].content<br \/>\n\u00a0\u00a0\u00a0\u00a0docs = last_message.content<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0scored_result = chain.invoke({&#8220;question&#8221;: question, &#8220;context&#8221;: docs})<br \/>\n\u00a0\u00a0\u00a0\u00a0score = scored_result.binary_score<br \/>\n\u00a0\u00a0\u00a0\u00a0if score == &#8220;yes&#8221;:<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(&#8220;&#8212;DECISION: DOCS RELEVANT&#8212;&#8220;)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return &#8220;generate&#8221;<br \/>\n\u00a0\u00a0\u00a0\u00a0else:<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(&#8220;&#8212;DECISION: DOCS NOT RELEVANT&#8212;&#8220;)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(score)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return &#8220;rewrite&#8221;<br \/>\n### Main Agent Node<br \/>\ndef agent(state):<br \/>\n\u00a0\u00a0\u00a0\u00a0&#8220;&#8221;&#8221;<br \/>\n\u00a0\u00a0\u00a0\u00a0Invokes the agent model to generate a response or use tools.<br \/>\n\u00a0\u00a0\u00a0\u00a0&#8220;&#8221;&#8221;<br \/>\n\u00a0\u00a0\u00a0\u00a0print(&#8220;&#8212;CALL AGENT&#8212;&#8220;)<br \/>\n\u00a0\u00a0\u00a0\u00a0messages = state[&#8220;messages&#8221;]<br \/>\n\u00a0\u00a0\u00a0\u00a0model = ChatOpenAI(temperature=0, streaming=True, model=&#8221;gpt-4-turbo&#8221;)<br \/>\n\u00a0\u00a0\u00a0\u00a0model = model.bind_tools(tools)<br \/>\n\u00a0\u00a0\u00a0\u00a0response = model.invoke(messages)<br \/>\n\u00a0\u00a0\u00a0\u00a0return {&#8220;messages&#8221;: [response]}<br \/>\n### Query Rewriting Node<br \/>\ndef rewrite(state):<br \/>\n\u00a0\u00a0\u00a0\u00a0&#8220;&#8221;&#8221;<br \/>\n\u00a0\u00a0\u00a0\u00a0Transform the query to produce a better question.<br \/>\n\u00a0\u00a0\u00a0\u00a0&#8220;&#8221;&#8221;<br \/>\n\u00a0\u00a0\u00a0\u00a0print(&#8220;&#8212;TRANSFORM QUERY&#8212;&#8220;)<br \/>\n\u00a0\u00a0\u00a0\u00a0messages = state[&#8220;messages&#8221;]<br \/>\n\u00a0\u00a0\u00a0\u00a0question = messages[0].content<br \/>\n\u00a0\u00a0\u00a0\u00a0msg = [<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0HumanMessage(<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0content=f&#8221;&#8221;&#8221; n\u00a0<br \/>\n\u00a0\u00a0\u00a0\u00a0Look at the input and try to reason about the underlying semantic intent \/ meaning. n\u00a0<br \/>\n\u00a0\u00a0\u00a0\u00a0Here is the initial question:<br \/>\n\u00a0\u00a0\u00a0\u00a0n &#8212;&#8212;- n<br \/>\n\u00a0\u00a0\u00a0\u00a0{question}\u00a0<br \/>\n\u00a0\u00a0\u00a0\u00a0n &#8212;&#8212;- n<br \/>\n\u00a0\u00a0\u00a0\u00a0Formulate an improved question: &#8220;&#8221;&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0)<br \/>\n\u00a0\u00a0\u00a0\u00a0]<br \/>\n\u00a0\u00a0\u00a0\u00a0model = ChatOpenAI(temperature=0, model=&#8221;gpt-4-0125-preview&#8221;, streaming=True)<br \/>\n\u00a0\u00a0\u00a0\u00a0response = model.invoke(msg)<br \/>\n\u00a0\u00a0\u00a0\u00a0return {&#8220;messages&#8221;: [response]}<\/p>\n<p>### Response Generation Node<br \/>\ndef generate(state):<br \/>\n\u00a0\u00a0\u00a0\u00a0&#8220;&#8221;&#8221;<br \/>\n\u00a0\u00a0\u00a0\u00a0Generate answer using retrieved documents<br \/>\n\u00a0\u00a0\u00a0\u00a0&#8220;&#8221;&#8221;<br \/>\n\u00a0\u00a0\u00a0\u00a0print(&#8220;&#8212;GENERATE&#8212;&#8220;)<br \/>\n\u00a0\u00a0\u00a0\u00a0messages = state[&#8220;messages&#8221;]<br \/>\n\u00a0\u00a0\u00a0\u00a0question = messages[0].content<br \/>\n\u00a0\u00a0\u00a0\u00a0last_message = messages[-1]<br \/>\n\u00a0\u00a0\u00a0\u00a0docs = last_message.content<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0# Prompt<br \/>\n\u00a0\u00a0\u00a0\u00a0prompt = hub.pull(&#8220;rlm\/rag-prompt&#8221;)<br \/>\n\u00a0\u00a0\u00a0\u00a0llm = ChatOpenAI(model_name=&#8221;gpt-4o-mini&#8221;, temperature=0, streaming=True)<br \/>\n\u00a0\u00a0\u00a0\u00a0rag_chain = prompt | llm | StrOutputParser()<\/p>\n<p>\u00a0\u00a0\u00a0\u00a0# Run<br \/>\n\u00a0\u00a0\u00a0\u00a0response = rag_chain.invoke({&#8220;context&#8221;: docs, &#8220;question&#8221;: question})<br \/>\n\u00a0\u00a0\u00a0\u00a0return {&#8220;messages&#8221;: [response]}[\/crayon]<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Building the Agent Graph<\/h4>\n\n\n\n<p>Now we&#8217;ll connect the nodes into a coherent workflow:<\/p>\n\n\n<p>[crayon nums=&#8221;false&#8221; wrap=&#8221;true&#8221; lang=&#8221;default&#8221; decode=&#8221;true&#8221;]from langgraph.graph import END, StateGraph, START<br \/>\nfrom langgraph.prebuilt import ToolNode<\/p>\n<p># Define a new graph<br \/>\nworkflow = StateGraph(AgentState)<\/p>\n<p># Define the nodes<br \/>\nworkflow.add_node(&#8220;agent&#8221;, agent)<br \/>\nretrieve = ToolNode(retriever_tool)<br \/>\nworkflow.add_node(&#8220;retrieve&#8221;, retrieve)<br \/>\nworkflow.add_node(&#8220;rewrite&#8221;, rewrite)<br \/>\nworkflow.add_node(&#8220;generate&#8221;, generate)<\/p>\n<p># Define edges<br \/>\nworkflow.add_edge(START, &#8220;agent&#8221;)<\/p>\n<p># Conditional edges based on agent&#8217;s decision<br \/>\nworkflow.add_conditional_edges(<br \/>\n\u00a0\u00a0\u00a0\u00a0&#8220;agent&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0tools_condition,<br \/>\n\u00a0\u00a0\u00a0\u00a0{<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;tools&#8221;: &#8220;retrieve&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0END: END,<br \/>\n\u00a0\u00a0\u00a0\u00a0},<br \/>\n)<\/p>\n<p># Conditional edges after retrieval based on document relevance<br \/>\nworkflow.add_conditional_edges(<br \/>\n\u00a0\u00a0\u00a0\u00a0&#8220;retrieve&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0grade_documents,<br \/>\n)<br \/>\nworkflow.add_edge(&#8220;generate&#8221;, END)<br \/>\nworkflow.add_edge(&#8220;rewrite&#8221;, &#8220;agent&#8221;)<\/p>\n<p># Compile the graph<br \/>\ngraph = workflow.compile()[\/crayon]<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Visualizing the Agent Graph<\/h4>\n\n\n\n<p>Let&#8217;s visualize our workflow to better understand it:<\/p>\n\n\n<p>[crayon nums=&#8221;false&#8221; wrap=&#8221;true&#8221; lang=&#8221;python&#8221; decode=&#8221;true&#8221;]from IPython.display import Image, display<\/p>\n<p>try:<br \/>\n\u00a0\u00a0\u00a0\u00a0display(Image(graph.get_graph(xray=True).draw_mermaid_png()))<br \/>\nexcept Exception:<br \/>\n\u00a0\u00a0\u00a0\u00a0# This requires some extra dependencies and is optional<br \/>\n\u00a0\u00a0\u00a0\u00a0pass[\/crayon]<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">2) Trace the agent\u2019s function calls using Arize, capturing retrieval queries, LLM responses, and tool usage<\/h3>\n\n\n\n<p>Arize provides comprehensive observability for our agent system. Let&#8217;s set up tracing:<\/p>\n\n\n<p>[crayon nums=&#8221;false&#8221; wrap=&#8221;true&#8221; lang=&#8221;python&#8221; decode=&#8221;true&#8221;]from arize.otel import register<br \/>\n# Setup tracer provider<br \/>\ntracer_provider = register(<br \/>\n\u00a0\u00a0\u00a0\u00a0space_id = SPACE_ID,<br \/>\n\u00a0\u00a0\u00a0\u00a0api_key = API_KEY,<br \/>\n\u00a0\u00a0\u00a0\u00a0project_name = &#8220;langgraph-agentic-rag&#8221;,<br \/>\n)<br \/>\n# Import the automatic instrumentor from OpenInference<br \/>\nfrom openinference.instrumentation.langchain import LangChainInstrumentor<br \/>\n# Instrument LangChain<br \/>\nLangChainInstrumentor().instrument(tracer_provider=tracer_provider)[\/crayon]<\/p>\n\n\n\n<p>Now let&#8217;s run the agent to see how it works:<\/p>\n\n\n<p>[crayon nums=&#8221;false&#8221; wrap=&#8221;true&#8221; lang=&#8221;python&#8221; decode=&#8221;true&#8221;]import pprint<br \/>\ninputs = {<br \/>\n\u00a0\u00a0\u00a0\u00a0&#8220;messages&#8221;: [<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(&#8220;user&#8221;, &#8220;What does Lilian Weng say about the types of adversarial attacks on LLMs?&#8221;),<br \/>\n\u00a0\u00a0\u00a0\u00a0]<br \/>\n}<br \/>\nfor output in graph.stream(inputs):<br \/>\n\u00a0\u00a0\u00a0\u00a0for key, value in output.items():<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pprint.pprint(f&#8221;Output from node &#8216;{key}&#8217;:&#8221;)<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pprint.pprint(value, indent=2, width=80, depth=None)[\/crayon]<\/p>\n\n\n\n<p>This will execute our agent graph and output detailed information for each node as it processes the query. In Arize, you&#8217;ll be able to see a trace visualization showing the execution flow, latency, and details of each function call.<\/p>\n\n\n\n<figure id=\"attachment_17064\" aria-describedby=\"caption-attachment-17064\" style=\"width: 900px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-17064 size-large\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image3-1-1024x614-1.png\" alt=\"Tracing visualization from Arize platform\" width=\"900\" height=\"540\"><figcaption id=\"caption-attachment-17064\" class=\"wp-caption-text\">Tracing Visualization from Arize Platform<\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3) Benchmark performance by generating a dataset with queries and expected responses<\/h3>\n\n\n\n<p>To systematically evaluate our system, we need a benchmark dataset:<\/p>\n\n\n\n<p><p>[crayon nums=&#8221;false&#8221; wrap=&#8221;true&#8221; lang=&#8221;python&#8221; decode=&#8221;true&#8221;]from datetime import timedelta<br \/>\nfrom couchbase.auth import PasswordAuthenticator<br \/>\nfrom couchbase.cluster import Cluster<br \/>\nfrom couchbase.options import ClusterOptions<br \/>\nfrom langchain_couchbase.vectorstores import CouchbaseSearchVectorStore<br \/>\nfrom langchain_huggingface import HuggingFaceEmbeddings<\/p>\n<p># Cluster settings<br \/>\nCB_CONN_STRING = &#8220;your-connection-string&#8221;<br \/>\nCB_USERNAME = &#8220;your-username&#8221;<br \/>\nCB_PASSWORD = &#8220;your-password&#8221;<br \/>\nBUCKET_NAME = &#8220;your-bucket-name&#8221;<br \/>\nSCOPE_NAME = &#8220;your-scope-name&#8221;<br \/>\nCOLLECTION_NAME = &#8220;your-collection-name&#8221;<br \/>\nSEARCH_INDEX_NAME = &#8220;your-search-index-name&#8221;<\/p>\n<p># Connect to couchbase cluster<br \/>\nauth = PasswordAuthenticator(CB_USERNAME, CB_PASSWORD)<br \/>\noptions = ClusterOptions(auth)<br \/>\noptions.apply_profile(&#8220;wan_development&#8221;)<br \/>\ncluster = Cluster(CB_CONN_STRING, options)<br \/>\ncluster.wait_until_ready(timedelta(seconds=5))<\/p>\n<p># Initialize vector store<br \/>\nembeddings = HuggingFaceEmbeddings(model_name=&#8221;sentence-transformers\/all-MiniLM-L12-v2&#8243;)<br \/>\nvector_store = CouchbaseVectorStore(<br \/>\n\u00a0\u00a0\u00a0\u00a0cluster=cluster,<br \/>\n\u00a0\u00a0\u00a0\u00a0bucket_name=BUCKET_NAME,<br \/>\n\u00a0\u00a0\u00a0\u00a0scope_name=SCOPE_NAME,<br \/>\n\u00a0\u00a0\u00a0\u00a0collection_name=COLLECTION_NAME,<br \/>\n\u00a0\u00a0\u00a0\u00a0embedding=embeddings,<br \/>\n\u00a0\u00a0\u00a0\u00a0index_name=SEARCH_INDEX_NAME,<br \/>\n)[\/crayon]<\/p>\n0<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4) Evaluate Performance Using LLM as a Judge<\/h3>\n\n\n\n<p>We&#8217;ll use LLM-based evaluation to assess the quality of our agent&#8217;s responses:<\/p>\n\n\n\n<p><p>[crayon nums=&#8221;false&#8221; wrap=&#8221;true&#8221; lang=&#8221;python&#8221; decode=&#8221;true&#8221;]from datetime import timedelta<br \/>\nfrom couchbase.auth import PasswordAuthenticator<br \/>\nfrom couchbase.cluster import Cluster<br \/>\nfrom couchbase.options import ClusterOptions<br \/>\nfrom langchain_couchbase.vectorstores import CouchbaseSearchVectorStore<br \/>\nfrom langchain_huggingface import HuggingFaceEmbeddings<\/p>\n<p># Cluster settings<br \/>\nCB_CONN_STRING = &#8220;your-connection-string&#8221;<br \/>\nCB_USERNAME = &#8220;your-username&#8221;<br \/>\nCB_PASSWORD = &#8220;your-password&#8221;<br \/>\nBUCKET_NAME = &#8220;your-bucket-name&#8221;<br \/>\nSCOPE_NAME = &#8220;your-scope-name&#8221;<br \/>\nCOLLECTION_NAME = &#8220;your-collection-name&#8221;<br \/>\nSEARCH_INDEX_NAME = &#8220;your-search-index-name&#8221;<\/p>\n<p># Connect to couchbase cluster<br \/>\nauth = PasswordAuthenticator(CB_USERNAME, CB_PASSWORD)<br \/>\noptions = ClusterOptions(auth)<br \/>\noptions.apply_profile(&#8220;wan_development&#8221;)<br \/>\ncluster = Cluster(CB_CONN_STRING, options)<br \/>\ncluster.wait_until_ready(timedelta(seconds=5))<\/p>\n<p># Initialize vector store<br \/>\nembeddings = HuggingFaceEmbeddings(model_name=&#8221;sentence-transformers\/all-MiniLM-L12-v2&#8243;)<br \/>\nvector_store = CouchbaseVectorStore(<br \/>\n\u00a0\u00a0\u00a0\u00a0cluster=cluster,<br \/>\n\u00a0\u00a0\u00a0\u00a0bucket_name=BUCKET_NAME,<br \/>\n\u00a0\u00a0\u00a0\u00a0scope_name=SCOPE_NAME,<br \/>\n\u00a0\u00a0\u00a0\u00a0collection_name=COLLECTION_NAME,<br \/>\n\u00a0\u00a0\u00a0\u00a0embedding=embeddings,<br \/>\n\u00a0\u00a0\u00a0\u00a0index_name=SEARCH_INDEX_NAME,<br \/>\n)[\/crayon]<\/p>\n1<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">5) Experiment with Retrieval Settings<\/h3>\n\n\n\n<p>Now let&#8217;s experiment with different configurations to optimize our system:<\/p>\n\n\n\n<p><p>[crayon nums=&#8221;false&#8221; wrap=&#8221;true&#8221; lang=&#8221;python&#8221; decode=&#8221;true&#8221;]from datetime import timedelta<br \/>\nfrom couchbase.auth import PasswordAuthenticator<br \/>\nfrom couchbase.cluster import Cluster<br \/>\nfrom couchbase.options import ClusterOptions<br \/>\nfrom langchain_couchbase.vectorstores import CouchbaseSearchVectorStore<br \/>\nfrom langchain_huggingface import HuggingFaceEmbeddings<\/p>\n<p># Cluster settings<br \/>\nCB_CONN_STRING = &#8220;your-connection-string&#8221;<br \/>\nCB_USERNAME = &#8220;your-username&#8221;<br \/>\nCB_PASSWORD = &#8220;your-password&#8221;<br \/>\nBUCKET_NAME = &#8220;your-bucket-name&#8221;<br \/>\nSCOPE_NAME = &#8220;your-scope-name&#8221;<br \/>\nCOLLECTION_NAME = &#8220;your-collection-name&#8221;<br \/>\nSEARCH_INDEX_NAME = &#8220;your-search-index-name&#8221;<\/p>\n<p># Connect to couchbase cluster<br \/>\nauth = PasswordAuthenticator(CB_USERNAME, CB_PASSWORD)<br \/>\noptions = ClusterOptions(auth)<br \/>\noptions.apply_profile(&#8220;wan_development&#8221;)<br \/>\ncluster = Cluster(CB_CONN_STRING, options)<br \/>\ncluster.wait_until_ready(timedelta(seconds=5))<\/p>\n<p># Initialize vector store<br \/>\nembeddings = HuggingFaceEmbeddings(model_name=&#8221;sentence-transformers\/all-MiniLM-L12-v2&#8243;)<br \/>\nvector_store = CouchbaseVectorStore(<br \/>\n\u00a0\u00a0\u00a0\u00a0cluster=cluster,<br \/>\n\u00a0\u00a0\u00a0\u00a0bucket_name=BUCKET_NAME,<br \/>\n\u00a0\u00a0\u00a0\u00a0scope_name=SCOPE_NAME,<br \/>\n\u00a0\u00a0\u00a0\u00a0collection_name=COLLECTION_NAME,<br \/>\n\u00a0\u00a0\u00a0\u00a0embedding=embeddings,<br \/>\n\u00a0\u00a0\u00a0\u00a0index_name=SEARCH_INDEX_NAME,<br \/>\n)[\/crayon]<\/p>\n2<\/p>\n\n\n\n<p>Now we&#8217;ll run experiments with different configurations:<\/p>\n\n\n\n<p><p>[crayon nums=&#8221;false&#8221; wrap=&#8221;true&#8221; lang=&#8221;python&#8221; decode=&#8221;true&#8221;]from datetime import timedelta<br \/>\nfrom couchbase.auth import PasswordAuthenticator<br \/>\nfrom couchbase.cluster import Cluster<br \/>\nfrom couchbase.options import ClusterOptions<br \/>\nfrom langchain_couchbase.vectorstores import CouchbaseSearchVectorStore<br \/>\nfrom langchain_huggingface import HuggingFaceEmbeddings<\/p>\n<p># Cluster settings<br \/>\nCB_CONN_STRING = &#8220;your-connection-string&#8221;<br \/>\nCB_USERNAME = &#8220;your-username&#8221;<br \/>\nCB_PASSWORD = &#8220;your-password&#8221;<br \/>\nBUCKET_NAME = &#8220;your-bucket-name&#8221;<br \/>\nSCOPE_NAME = &#8220;your-scope-name&#8221;<br \/>\nCOLLECTION_NAME = &#8220;your-collection-name&#8221;<br \/>\nSEARCH_INDEX_NAME = &#8220;your-search-index-name&#8221;<\/p>\n<p># Connect to couchbase cluster<br \/>\nauth = PasswordAuthenticator(CB_USERNAME, CB_PASSWORD)<br \/>\noptions = ClusterOptions(auth)<br \/>\noptions.apply_profile(&#8220;wan_development&#8221;)<br \/>\ncluster = Cluster(CB_CONN_STRING, options)<br \/>\ncluster.wait_until_ready(timedelta(seconds=5))<\/p>\n<p># Initialize vector store<br \/>\nembeddings = HuggingFaceEmbeddings(model_name=&#8221;sentence-transformers\/all-MiniLM-L12-v2&#8243;)<br \/>\nvector_store = CouchbaseVectorStore(<br \/>\n\u00a0\u00a0\u00a0\u00a0cluster=cluster,<br \/>\n\u00a0\u00a0\u00a0\u00a0bucket_name=BUCKET_NAME,<br \/>\n\u00a0\u00a0\u00a0\u00a0scope_name=SCOPE_NAME,<br \/>\n\u00a0\u00a0\u00a0\u00a0collection_name=COLLECTION_NAME,<br \/>\n\u00a0\u00a0\u00a0\u00a0embedding=embeddings,<br \/>\n\u00a0\u00a0\u00a0\u00a0index_name=SEARCH_INDEX_NAME,<br \/>\n)[\/crayon]<\/p>\n3<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">6) Compare Experiments in Arize<\/h3>\n\n\n\n<p>After running all the experiments, you can now view and compare them in the Arize UI. The experiments should be visible in your Arize workspace under the dataset name we created earlier.<\/p>\n\n\n\n<figure id=\"attachment_17065\" aria-describedby=\"caption-attachment-17065\" style=\"width: 900px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-17065 size-large\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image2-1-1024x657-1.png\" alt=\"\" width=\"900\" height=\"577\"><figcaption id=\"caption-attachment-17065\" class=\"wp-caption-text\">Experiments comparison view from Arize Platform<\/figcaption><\/figure>\n\n\n\n<p>In Arize, you can:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Compare the overall performance metrics between different configurations<\/li>\n\n\n<li>Analyze per-question performance to identify patterns<\/li>\n\n\n<li>Examine trace details to understand execution flow<\/li>\n\n\n<li>View relevance and correctness scores for each experiment<\/li>\n\n\n<li>See explanations for evaluation decisions<\/li>\n\n\n<li>Evaluate outputs using an LLM as a judge to score response relevance and correctness.<\/li>\n\n\n<li>Optimize retrieval settings by experimenting with chunk sizes, overlap configurations, and document retrieval limits.<\/li>\n\n\n<li>Compare and analyze experiments in Arize to determine the best-performing configurations.<\/li>\n\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Innovate with Couchbase and Arize AI<\/h3>\n\n\n\n<p>The integration of Couchbase and Arize empowers enterprises to build robust, production-ready GenAI applications with strong observability and optimization capabilities. By leveraging Agentic RAG with monitored retrieval decisions, organizations can improve accuracy, reduce hallucinations, and ensure optimal performance over time.<\/p>\n\n\n\n<p>As enterprises continue to push the boundaries of GenAI, combining high-performance vector storage with AI observability will be key to deploying reliable and scalable applications. With Couchbase and Arize, organizations have the tools to confidently navigate the challenges of enterprise GenAI deployment.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Additional Resources<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Get started with <a href=\"https:\/\/cloud.couchbase.com\/\" target=\"_blank\" rel=\"noopener\">Couchbase Capella developer platform<\/a> for free<\/li>\n\n\n<li>Reach out to Arize AI for a demo <a href=\"https:\/\/arize.com\/request-a-demo\/\" target=\"_blank\" rel=\"noopener\">here<\/a><\/li>\n\n\n<li>Read more posts and tutorials on <a href=\"https:\/\/www.couchbase.com\/blog\/category\/generative-ai-genai\/\" target=\"_blank\" rel=\"noopener\">Generative AI (GenAI)<\/a><\/li>\n\n<\/ul>\n\n\n\n<p>\u00a0<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As enterprises look to deploy production-ready AI agent applications, Large Language Model (LLM) observability has emerged as a critical requirement for ensuring both performance and trust. Organizations need visibility into how agents interact with data, make decisions, and retrieve information to maintain reliability, security, and compliance. Without proper observability, enterprises risk deploying models that produce [&hellip;]<\/p>\n","protected":false},"author":85603,"featured_media":4663,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[920,598,136,199,178,727,516],"tags":[],"ppma_author":[972,973],"class_list":["post-4667","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-agentic-ai-apps","category-artificial-intelligence-ai","category-best-practices-and-tutorials","category-company","category-connectors","category-generative-ai-genai","category-partners"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.6 (Yoast SEO v27.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Couchbase Partners with Arize AI to Enable Trustworthy, Production-Ready AI Agent Applications<\/title>\n<meta name=\"description\" content=\"Couchbase partners with Arize AI to bring observability to production-ready AI agent apps. Learn to build, monitor, optimize Agentic RAG solutions at scale.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/ko\/couchbase-partners-arize-ai\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Couchbase Partners with Arize AI to Enable Trustworthy, Production-Ready AI Agent Applications\" \/>\n<meta property=\"og:description\" content=\"Couchbase partners with Arize AI to bring observability to production-ready AI agent apps. Learn to build, monitor, optimize Agentic RAG solutions at scale.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/ko\/couchbase-partners-arize-ai\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-04-23T11:50:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/blog_header_images_2025-18.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1256\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Tanvi Johari, Software Engineer, Couchbase, Richard Young - Dir. Partner Solutions Architecture, Arize AI\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tanvi Johari, Software Engineer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-partners-arize-ai\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-partners-arize-ai\\\/\"},\"author\":{\"name\":\"Tanvi Johari, Software Engineer, Couchbase\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/3a20d383d1a780043084fad5d395f231\"},\"headline\":\"Couchbase Partners with Arize AI to Enable Trustworthy, Production-Ready AI Agent Applications\",\"datePublished\":\"2025-04-23T11:50:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-partners-arize-ai\\\/\"},\"wordCount\":3058,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-partners-arize-ai\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/blog_header_images_2025-18.png\",\"articleSection\":[\"Agentic AI Applications\",\"Artificial Intelligence (AI)\",\"Best Practices and Tutorials\",\"Company\",\"Connectors\",\"Generative AI (GenAI)\",\"Partners\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-partners-arize-ai\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-partners-arize-ai\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-partners-arize-ai\\\/\",\"name\":\"Couchbase Partners with Arize AI to Enable Trustworthy, Production-Ready AI Agent Applications\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-partners-arize-ai\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-partners-arize-ai\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/blog_header_images_2025-18.png\",\"datePublished\":\"2025-04-23T11:50:54+00:00\",\"description\":\"Couchbase partners with Arize AI to bring observability to production-ready AI agent apps. Learn to build, monitor, optimize Agentic RAG solutions at scale.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-partners-arize-ai\\\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-partners-arize-ai\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-partners-arize-ai\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/blog_header_images_2025-18.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/blog_header_images_2025-18.png\",\"width\":2400,\"height\":1256},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/couchbase-partners-arize-ai\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Couchbase Partners with Arize AI to Enable Trustworthy, Production-Ready AI Agent Applications\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/06\\\/logo.svg\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/06\\\/logo.svg\",\"width\":\"1024\",\"height\":\"1024\",\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/3a20d383d1a780043084fad5d395f231\",\"name\":\"Tanvi Johari, Software Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d9fe9ee1ff97a593e41ca532a03f804f67f81d51cbef86376a1ed4579a74d486?s=96&d=mm&r=gcbe1e04ab75b45b3456b58fe93f6a961\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d9fe9ee1ff97a593e41ca532a03f804f67f81d51cbef86376a1ed4579a74d486?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d9fe9ee1ff97a593e41ca532a03f804f67f81d51cbef86376a1ed4579a74d486?s=96&d=mm&r=g\",\"caption\":\"Tanvi Johari, Software Engineer, Couchbase\"},\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/ko\\\/author\\\/tanvijohari\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Couchbase Partners with Arize AI to Enable Trustworthy, Production-Ready AI Agent Applications","description":"Couchbase partners with Arize AI to bring observability to production-ready AI agent apps. Learn to build, monitor, optimize Agentic RAG solutions at scale.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/ko\/couchbase-partners-arize-ai\/","og_locale":"ko_KR","og_type":"article","og_title":"Couchbase Partners with Arize AI to Enable Trustworthy, Production-Ready AI Agent Applications","og_description":"Couchbase partners with Arize AI to bring observability to production-ready AI agent apps. Learn to build, monitor, optimize Agentic RAG solutions at scale.","og_url":"https:\/\/www.couchbase.com\/blog\/ko\/couchbase-partners-arize-ai\/","og_site_name":"The Couchbase Blog","article_published_time":"2025-04-23T11:50:54+00:00","og_image":[{"width":2400,"height":1256,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/blog_header_images_2025-18.png","type":"image\/png"}],"author":"Tanvi Johari, Software Engineer, Couchbase, Richard Young - Dir. Partner Solutions Architecture, Arize AI","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Tanvi Johari, Software Engineer, Couchbase","Est. reading time":"7\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-partners-arize-ai\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-partners-arize-ai\/"},"author":{"name":"Tanvi Johari, Software Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3a20d383d1a780043084fad5d395f231"},"headline":"Couchbase Partners with Arize AI to Enable Trustworthy, Production-Ready AI Agent Applications","datePublished":"2025-04-23T11:50:54+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-partners-arize-ai\/"},"wordCount":3058,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-partners-arize-ai\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/blog_header_images_2025-18.png","articleSection":["Agentic AI Applications","Artificial Intelligence (AI)","Best Practices and Tutorials","Company","Connectors","Generative AI (GenAI)","Partners"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbase-partners-arize-ai\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-partners-arize-ai\/","url":"https:\/\/www.couchbase.com\/blog\/couchbase-partners-arize-ai\/","name":"Couchbase Partners with Arize AI to Enable Trustworthy, Production-Ready AI Agent Applications","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-partners-arize-ai\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-partners-arize-ai\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/blog_header_images_2025-18.png","datePublished":"2025-04-23T11:50:54+00:00","description":"Couchbase partners with Arize AI to bring observability to production-ready AI agent apps. Learn to build, monitor, optimize Agentic RAG solutions at scale.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-partners-arize-ai\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-partners-arize-ai\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-partners-arize-ai\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/blog_header_images_2025-18.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/blog_header_images_2025-18.png","width":2400,"height":1256},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-partners-arize-ai\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Couchbase Partners with Arize AI to Enable Trustworthy, Production-Ready AI Agent Applications"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"The Couchbase Blog","description":"Couchbase, the NoSQL Database","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/06\/logo.svg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/06\/logo.svg","width":"1024","height":"1024","caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3a20d383d1a780043084fad5d395f231","name":"Tanvi Johari, Software Engineer, Couchbase","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/secure.gravatar.com\/avatar\/d9fe9ee1ff97a593e41ca532a03f804f67f81d51cbef86376a1ed4579a74d486?s=96&d=mm&r=gcbe1e04ab75b45b3456b58fe93f6a961","url":"https:\/\/secure.gravatar.com\/avatar\/d9fe9ee1ff97a593e41ca532a03f804f67f81d51cbef86376a1ed4579a74d486?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d9fe9ee1ff97a593e41ca532a03f804f67f81d51cbef86376a1ed4579a74d486?s=96&d=mm&r=g","caption":"Tanvi Johari, Software Engineer, Couchbase"},"url":"https:\/\/www.couchbase.com\/blog\/ko\/author\/tanvijohari\/"}]}},"acf":[],"authors":[{"term_id":972,"user_id":85603,"is_guest":0,"slug":"tanvijohari","display_name":"Tanvi Johari, Software Engineer, Couchbase","avatar_url":{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/1736197907696-1.jpeg","url2x":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/1736197907696-1.jpeg"},"0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""},{"term_id":973,"user_id":85604,"is_guest":0,"slug":"richardyoung","display_name":"Richard Young - Dir. Partner Solutions Architecture, Arize AI","avatar_url":{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/1570866773537-1.jpeg","url2x":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/1570866773537-1.jpeg"},"0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/4667","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/users\/85603"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=4667"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/4667\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/4663"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=4667"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=4667"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=4667"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=4667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}