Vizro-AI与LangChain集成指南:实现智能可视化工具链
2025-07-10 04:37:57作者:咎岭娴Homer
引言
在当今数据驱动的决策环境中,将自然语言处理与数据可视化相结合已成为提升分析效率的关键。Vizro-AI作为McKinsey开源的可视化工具,通过与LangChain框架的集成,为用户提供了更智能、更灵活的数据可视化解决方案。本文将详细介绍如何将Vizro-AI的功能封装为LangChain工具,构建一个完整的可视化工具链。
环境准备
在开始集成前,我们需要确保环境配置正确。以下是基础环境设置代码:
from copy import deepcopy
from typing import Annotated, Any
import pandas as pd
import vizro.plotly.express as px
from langchain_core.runnables import chain
from langchain_core.tools import InjectedToolArg, tool
from langchain_openai import ChatOpenAI
from vizro_ai import VizroAI
# 初始化语言模型,推荐使用GPT-4以获得最佳效果
llm = ChatOpenAI(model="gpt-4")
工具定义与封装
核心设计理念
Vizro-AI与传统LangChain工具的主要区别在于它需要处理Pandas DataFrame作为输入。直接传递完整数据集不仅效率低下,也存在安全隐患。我们采用LangChain的运行时绑定特性来解决这一问题。
图表生成工具
@tool(parse_docstring=True)
def get_plot_code(df: Annotated[Any, InjectedToolArg], question: str) -> str:
"""生成可视化图表代码
参数:
df: Pandas DataFrame数据
question: 描述图表需求的自然语言
返回:
生成的Vizro图表代码
"""
vizro_ai = VizroAI(model=llm)
plot_elements = vizro_ai.plot(
df,
user_input=question,
return_elements=True,
)
return plot_elements.code_vizro
仪表盘生成工具
@tool(parse_docstring=True)
def get_dashboard_code(dfs: Annotated[Any, InjectedToolArg], question: str) -> str:
"""生成完整仪表盘代码
参数:
dfs: 多个Pandas DataFrame组成的列表
question: 描述仪表盘需求的自然语言
返回:
生成的Vizro仪表盘代码
"""
vizro_ai = VizroAI(model=llm)
dashboard_elements = vizro_ai.dashboard(
dfs,
user_input=question,
return_elements=True,
)
return dashboard_elements.code
工具链构建
数据注入机制
# 将工具绑定到语言模型
tools = [get_plot_code, get_dashboard_code]
llm_with_tools = llm.bind_tools(tools)
# 创建数据注入链
@chain
def inject_df(ai_msg):
tool_calls = []
for tool_call in ai_msg.tool_calls:
tool_call_copy = deepcopy(tool_call)
if tool_call_copy["name"] == "get_dashboard_code":
tool_call_copy["args"]["dfs"] = dfs
else:
tool_call_copy["args"]["df"] = df
tool_calls.append(tool_call_copy)
return tool_calls
工具路由与执行
# 创建工具映射
tool_map = {tool.name: tool for tool in tools}
@chain
def tool_router(tool_call):
return tool_map[tool_call["name"]]
# 组合完整工具链
chain = llm_with_tools | inject_df | tool_router.map()
实际应用示例
单图表生成
# 加载示例数据
df = px.data.gapminder()
# 生成各大洲人均GDP图表
plot_response = chain.invoke("Plot GDP per capita for each continent")
print(plot_response[0].content)
生成的代码示例:
import plotly.graph_objects as go
from vizro.models.types import capture
@capture("graph")
def custom_chart(data_frame):
continent_gdp = data_frame.groupby("continent")["gdpPercap"].mean().reset_index()
fig = go.Figure(data=[go.Bar(x=continent_gdp["continent"], y=continent_gdp["gdpPercap"])])
fig.update_layout(
title="GDP per Capita by Continent",
xaxis_title="Continent",
yaxis_title="GDP per Capita",
)
return fig
仪表盘生成
dfs = [px.data.gapminder()]
dashboard_response = chain.invoke(
"Create a dashboard. This dashboard has a chart showing the correlation between gdpPercap and lifeExp."
)
print(dashboard_response[0].content)
生成的仪表盘代码包含完整的页面布局、图表组件和样式配置。
最佳实践建议
- 数据预处理:在将数据传递给工具链前,确保数据已进行必要的清洗和转换
- 提示工程:精心设计自然语言提示可以获得更符合需求的输出
- 错误处理:为工具链添加适当的错误处理机制,特别是处理大型数据集时
- 性能优化:对于复杂可视化需求,考虑分步执行或增加约束条件
结语
通过将Vizro-AI与LangChain集成,我们构建了一个强大的可视化工具链,能够将自然语言指令转化为专业的数据可视化。这种集成不仅提高了数据分析的效率,也使可视化工具的易用性达到了新的水平。开发者可以根据实际需求扩展这一基础框架,添加更多定制化功能。