实战进阶:基于华为云 DDS 文档数据库与大模型实现半结构化 JSON 数据智能检索

举报
cl16315 发表于 2026/11/08 23:14:19 2026/11/08
【摘要】 一、 前言在传统的 relational database(关系型数据库)中,表结构(Schema)是严格固定的。但在实际业务开发中,我们经常遇到这样的痛点:1. 结构多变:电商商品的属性千差万别(有的有尺码,有的有功率,有的有颜色),如果强行用关系型表存储会产生大量的空字段。2. 查询门槛高:半结构化数据(JSON)虽然灵活,但编写复杂的嵌套查询(如 MongoDB 的 Aggregate...

一、 前言

在传统的 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 提示词时遇到问题,欢迎在评论区留言交流!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。