编者按:这篇文章是与 Cube 团队合作撰写的。语义层在确保构建基于文本到 SQL 的 LLM 应用的正确性和可预测性方面起着关键作用。他们与 LangChain 的集成使开始在 Cube 语义层之上构建 AI 应用程序变得非常容易。
多年以来,我们一直生活在数据驱动的世界中,高效地访问数据并从中获取洞见至关重要。今年,我们经历了对人工智能(AI)和大型语言模型(LLM)的兴趣爆发,这得益于该技术的最新发展和广阔前景的展现。
LangChain,一个用于处理 LLM 的广泛工具包,已成为 AI 体验开发人员最重要的构建模块之一。在 Cube,我们知道我们的语义层也是 AI 应用程序的重要构建模块,因为 Cube 不仅集中了指标计算,而且还充当 AI 幻觉的解药。
语义文档加载器
今天,我们很高兴展示 Cube 与 LangChain 的集成。它以 文档加载器 的形式出现,旨在用于使用从语义层数据模型派生的嵌入来填充向量数据库。稍后,可以查询此向量数据库以查找语义层的最佳匹配实体。这对于将自由格式的输入(例如,自然语言的查询)与数据模型中的视图及其成员进行匹配非常有用。
我们还提供了一个基于聊天的演示应用程序(请参阅 GitHub 上的 源代码),其中包含用于构建对 Cube SQL API 查询的示例 OpenAI 提示。如果您希望为语义层创建一个 AI 驱动的对话式界面,其功能类似于 Delphi,这些提示可能是一个很好的起点。
基于聊天的演示应用程序,剖析
以下是您可以使用 LangChain 的全新文档加载器、向量数据库、OpenAI 的 LLM 以及用于用户界面的 Streamlit 构建的内容
了解 LLM 生成的 SQL 查询中的表、列、聚合和过滤器如何与人工输入匹配。查看 GitHub 上的 README 文件,获取有关在您的机器上运行此演示应用程序的指针,或浏览以下亮点。
从 Cube 摄取元数据并填充向量数据库。 ingest.py
文件中的 ingest_cube_meta
函数使用全新的 CubeSemanticLoader
从 Cube 加载数据模型。请注意,仅加载 视图,因为它们被认为是 数据模型的“外观”。然后,加载的文档被嵌入并保存在 FAISS 向量存储中,随后对其进行序列化以供以后使用。
def ingest_cube_meta():
...
loader = CubeSemanticLoader(api_url, api_token)
documents = loader.load()
...
with open("vectorstore.pkl", "wb") as f:
pickle.dump(vectorstore, f)
LLM 设置。 在 main.py
文件中,导入依赖项并加载环境变量。OpenAI 模型(llm
)使用提供的 API 密钥进行初始化。
import ...
load_dotenv()
llm = OpenAI(
temperature=0,
openai_api_key=os.environ.get("OPENAI_API_KEY"),
verbose=True
)
用户输入和向量存储初始化。 在同一文件中,利用 Streamlit 原语来获取用户输入
question = st.text_input(
"Your question: ",
placeholder="Ask me anything ...",
key="input"
)
if st.button("Submit", type="primary"):
check_input(question)
vectorstore = init_vectorstore()
查询向量存储。 查询向量存储以查找与用户问题相似的文档。提取最佳匹配的表名,并将其作为最佳猜测,尝试使用向量存储中的列创建提示
docs = vectorstore.similarity_search(question)
# take the first document as the best guess
table_name = docs[0].metadata["table_name"]
# Columns
columns_question = "All available columns"
column_docs = vectorstore.similarity_search(
columns_question,
filter=dict(table_name=table_name),
k=15
)
构建提示并调用 OpenAI。* 使用构建的提示调用 OpenAI 大型语言模型,并解析响应以提取 SQL 查询和任何关联的过滤器
# Construct the prompt
prompt = CUBE_SQL_API_PROMPT.format(
input_question=question,
table_info=table_name,
columns_info=columns,
top_k=1000,
no_answer_text=_NO_ANSWER_TEXT,
)
llm_answer = llm(prompt + PROMPT_POSTFIX)
总结
Cube 与 LangChain 的集成提供了一个无缝的界面,用于使用自然语言查询数据。通过抽象化 SQL 的复杂性并利用 LLM 的强大功能,它为 AI 体验的构建者提供了一种用户友好且不易出错的数据访问方法。
对于企业而言,至关重要的是利用 LLM 的推理能力正确地利用内部知识。Cube 的语义层与 LangChain 的集成是一个很好的例子,说明大多数产品公司最终将如何为 LLM 编写智能集成,以更好地驱动这些推理引擎。