实战进阶:基于华为云 DDS 文档数据库与大模型实现半结构化 JSON 数据智能检索
一、 前言
在传统的 relational database(关系型数据库)中,表结构(Schema)是严格固定的。但在实际业务开发中,我们经常遇到这样的痛点:
1. 结构多变:电商商品的属性千差万别(有的有尺码,有的有功率,有的有颜色),如果强行用关系型表存储会产生大量的空字段。
2. 查询门槛高:半结构化数据(JSON)虽然灵活,但编写复杂的嵌套查询(如 MongoDB 的 Aggregate 聚合管道)对于非技术人员或普通运营来说极其痛苦。
为了解决这一痛点,NoSQL 文档数据库(如 MongoDB 兼容的 DDS)结合大语言模型(LLM) 成为了绝佳的组合。
今天,我们就以华为云 DDS(文档数据库服务,Document Database Service) 为底座,结合 Python 与大模型,实现一个“自然语言查询 JSON 文档”的智能助手。
────────────────────────────────────
二、 核心架构设计
整个系统的交互链路非常顺畅:
1. 半结构化存储:将灵活的 JSON 文档(如商品、设备日志)存入华为云 DDS 中。
2. 大模型翻译(NL-to-Query):用户输入自然语言(例如:“帮我找一下价格大于 3000 且颜色是红色的手机”)。
3. 生成 NoSQL 查询语句:大模型根据 DDS 的文档结构,将其自动转换为规范的 MongoDB 语法查询语句(如 db.products.find({"price": {"$gt": 3000}, "color": "red"}))。
4. 安全执行与返回:在后端对生成的查询语句进行安全审计后,在华为云 DDS 中执行并返回结果。
────────────────────────────────────
三、 环境准备与依赖安装
在开始写代码前,请确保安装了连接 MongoDB 兼容数据库和请求大模型的依赖库:
pip install pymongo requests
────────────────────────────────────
四、 核心代码实战
以下是一个精简的 Python 实现脚本,模拟了从自然语言到华为云 DDS 执行查询的全过程:
import json
import requests
from pymongo import MongoClient
# ==================== 1. 配置华为云 DDS 与大模型连接 ====================
# 华为云 DDS(文档数据库服务)连接串
DDS_CONNECTION_STRING = "mongodb://db_user:your_password@your-dds-instance-ip.huaweicloud.com:8635/admin?ssl=true"
# 华为云 ModelArts 部署的大模型 API 地址
MODEL_API_URL = "https://your-modelarts-endpoint-url.com/v1/infer"
API_TOKEN = "您的华为云-IAM-Token"
# ==================== 2. 调用大模型将自然语言转换为 MongoDB 查询语法 ====================
def natural_language_to_mongodb_query(user_query: str) -> str:
# 给出 DDS 中存储的文档结构 Schema 提示词工程
schema_prompt = """
你是一个华为云 DDS(MongoDB兼容)文档数据库专家。请根据以下集合(Collection)的 JSON 文档结构,将用户的自然语言转换为标准的 MongoDB 查询语句(find方法中的过滤条件 JSON)。
只返回合法的 JSON 查询条件,不要包含任何 markdown 标记或多余解释。
文档结构示例(Collection: products):
{
"product_name": "智能手机",
"price": 3999,
"category": "数码",
"attributes": {
"color": "黑色",
"storage": "256G"
}
}
用户问题:
"""
full_prompt = schema_prompt + user_query
headers = {"Content-Type": "application/json", "X-Auth-Token": API_TOKEN}
payload = {
"inputs": full_prompt,
"parameters": {
"max_new_tokens": 128,
"temperature": 0.0,
}, # 温度设为0,保证语法严谨
}
try:
response = requests.post(
MODEL_API_URL, headers=headers, json=payload, timeout=30
)
if response.status_code == 200:
result = response.json()
query_str = result.get("generated_text", "{}").strip()
return query_str
else:
print(f"大模型调用失败: {response.status_code}")
return "{}"
except Exception as e:
print(f"请求异常: {e}")
return "{}"
# ==================== 3. 在华为云 DDS 中执行查询 ====================
def execute_query_on_dds(query_dict: dict):
try:
client = MongoClient(DDS_CONNECTION_STRING)
db = client["business_db"]
collection = db["products"]
print(f"正在华为云 DDS 中执行查询条件: {query_dict}")
# 执行查询,最多返回前 5 条
results = list(collection.find(query_dict).limit(5))
client.close()
return results
except Exception as e:
print(f"DDS 数据库执行错误: {e}")
return []
# ==================== 4. 主程序测试 ====================
if __name__ == "__main__":
user_input = "帮我找一下价格大于 3000 的商品有哪些?"
print(f"用户提问: {user_input}\n")
# 步骤 1:自然语言转 MongoDB 查询条件
generated_query_str = natural_language_to_mongodb_query(user_input)
print(f"大模型生成的查询条件: {generated_query_str}\n")
# 步骤 2:在华为云 DDS 中执行
try:
query_dict = json.loads(generated_query_str)
query_results = execute_query_on_dds(query_dict)
print(f"查询结果数量: {len(query_results)}")
for doc in query_results:
# 将 ObjectId 等转为字符串以便打印
doc["_id"] = str(doc["_id"])
print(doc)
except json.JSONDecodeError:
print("大模型生成的不是合法的 JSON 查询条件,解析失败。")
────────────────────────────────────
五、 生产环境落地安全与性能建议
1. 严格限制数据库权限:让大模型生成的查询去直接操作生产数据库风险极高。建议连接 DDS 的账号只具备 find(只读)权限,严禁赋予写、删、改或执行 eval 脚本的权限。
2. 查询超时控制(Max Time MS):在 MongoDB/DDS 查询时设置严格的超时时间,防止大模型生成复杂的笛卡尔积或全表扫描查询,导致数据库 CPU 飙升。
3. 合理建立索引:对于高频被大模型检索的字段(如 price、category),必须在华为云 DDS 控制台中为其建立单字段或复合索引。
────────────────────────────────────
六、 总结
通过今天的实战,我们打通了“自然语言 $\rightarrow$ 华为云大模型 $\rightarrow$ 华为云 DDS 文档数据库 $\rightarrow$ 半结构化 JSON 数据精准检索”的全链路。
借助华为云高性能、高可靠的文档数据库服务 DDS 与大模型的智慧结合,非技术人员也能轻松驾驭复杂的 NoSQL 数据查询,大幅提升企业内部的数据流转效率。
如果你在连接华为云 DDS 或编写 NoSQL 提示词时遇到问题,欢迎在评论区留言交流!
- 点赞
- 收藏
- 关注作者
评论(0)