本指南快速概览如何开始使用 Tableau.
概述
Tableau 的 VizQL 数据服务(又称 VDS)为开发者提供对 Tableau 已发布数据源的编程访问,使他们能够扩展其业务语义以满足任何自定义工作负载或应用程序的需求(包括 AI 代理)。简单的_数据源_问答工具将 VDS 添加到 LangChain 框架。本笔记本向您展示如何使用它来构建能够基于企业语义模型回答分析问题的代理。
请关注 tableau-langchain 项目,更多工具即将推出!
设置
确保您正在运行并有权访问:
- Python 版本 3.12.2 或更高
- 至少包含 1 个已发布数据源的 Tableau Cloud 或 Server 环境
Get started by installing and/or importing the required packages
# pip install langchain-openai
# pip install langgraph
# pip install langchain-tableau --upgrade
Requirement already satisfied: regex>=2022.1.18 in /Users/joe.constantino/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from tiktoken<1,>=0.7->langchain-openai->langchain-tableau) (2024.11.6)
Requirement already satisfied: httpcore==1.* in /Users/joe.constantino/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from httpx>=0.25.2->langgraph-sdk<0.2.0,>=0.1.42->langgraph->langchain-tableau) (1.0.7)
Requirement already satisfied: h11<0.15,>=0.13 in /Users/joe.constantino/.pyenv/versions/3.12.2/lib/python3.12/site-packages (from httpcore==1.*->httpx>=0.25.2->langgraph-sdk<0.2.0,>=0.1.42->langgraph->langchain-tableau) (0.14.0)
注意,您可能需要重启内核才能使用更新的包
凭证
您可以像本文档中的一些案例一样显式声明环境变量。但是,如果未提供这些参数,简单的_数据源_问答工具将尝试自动从环境变量中读取它们。
对于您选择查询的数据源,请确保已更新 Tableau 中的 VizqlDataApiAccess 权限,以允许 VDS API 通过 REST 访问该数据源。欲了解更多 Tableau 权限和功能.
# langchain package imports
from langchain_openai import ChatOpenAI
# langchain_tableau and langgraph imports
from langchain_tableau.tools.simple_datasource_qa import initialize_simple_datasource_qa
from langchain.agents import create_agent
身份验证变量
您可以像这本手册中的几个案例一样显式声明环境变量。但是,如果未提供这些参数,简单的_数据源_问答工具将尝试自动从环境变量中读取它们。
For the Data Source that you choose, make sure you've updated the VizqlDataApiAccess permission in Tableau to allow the VDS API to access that Data Source via REST. For more information, see Tableau permissions and capabilities.
from dotenv import load_dotenv
load_dotenv()
tableau_server = "https://stage-dataplane2.tableau.sfdc-shbmgi.svc.sfdcfc.net/" # replace with your Tableau server name
tableau_site = "vizqldataservicestage02" # replace with your Tableau site
tableau_jwt_client_id = os.getenv(
"TABLEAU_JWT_CLIENT_ID"
) # a JWT client ID (obtained through Tableau's admin UI)
tableau_jwt_secret_id = os.getenv(
"TABLEAU_JWT_SECRET_ID"
) # a JWT secret ID (obtained through Tableau's admin UI)
tableau_jwt_secret = os.getenv(
"TABLEAU_JWT_SECRET"
) # a JWT secret ID (obtained through Tableau's admin UI)
tableau_api_version = "3.21" # the current Tableau REST API Version
tableau_user = "joe.constantino@salesforce.com" # enter the username querying the target Tableau Data Source
# For this cookbook we are connecting to the Superstore dataset that comes by default with every Tableau server
datasource_luid = (
"0965e61b-a072-43cf-994c-8c6cf526940d" # the target data source for this Tool
)
model_provider = "openai" # the name of the model provider you are using for your Agent
# Add variables to control LLM models for the Agent and Tools
os.environ["OPENAI_API_KEY"] # set an your model API key as an environment variable
tooling_llm_model = "gpt-5.4-mini"
实例化
初始化_simple_数据源_问答初始化名为 simple_数据源_qa的 LangGraph 工具,该工具可用于对 Tableau 数据源进行问答分析。
此初始化函数:
- 使用 Tableau 的连接应用框架通过 JWT 身份验证向 Tableau 进行身份验证。所有必需的变量必须在运行时或作为环境变量定义。
- 异步查询 datasource_luid 变量中指定的目标数据源的字段元数据。
- 基于目标数据源的元数据,将自然语言问题转换为 JSON 格式的查询负载,以发出 VDS 查询数据源请求。
- 向 VDS 执行 POST 请求。
- 将结果格式化为结构化响应并返回。
# Initialize simple_datasource_qa for querying Tableau Datasources through VDS
analyze_datasource = initialize_simple_datasource_qa(
domain=tableau_server,
site=tableau_site,
jwt_client_id=tableau_jwt_client_id,
jwt_secret_id=tableau_jwt_secret_id,
jwt_secret=tableau_jwt_secret,
tableau_api_version=tableau_api_version,
tableau_user=tableau_user,
datasource_luid=datasource_luid,
tooling_llm_model=tooling_llm_model,
model_provider=model_provider,
)
# load the List of Tools to be used by the Agent. In this case we will just load our data source Q&A tool.
tools = [analyze_datasource]
调用 - LangGraph 示例
首先,我们将初始化我们选择的LLM。然后,我们使用langgraph代理构造函数类定义一个代理,并使用一个与目标数据源相关的查询来调用它。
from IPython.display import Markdown, display
model = ChatOpenAI(model="gpt-5.5", temperature=0)
tableauAgent = create_agent(model, tools)
# Run the agent
messages = tableauAgent.invoke(
{
"messages": [
(
"human",
"what's going on with table sales?",
)
]
}
)
messages
# display(Markdown(messages['messages'][3].content)) #display a nicely formatted answer for successful generations