本篇我们将主要介绍如何使用 LangChain 连接 CnosDB 数据库,实现使用自然语言和数据库的交流。
大模型等的相关话题已经霸榜半年有余,在讨论关注之余,CnosDB技术团队将大模型与人工智能相关技术与数据库开发与实践进行融合。继CnosDB全面整合TensorFlow(使用 CnosDB 与 TensorFlow 进行时间序列预测)与将Copilot与Cursor应用于生产实践(Coding With AI: Copilot与Cursor)之后,近期CnosDB技术团队将CnosDB与LangChain进行了生态融合,支持用户通过LangChain框架使用自然语言进行相关的时间序列数据查询。CnosDB与LangChain集成的示例请戳:(CnosDB | 🦜️🔗 Langchain)
因为支持标准SQL的生态,也使CnosDB成为全球第一个接入LangChain生态的时序数据库。在整合LangChain框架并接入GPT之后,客户可以提出类似于“最近一小时北京各个气象观察站的平均温度?”或者“这个月上海的最高气温与最低气温是多少?”等相关问题,不用编写任何SQL,从而轻松从数据库中取得相关的查询结果。
简介CnosDB与LangChain
CnosDB 是一款高性能、高压缩率、高易用性的开源分布式时序数据库。主要应用场景为物联网、工业互联网、车联网和IT运维。所有代码均已在 GitHub 开源。
它具有以下特性:
-
高性能:CnosDB 解决了时间序列膨胀问题,理论上支持时间序列无上限,支持沿时间线的聚合查询,包括按等时间间隔划分窗口的查询、按某列枚举值划分窗口的查询、按相邻时序记录的时间间隔长度划分窗口。具备对最新数据的缓存能力,并且可以配置缓存空间,能够高速获取最新数据。
-
简单易用:CnosDB 提供清晰明了的接口,简单的配置项目,支持标准 SQL ,轻松上手,与第三方工具生态无缝集成,拥有便捷的数据访问功能。支持 schemaless ("无模式")的写入方式,支持历史数据补录(含乱序写入)。
-
云原生:CnosDB 有原生的分布式设计、数据分片和分区、存算分离、Quorum 机制、Kubernetes 部署和完整的可观测性,具有最终一致性,能够部署在公有云、私有云和混合云上。提供多租户的功能,有基于角色管理的权限分配。支持计算层无状态增减节点,储存层水平扩展提高系统存储容量。
LangChain 是一个用于开发由语言模型驱动的应用程序的框架。它可以实现以下功能:
-
数据感知:将语言模型与其他数据源连接起来。
-
主体性:允许语言模型与其环境进行交互。
LangChain 的主要价值在于:
-
组件化:为使用语言模型提供抽象化的工具,同时还提供了每个抽象化工具的一系列实现。这些组件是模块化且易于使用的,无论你是否使用LangChain框架的其他部分。
-
现成的链式结构:用于完成特定高级任务的一系列组件的结构化组合。现成的链式结构使得入门变得容易。对于更复杂的应用程序和细致的使用情况,组件使得自定义现有链式结构或构建新的链式结构变得容易。
实现架构图
通过架构图可以看出:通过利用 LangChain 的组件与现成的链,使得用户不需要提前去学习如何使用 SQL 脚本与数据库交互,节省了大量的时间与精力。利用 LangChain 、SQLDatabase、SQL Agent 以及 OpenAI 大型语言模型的强大功能,我们已经可以做到创建应用程序,实现让用户使用自然语言与 CnosDB 交流。
安装部署 CnosDB
我们以Docker为例安装CnosDB,其他的安装方法请参考官网文档,安装部分(安装 | 文档)。
1.安装 Docker 环境
2.使用 Docker 启动容器
docker run --name cnosdb -p 8902:8902 -d cnosdb/cnosdb:community-latest cnosdb run -M singleton
3.进入容器
docker exec -it cnosdb sh
4.运行 cnosdb-cli
cnosdb-cli --port 8902
连接成功之后会显示:
CnosDB CLI v2.3.1
Input arguments: Args { host: "localhost", port: 8902, user: "cnosdb", password: None, database: "public", target_partitions: Some(1), data_path: None, file: [], rc: None, format: Table, quiet: false }
public ❯
安装部署 LangChain
-
执行下面命令:
pip install langchain
安装 CnosDB 依赖
pip install cnos-connector
# cnosdb_connector版本需要大于0.1.8
连接CnosDB
我们使用 cnosdb_connector 以及 SQLDatabase 连接 CnosDB,需要创建 SQLDatabase 所需的 uri:
# 使用 make_cnosdb_langchain_uri 来创建uri
uri = cnosdb_connector.make_cnosdb_langchain_uri()
# 通过 SQLDatabase.from_uri 来创建 DB
db = SQLDatabase.from_uri(uri)
或者使用 SQLDatabase 的 from_cnosdb 方法
def SQLDatabase.from_cnosdb(url: str = "127.0.0.1:8902",
user: str = "root",
password: str = "",
tenant: str = "cnosdb",
database: str = "public")
参数:
参数名 | 含义 |
url (str) | CnosDB服务的HTTP连接主机名和端口号,不包括 "http://" 或 "https://",默认值为 "127.0.0.1:8902"。 |
user (str) | 用于连接到CnosDB服务的用户名,默认值为 "root"。 |
password (str) | 连接到CnosDB服务的用户密码,默认值为空字符串 ""。 |
tenant (str) | 用于连接到CnosDB服务的租户名称,默认值为 "cnosdb"。 |
database (str) | CnosDB租户中数据库的名称。 |
使用示例:
# 使用 SQLDatabase 连接 CnosDB
from cnosdb_connector import make_cnosdb_langchain_uri
from langchain import SQLDatabase
uri = cnosdb_connector.make_cnosdb_langchain_uri()
db = SQLDatabase.from_uri(uri)
# 创建 OpenAI Chat LLM
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")
SQLDatabaseChain示例:
这个例子演示了如何使用 SQLDatabaseChain 通过一个数据库回答一个问题。
from langchain import SQLDatabaseChain
db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)
db_chain.run(
"What is the average temperature of air at station XiaoMaiDao between October 19, 2022 and October 20, 2022?"
)
> Entering new chain...
What is the average temperature of air at station XiaoMaiDao between October 19, 2022 and Occtober 20, 2022?
SQLQuery:SELECT AVG(temperature) FROM air WHERE station = 'XiaoMaiDao' AND time >= '2022-10-19' AND time < '2022-10-20'
SQLResult: [(68.0,)]
Answer:The average temperature of air at station XiaoMaiDao between October 19, 2022 and October 20, 2022 is 68.0.
> Finished chain.
SQL Database Agent 示例:
from langchain.agents import create_sql_agent
from langchain.agents.agent_toolkits import SQLDatabaseToolkit
toolkit = SQLDatabaseToolkit(db=db, llm=llm)
agent = create_sql_agent(llm=llm, toolkit=toolkit, verbose=True)
agent.run(
"What is the average temperature of air at station XiaoMaiDao between October 19, 2022 and Occtober 20, 2022?"
)
> Entering new chain...
Action: sql_db_list_tables
Action Input: ""
Observation: air
Thought:The "air" table seems relevant to the question. I should query the schema of the "air" table to see what columns are available.
Action: sql_db_schema
Action Input: "air"
Observation:
CREATE TABLE air (
pressure FLOAT,
station STRING,
temperature FLOAT,
time TIMESTAMP,
visibility FLOAT
)
/*
3 rows from air table:
pressure station temperature time visibility
75.0 XiaoMaiDao 67.0 2022-10-19T03:40:00 54.0
77.0 XiaoMaiDao 69.0 2022-10-19T04:40:00 56.0
76.0 XiaoMaiDao 68.0 2022-10-19T05:40:00 55.0
*/
Thought:The "temperature" column in the "air" table is relevant to the question. I can query the average temperature between the specified dates.
Action: sql_db_query
Action Input: "SELECT AVG(temperature) FROM air WHERE station = 'XiaoMaiDao' AND time >= '2022-10-19' AND time <= '2022-10-20'"
Observation: [(68.0,)]
Thought:The average temperature of air at station XiaoMaiDao between October 19, 2022 and October 20, 2022 is 68.0.
Final Answer: 68.0
> Finished chain.
未来:再谈AI4DB与DB4AI
自创立伊始,CnosDB坚持AI4DB与DB4AI的理念与信仰,促进人工智能与数据库进行相应的融合,并为人工智能打造生态友好、高可用、高稳定性的时序数据库系统。【延伸阅读:数据库管理系统的未来是什么(数据库管理系统的未来是什么?)】
"AI4DB"指的是利用AI技术来增强数据库的能力,例如利用AI技术来从数据中提取模式、进行预测和分类,或者利用自然语言处理技术来实现更智能的查询和分析。这种方法可以提高数据库的效率和准确性,使其更加适应不断变化的数据环境。"DB4AI"则是指利用数据库来支持AI应用程序。数据库可以提供数据存储和管理、数据清洗和预处理、数据访问和共享等基础设施,为AI应用程序提供支持。在这种情况下,数据库的作用是为AI算法提供数据,以帮助算法进行训练和预测。
我们坚信未来将有更多的开发人员利用GPT等大模型技术创建应用程序,因此数据库的使用方式要更好的结合大模型的特定习惯。CnosDB正是基于此信仰,成为时序数据库首家拥抱LangChain生态的产品。应用程序开发的新范式即将到来,让我们一起拥抱未来,共同创建能够解决现实世界问题的强大应用程序。
补充阅读
1.使用 CnosDB 与 TensorFlow 进行时间序列预测
2.Coding With AI: Copilot与Cursor
3.数据库管理系统的未来是什么?
CnosDB简介
CnosDB是一款高性能、高易用性的开源分布式时序数据库,现已正式发布及全部开源。
欢迎关注我们的社区网站:https://cn.cnosdb.com