You need to enable JavaScript to run this app.
导航
【向量库】VikingDB向量库+豆包大模型:多模态自动打标签
最近更新时间:2025.01.02 16:06:20首次发布时间:2025.01.02 16:06:20

一、背景介绍

1.1 需求场景

企业积累了海量文、图、视频等多模态数据,亟需进行高效分类和标签化,以便后续的分析、检索和应用。
场景示例:

  1. 客户服务反馈分类:将客户反馈分类打标签,比如产品问题、物流延迟,方便快速处理问题;
  2. 内容审核与推荐:对用户上传的文本或图片分类打标,比如敏感内容、热门话题,用于内容审核和推荐分发;
  3. 电商平台商品分类:给商品图片或描述打标签,分类为家电、服饰等大类,匹配到更细的子类,提高上架效率;

1.2 解决思路

思路说明
:为什么要把VikingDB向量数据库和豆包大模型结合?
:VikingDB向量数据库负责快速找到与新数据语义相似的历史数据标签,以此作为参考,缩小分类范围,大幅减少豆包大模型的推理难度。
:什么情况下VikingDB向量数据库和豆包大模型二者结合是必要的?
:当标签体系非常复杂,比如标签有成百上千个,或者标签之间存在父子层级交叉关联时,此时单纯使用大模型分类难度大,容易出错。这种情需要向量数据库与大模型结合进行分类打标,缩小分类打标范围,减小推理难度。

1.3 方案优势

  1. 分类准确:向量检索提供参考标签,辅助大模型提高分类准确率。
  2. 多模态打标:支持文本、图片、视频、音频等多类型数据的分类和标签化。

二、快速搭建

2.1 案例场景与数据

我们将展示如何使用VikingDB向量数据库+豆包大模型,在标签量巨大的情况下,实现对文本的自动打标分类。
首先,我们拥有已经打好标签的论文摘要WOS_Data_1000.xlsx,这些已有数据将存入VikingDB向量数据库中。

WOS_Data_1000.xlsx
未知大小

该数据集由 Kamran Kowsari 等人发布,详见原始论文:“HDLTex: Hierarchical Deep Learning for Text Classification”(ICMLA 2017)。

Excel内数据样式如下,数据包含了domain(一级标签,7类)、area(二级标签,126类)、abstract(需要被打标签的文章摘要),共1000条。

domain

area

abstract

CS

Symbolic computation

(2 + 1)-dimensional non-linear optical waves through the coherently……

Medical

Alzheimer's Disease

(beta-amyloid (A beta) and tau pathology become ……

……

……

……

现还有一批不需要入库的文章摘要数据WOS_Data_Untagged_20.xlsx。

WOS_Data_Untagged_20.xlsx
未知大小

我们将使用搭建好的方案,给这些摘要进行自动打标分类。通过比对本方案打标和原有标签,来验证该场景下检索的效果。

2.2 密钥与环境准备

  1. VikingDB账号注册与服务开通:注册账号及开通服务--向量数据库VikingDB-火山引擎
  2. 获取安全凭证Access Key ID(简称为AK)和Secret Access Key(简称为SK):Access Key(密钥)管理--API访问密钥(Access Key)-火山引擎
  3. 运行环境准备,在终端输入以下指令:

推荐Python版本

3.7及以上

Python SDK安装

pip3 install --upgrade volcengine

用于使用VikingDB的服务

Ark安装

pip3 install --upgrade 'volcengine-python-sdk[ark]'

用于接入豆包大模型

Pandas安装

pip3 install --upgrade pandas

用于预处理数据

openpyxl安装

pip3 install --upgrade openpyxl

用于读取Excel数据

aiohttp安装

pip3 install --upgrade aiohttp

异步HTTP通信框架

2.3 初始化VikingDB向量数据库的Python SDK

此处初始化VikingDB向量数据库的Python SDK。
需要您在vikingdb_service.set_ak和vikingdb_service.set_sk后填入您的ak和sk。
ak和sk获取:Access Key(密钥)管理--API访问密钥(Access Key)-火山引擎

from volcengine.viking_db import *  # 注意安装:pip3 install --upgrade volcengine

# 初始化 SDK
vikingdb_service = VikingDBService(
    host="api-vikingdb.volces.com", #host中不需要加http或者https等前缀
    region="cn-beijing", # 地区(region)根据实际情况配置,华北:cn-beijing,华东:cn-shanghai
    scheme="https", #scheme 可选,可选值:http/https,推荐https。
    connection_timeout=30, #connection_timeout,可配置,默认30s。
    socket_timeout=30 #socket_timeout,可配置,默认30s。
)

vikingdb_service.set_ak("您的Access Key ID(简称为AK),注意保留""双引号")
vikingdb_service.set_sk("您的Secret Access Key(简称为SK),注意保留""双引号")

2.4 数据预处理(可选)

VikingDB向量数据库当前支持json数据上传,当数据本身就是json格式时,数据预处理不是必要步骤。
该案例下,原始数据是ExcelWOS_Data_1000.xlsx,所以需要预处理,转化为json格式,便于上传。

WOS_Data_1000.xlsx
未知大小

原始数据样式(Excel):

domain

area

abstract

CS

Symbolic computation

(2 + 1)-dimensional non-linear optical waves through the coherently……

Medical

Alzheimer's Disease

(beta-amyloid (A beta) and tau pathology become ……

……

……

……

预处理后数据样式(Jsonl):

{"ID": 1, "domain": "CS", "area": "Symbolic computation", "abstract": "(2 + 1)-dimensional non-linear……"}
{"ID": 2, "domain": "Medical", "area": "Alzheimer's Disease", "abstract": "(beta-amyloid (A beta) and……"}
……

代码实现:
注意:Excel文件需要放在和代码同一目录下

## 数据预处理 ##
# 输入和输出文件路径
file_path = "WOS_Data_1000.xlsx"
output_file = "WOS_Data_1000.jsonl"

def pre_processing():
    # 读取Excel文件,只读取需要的三列
    df = pd.read_excel(file_path, usecols=["domain", "area", "abstract"])

    # 一次性写入 JSONL 文件
    with open(output_file, 'w', encoding='utf-8') as f:
        # 使用 enumerate() 生成 doc_id,从 1 开始
        for idx, row in enumerate(df.itertuples(index=False), start=1):
            record = {
                "ID": idx,  # 直接使用 idx 作为 doc_id
                "domain": row.domain,
                "area": row.area,
                "abstract": row.abstract
            }
            f.write(json.dumps(record, ensure_ascii=False) + '\n')

    # 输出处理结果
    print(f"数据已成功提取并保存到 {output_file},共 {len(df)} 条数据。")

# 执行预处理
pre_processing()

运行成功后,Excel中前1000条数据就被转化为json格式后自动存入WOS_Data_1000.jsonl文件。

WOS_Data_1000.jsonl
未知大小

2.5 字段配置与创建数据集

该步骤通过网页端或Python SDK均可实现。

在VikingDB向量数据库网页端-数据集页面,点击“创建数据集”。

填写数据集名称、别名、描述。

在“字段配置”模块中进行字段配置

字段配置说明
每一个字段应该至少有field_name(字段名)、field_type(字段类型)这2种字段属性。还有1个不是全部字段都必须的属性,即pipeline_name(向量化流程选择)。

  • 字段名称:必填,字段名需要与json数据的key相同,本案例中数据的key是"ID"、"domain"、"area"、"abstract",那么字段名就应该是"ID"、"domain"、"area"、"abstract"。
  • 字段类型:必填,字段类型可选值有string、bool、list、list、vector、int64、float32、text、sparse_vector。在本案例中ID选择int64类型;domain、area字段选择string也就是字符串类型;abstract字段应该选择text类型,也就是文本类型,因为只有存入类型为text的数据才可以选择Embedding模型进行向量化,只有向量化后才可以进行基于数据含义的向量检索。
  • pipeline(向量化流程选择):pipeline 是指向量数据库将文本切片、向量化的预处理流程,只有经过向量化才可以实现向量检索,本案例中选用text_doubao_embedding进行向量化。VikingDB向量数据库直接集成了非常多样的Embedding模型和预处理流程,支持长短文本、切片和不切片、提取稠密和稀疏向量特征。更多pipeline功能类别可以在create_collection--向量数据库VikingDB-火山引擎了解。

全部配置好后,点击右下角“提交”。

做好以上操作后,在VikingDB向量数据库网页端-数据集页面,可以看到tagging_best_practice数据集创建成功。

2.6 上传数据

此处上传之前预处理好的数据WOS_Data_1000.jsonl。

WOS_Data_1000.jsonl
未知大小

注意:
josnl文件需要放在和代码同一目录下
在代码开头输入ak和sk

from concurrent.futures import ThreadPoolExecutor, as_completed
from volcengine.viking_db import *  # 注意安装:pip install --upgrade volcengine

# 初始化 SDK
vikingdb_service = VikingDBService(
    host="api-vikingdb.volces.com", #host中不需要加http或者https等前缀
    region="cn-beijing", # 地区(region)根据实际情况配置,华北:cn-beijing,华东:cn-shanghai
    scheme="https", #scheme 可选,可选值:http/https,推荐https。
    connection_timeout=30, #connection_timeout,可配置,默认30s。
    socket_timeout=30 #socket_timeout,可配置,默认30s。
)

vikingdb_service.set_ak("您的Access Key ID(简称为AK),注意保留""双引号")
vikingdb_service.set_sk("您的Secret Access Key(简称为SK),注意保留""双引号")


## 上传数据 ## 
# 输入文件路径
file_path = "WOS_Data_1000.jsonl"  # 处理好的 JSONL 文件

# 初始化 VikingDB service 和指定 collection
collection = vikingdb_service.get_collection("tagging_best_practice")

def do_upsert(record, collection):
    """
    将一条数据调用 upsert_data 上传到 VikingDB,
    """
    data = Data(record)  # 直接使用整个记录
    collection.upsert_data([data])
    print(f"Record {record.get('ID', 'unknown')} 上传成功。")

def concurrent_upload_jsonl(file_path, collection, max_workers=50):
    """
    使用线程池并发逐条读取 JSONL 文件并写入 VikingDB。
    :param file_path: JSONL 文件路径
    :param collection: 已初始化的 VikingDB Collection
    :param max_workers: 线程池并发数,默认为 50
    """
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        futures = []
        with open(file_path, "r", encoding="utf-8") as f:
            for line in f:
                record = json.loads(line.strip())
                future = executor.submit(do_upsert, record, collection)
                futures.append(future)

        # 等待所有线程任务完成
        for future in as_completed(futures):
            try:
                future.result()
            except Exception as e:
                print(f"上传过程中发生错误: {e}")

    print("所有数据上传完成。")

# 执行上传
concurrent_upload_jsonl(file_path, collection, max_workers=50)

上传数据成功,等待一段时间同步后,在VikingDB向量数据库网页端-数据集页面,tagging_best_practice数据集后方就可以看见数据量更新(该数据量可能不准确)。

2.7 创建索引

该步骤通过网页端或Python SDK均可实现。

是对数据中某些字段的快速查找结构,创建索引可以加速数据查询,提高检索效率。
在VikingDB向量数据库网页端-数据集页面,点击对应数据集右侧的“创建索引”。

进入创建索引页面后按如下步骤操作:

  1. 填写索引名称
  2. 填写索引描述,这一项是非必填项;
  3. 选择数据集,也就是你要为哪一个数据集创建索引;
  4. 选择CPU配额,CPU配额是指索引检索时消耗的 CPU 配额;
  5. 选择索引分片,索引分片是将数据索引拆分成多个小块,方便分布存储,提高查询效率和系统性能。这里默认选择“自动化分片”;
  6. 选择索引类型,索引类型是指数据索引的存储方式,比如存储在内存里(速度快)或存储在磁盘里(容量大)。不同类型适合不同的场景需求,此处选择默认的内存索引;
  7. 选择索引算法,索引算法是用于加速数据检索的技术,通过特定方式组织数据,提高搜索速度和效率。此处选择HNSW算法,HNSW 通过多层网络减少节点访问,快速高效搜索最近邻,适用于高效率搜索场景;
  8. 选择距离类型,指衡量向量之间距离(相似度)的算法,此处选择COSINE,即余弦相似度;
  9. 选择量化方式,量化方式是指索引中对向量的压缩方式,可以降低向量间相似性计算的复杂度。此处选择Float,也就是不对向量压缩,保留向量全部精度;

以上步骤完成后,点击右下角“提交”。

提交后,在VikingDB向量数据库网页端-数据集页面-tagging_best_practice数据集后面索引栏,就能看到“1”,即说明已经建立了1个索引。

在VikingDB向量数据库网页端-索引页面,也可以看到新建的索引名tagging_best_practice_abstract_index。

索引的初始化需要几分钟时间,当VikingDB向量数据库网页端-索引页面-执行状态栏下,变成“已就绪”时,就说明可以开始使用该索引进行检索了。

2.8 检索测试

该步骤通过网页端或Python SDK均可实现。

数据上传且索引构建完成后,测试一下向量检索效果。
此处抽取WOS_Data_Untagged_20.xlsx(这个数据没有上传)中第1条数据的abstract作为输入,它的domain标签是CS,area标签是Cryptography。

WOS_Data_Untagged_20.xlsx
未知大小

检索原理与检索标准说明

  • 检索原理:输入的abstract会被向量化,这个向量代表了输入abstract的语义,然后VikingDB向量数据库会在已经存储的数据中寻找与该向量最相似的向量,这个被返回的向量所对应的abstract就是检索结果,检索结果abstract和输入的abstract向量相似度高,这也意味着输入输出的abstract语义相似度高。
  • 检索标准:WOS_Data_Untagged_20.xlsx数据并没有被上传到VikingDB向量数据库中,所以,如果检索出的结果标签和输入数据的标签一致,那么可以说明本次向量搜索成功匹配到了与输入数据相似的结果。

在VikingDB向量数据库网页端-索引页面中,在刚刚创建好的索引右侧,点击“检索测试”。

在查询文本框内,输入如下摘要,该数据是WOS_Data_Untagged_20.xlsx中第1条数据的abstract,它的domain标签是CS,area标签是Cryptography。

A three-party scheme for secure quantum communication, namely controlled quantum dialogue ( CQD), is analyzed under the influence of non-Markovian channels. By comparing with the corresponding Markovian cases, it is seen that the average fidelity can be maintained for relatively longer periods of time. Interestingly, a number of facets of quantum cryptography, such as quantum secure direct communication, deterministic secure quantum communication and their controlled counterparts, quantum dialogue, quantum key distribution, quantum key agreement, can be reduced from the CQD scheme. Therefore, the CQD scheme is analyzed under the influence of damping, dephasing and depolarizing non-Markovian channels, and subsequently, the effect of these non-Markovian channels on the other schemes of secure quantum communication is deduced from the results obtained for CQD. The damped non-Markovian channel causes a periodic revival in the fidelity, while fidelity is observed to be sustained under the influence of the dephasing non-Markovian channel.

输入后,点击下方“查询”,即可在右侧获得查询结果。

右侧展示输出中的第一条,可以看到被搜索出来的摘要domain、area和输入的domain、area一致,所以说明本次向量搜索成功匹配到了与输入数据相似的结果。

2.9 接入豆包大模型实现自动打标

接入豆包大模型前,需要获取豆包的【API key】和【推理接入点】:

  1. 创建并获取豆包大模型API key

注册登录火山方舟平台-API key管理,点击“创建API key”

输出API key名称,然后点击“创建”

复制,即获得您的API key

  1. 创建豆包大模型推理接入点

注册登录进入火山方舟平台-在线推理,点击“创建推理接入点”

输入接入点名称、接入点描述、点击添加模型

推荐选择Doubao-pro-256k模型

点击确认接入

点击刚刚创建的接入点右侧的“API调用”

复制该接入点,ep-********这一串字符即是您的推理接入点

下面选取WOS_Data_Untagged_20.xlsx中第7条数据赋值给input_abstract,作为测试输入,该abstract是的实际domain标签是Civil,area标签是Water Pollution。

WOS_Data_Untagged_20.xlsx
未知大小

若结果是"domain": "Civil", "area": "Water Pollution",则说明该方案具有有效性。
注意:
在下方代码开头输入【豆包大模型API key】和【推理接入点】
注意在代码开头输入ak和sk

from collections import Counter
from volcengine.viking_db import *  # 注意安装:pip install --upgrade volcengine
from volcenginesdkarkruntime import Ark  # 注意安装:pip install --upgrade 'volcengine-python-sdk[ark]'

## 接入豆包大模型实现自动打标 ##
# 豆包大模型API key
Doubao_API_key = "填入您的豆包大模型API key,注意保留 "" 双引号"
# 豆包大模型推理接入点
model_end_point = "填入您的推理接入点,注意保留 "" 双引号"
# WOS_Data_Untagged_20.xlsx中选取的一条需要被打标签的abstract,这些abstract并未入库
input_abstract = "A total of 211 water samples were collected from 53 key sampling points from 5-10th July 2013 at four different depths (0 m, 2 m, 4 m, 8 m) and at different sites in the Huaihe River, Anhui, China. These points monitored for 18 parameters (water temperature, pH, TN, TP, TOC, Cu, Pb, Zn, Ni, Co, Cr, Cd, Mn, B, Fe, Al, Mg, and Ba). The spatial variability, contamination sources and health risk of trace elements as well as the river Water quality were investigated. Our results were compared with national (CSEPA) and international (WHO, USEPA) drinking water guidelines, revealing that Zn, Cd and Pb were the dominant pollutants in the water body. Application of different multivariate statistical approaches, including correlation matrix and factor/principal component analysis (FA/PCA), to assess the origins of the elements in the Huaihe River, identified three source types that accounted for 79.31% of the total variance. Anthropogenic activities were considered to contribute Much of the Zn, Cd, Pb, Ni, Co, and Mn via industrial waste, coal combustion, and vehicle exhaust; Ba, B, Cr and Cu were controlled by mixed anthropogenic and natural sources, and Mg, Fe and Al had natural origins from weathered rocks and crustal materials. Cluster analysis (CA) was used to classify the 53 sample points into three groups of water pollution, high pollution, moderate pollution, and low pollution, reflecting influences from tributaries, power plants and vehicle exhaust, and agricultural activities, respectively. The results of the water quality index (WO) indicate that Water in the Huaihe River is heavily polluted by trace elements, so approximately 96% of the water in the Huaihe River is unsuitable for drinking. A health risk assessment using the hazard quotient and index (HQ/HI) recommended by the USEPA suggests that Co, Cd and Pb in the river could cause non-carcinogenic harm to human health. (C) 2017 Elsevier B.V. All rights reserved."

# 初始化 SDK
vikingdb_service = VikingDBService(
    host="api-vikingdb.volces.com", #host中不需要加http或者https等前缀
    region="cn-beijing", # 地区(region)根据实际情况配置,华北:cn-beijing,华东:cn-shanghai
    scheme="https", #scheme 可选,可选值:http/https,推荐https。
    connection_timeout=30, #connection_timeout,可配置,默认30s。
    socket_timeout=30 #socket_timeout,可配置,默认30s。
)

vikingdb_service.set_ak("您的Access Key ID(简称为AK),注意保留""双引号")
vikingdb_service.set_sk("您的Secret Access Key(简称为SK),注意保留""双引号")

# 初始化 Ark 客户端
client = Ark(
    base_url="https://ark.cn-beijing.volces.com/api/v3", # 方舟平台Ark 服务的 API 地址
    api_key=Doubao_API_key # 用户的 API 密钥
)

# 输入system prompt和user query,获取豆包大模型输出
def ask_doubao(system_prompt,user_query):
    # 调用 chat.completions 接口来进行对话任务
    completion = client.chat.completions.create(
        model=model_end_point,  # 模型接入点
        messages=[
            {"role": "system", "content": system_prompt},  # system promote
            {"role": "user", "content": user_query},  # user query
        ],
    )
    return completion.choices[0].message.content

# 获取指定索引
index = vikingdb_service.get_index(
    "tagging_best_practice", # 前面构建好的数据集名
    "tagging_best_practice_abstract_index" # 前面创建好的索引名
)

# 从向量库中搜索与input_abstract最相似的10个abstract、domain(一级标签)、area(二级标签),以此作为让豆包大模型打标签的参考
related_abstract_domain_area = index.search_by_text(
    Text(text=input_abstract), # 检索输入
    limit=10, # 返回结果上限
    output_fields=["domain", "area"] # 需要返回的字段
)

search_result = [] # 搜索结果
# 将搜索结果全部放入列表
for item in related_abstract_domain_area:
    search_result.append(item.fields)

# 统计各个domain和area的频率
domain_counter = Counter(item['domain'] for item in search_result)
area_counter = Counter(item['area'] for item in search_result)

# 按频率排序,并去重
unique_domains = [domain for domain, count in domain_counter.most_common()]
unique_areas = [area for area, count in area_counter.most_common()]

# 豆包大模型用于给input_abstract打标签的system prompt
recommond_tags_system_prompt = f"""
## 角色
- 你是一个摘要分类器,你能够很好的分析用户输入的摘要内容,然后给摘要分类打标签;

## 任务
- 基于用户输入的摘要,分析摘要内容,对摘要打标签分类,输出domain标签和area标签;

## 全部的标签
- 全部的domain标签:['CS', 'Medical', 'Civil', 'ECE', 'biochemistry', 'MAE', 'Psychology'];
- 全部的area标签:['Symbolic computation', "Alzheimer's Disease", 'Green Building', 'Electric motor', "Parkinson's Disease", 'Computer vision', 'Molecular biology', 'Satellite radio', 'Fluid mechanics', 'Prenatal development', 'Sprains and Strains', 'Enzymology', 'Southern blotting', 'Cancer', 'Northern blotting', 'Sports Injuries', 'Senior Health', 'Computer graphics', 'Digital control', 'Human Metabolism', 'Polymerase chain reaction', 'Multiple Sclerosis', 'Operating systems', 'Microcontroller', 'Attention', 'Immunology', 'Genetics', 'Water Pollution', 'Hydraulics', 'Hepatitis C', 'Weight Loss', 'Machine learning', 'Low Testosterone', 'Fungal Infection', 'Diabetes', 'Data structures', 'Cell biology', 'Parenting', 'Birth Control', 'Smart Material', 'network security', 'Heart Disease', 'computer-aided design', 'Image processing', 'Parallel computing', 'Ambient Intelligence', 'Allergies', 'Menopause', 'Emergency Contraception', 'Electrical network', 'Construction Management', 'Distributed computing', 'Electrical generator', 'Electricity', 'Operational amplifier', 'Manufacturing engineering', 'Analog signal processing', 'Skin Care', 'Eating disorders', 'Myelofibrosis', 'Suspension Bridge', 'Machine design', 'Hypothyroidism', 'Headache', 'Overactive Bladder', 'Geotextile', 'Irritable Bowel Syndrome', 'Polycythemia Vera', 'Atrial Fibrillation', 'Smoking Cessation', 'Lymphoma', 'Thermodynamics', 'Asthma', 'State space representation', 'Bipolar Disorder', 'Materials Engineering', 'Stealth Technology', 'Solar Energy', 'Signal-flow graph', "Crohn's Disease", 'Borderline personality disorder', 'Prosocial behavior', 'False memories', 'Idiopathic Pulmonary Fibrosis', 'Electrical circuits', 'Algorithm design', 'Strength of materials', 'Problem-solving', 'Internal combustion engine', 'Lorentz force law', 'Prejudice', 'Antisocial personality disorder', 'System identification', 'Computer programming', 'Nonverbal communication', 'Relational databases', 'PID controller', 'Voltage law', 'Leadership', 'Child abuse', 'Mental Health', 'Dementia', 'Rheumatoid Arthritis', 'Osteoporosis', 'Software engineering', 'Bioinformatics', 'Medicare', 'Control engineering', 'Psoriatic Arthritis', 'Addiction', 'Atopic Dermatitis', 'Digestive Health', 'Remote Sensing', 'Gender roles', 'Rainwater Harvesting', 'Healthy Sleep', 'Depression', 'Social cognition', 'Anxiety', 'Cryptography', 'Psoriasis', 'Ankylosing Spondylitis', "Children's Health", 'Stress Management', 'Seasonal affective disorder', 'HIV/AIDS'];

## 推荐使用的标签
- 推荐的domain标签:{unique_domains};
- 推荐的area标签:{unique_areas};

## 要求
- 先分析用户发的摘要内容是什么,这个内容最可能是什么领域什么主题的,一步一步慢慢分析;
- 对于一个摘要,只能打唯一一个domain标签和唯一一个area标签;
- 优先从上面给的"推荐使用的标签"里面选取标签,打给用户输入的摘要;
- 经过分析后,若"推荐使用的标签"里面没有合适的标签,则从"全部的标签"里面再做选择打给用户的摘要;
- 严格按照下面的json格式输出;

## 输出格式参考
{{"analysis": "这里是你对摘要内容,以及应该怎么打标签的分析", "domain": "domain标签", "area": "area标签"}}
"""

# 给输入的abstract打标签
tagging_result = ask_doubao(recommond_tags_system_prompt,input_abstract)
print(tagging_result)

输出:

{
"analysis": "摘要主要围绕着在中国安徽淮河的53个关键采样点采集211个水样,对水样中的18个参数进行监测,研究微量元素的空间变异性、污染源、健康风险以及河水水质等情况,还提及了将结果与国内外饮用水标准对比,运用多种统计方法分析元素来源,以及通过聚类分析对采样点进行水污染分类等内容,这与水相关的污染研究有关。所以从推荐标签里,domain标签为Civil,area标签为Water Pollution。", 
"domain": "Civil", 
"area": "Water Pollution"
}

输入输出如上所示,成功从7×126=882种标签组合中给出正确的标签"domain": "Civil", "area": "Water Pollution"