(某乎吞了我的帖子,发这里)DeepsetAI-haystack中文场景下使用(三)让haystack能用在中文任务上!

2023.12.5 deepsetAI发布了最新beta版本的haystack2.0 项目整体结构大改。 而其分词分句功能目前没有加入,也许以后都不会加入。 因此本教程适用于haystack2.0版本之前的。请根据需要下载版本,并查看官方文档。 在2.0版本之前,haystack也存在很多实用性组件,不代表2.0版本会比之前功能更多。

写在开头,本系列文章,目的在将deepsetAI-haystack的nlp在中文领域应用讲解透彻,以实用角度出发,从安装部署,到实际应用,全讲。个人觉得,应该能在nlp领域广泛应用,可以用来解决训练集数据问题,大模型外接知识库问题,等。

前情提要

在上一篇内容中,我们安装好了官方版本的haystack,并测试了一个简单的例子,给了一些文档,将文档预处理之后,写入到内存中作为document_store,并通过bm25关键词检索,对用户输入的query问题检索到top_k个答案,并调用QA模型对检索出的文档进行解析。

如果还没看过的小伙伴,可以看我上一篇文章:

DeepsetAI-haystack中文场景下使用(二)haystack的安装

当然,调用QA模型有一个特点,就是回答基本都是言简意赅。 但是可以将搜索结果处理后接入大模型解析。这个会在以后的文章中更新。 最重要的是检索的精度问题。 以及检索速度的问题。

今天我们根据官方教程中,基础使用的另一个例子来看一下中文情况下,表现有多差。

并且我们会将haystack的两个py文件进行替换,让其支持中文!

下面开始

利用现有的常见问题解答,来回答问题。

官方教程链接: Utilizing Existing FAQs for Question Answering | Haystack

为了在中文语境上测试该教程,我收集了一些常见的医疗 问题—答案 的数据集。

度盘链接:

链接: https://pan.baidu.com/s/1CZ0Pthwy_jERXJSWPOceNQ

提取码:1234

里面有2个数据集,一个是官方问答数据集,是英文的。另一个是中文的医疗问答类数据集。

英文部分,自己可以跑一下。本篇主要测试中文问答。

中文医疗问答数据集大致是这个样子。

department,title,ask,answer
心血管科,高血压患者能吃党参吗?,我有高血压这两天女婿来的时候给我拿了些党参泡水喝,您好高血压可以吃党参吗?,高血压病人可以口服党参的。党参有降血脂,降血压的作用,可以彻底消除血液中的垃圾,从而对冠心病以及心血管疾病的患者都有一定的稳定预防工作作用,因此平时口服党参能远离三高的危害。另外党参除了益气养血,降低中枢神经作用,调整消化系统功能,健脾补肺的功能。感谢您的进行咨询,期望我的解释对你有所帮助。

包含了问题所属科室,问题的标题,问题详细描述,以及医生的解答。

该任务完成的是,根据语义匹配,匹配到用户输入的问题,在该数据集中最相似的问题,并把该问题的答案返还给用户。

代码如下:

import logging

logging.basicConfig(format="%(levelname)s - %(name)s -  %(message)s", level=logging.WARNING)
logging.getLogger("haystack").setLevel(logging.INFO)

from haystack.nodes import EmbeddingRetriever
from haystack.document_stores import InMemoryDocumentStore

# 创建一个存储在内存中的document_store
document_store = InMemoryDocumentStore()

from haystack.nodes import EmbeddingRetriever

retriever = EmbeddingRetriever(
    document_store=document_store,
    embedding_model="sentence-transformers/paraphrase-multilingual-mpnet-base-v2",
    use_gpu=True,
    scale_score=False,
)

# retriever = EmbeddingRetriever(
#     document_store=document_store,
#     embedding_model="uer/sbert-base-chinese-nli",
#     use_gpu=True,
#     scale_score=False,
# )


import pandas as pd

from haystack.utils import fetch_archive_from_http

# 下载数据集,这里我处理好了,记得修改好路径
doc_dir = "../data/tutorial4"
# s3_url = "https://s3.eu-central-1.amazonaws.com/deepset.ai-farm-qa/datasets/documents/small_faq_covid.csv.zip"
# fetch_archive_from_http(url=s3_url, output_dir=doc_dir)

# 读取csv文件
df = pd.read_csv(f"{doc_dir}/样例_内科5000-6000.csv")

# 去除空值
df.fillna(value="", inplace=True)
df["ask"] = df["ask"].apply(lambda x: x.strip())
print(df.head())

#将问题ask,经过embedding模型,映射为tensor,并写入dataframe的新的一列
questions = list(df["ask"].values)
df["embedding"] = retriever.embed_queries(queries=questions).tolist()
df = df.rename(columns={"ask": "content"})

# 将df数据转换为字典,因为document_store的写入接口,接收的数据是字典格式的
docs_to_index = df.to_dict(orient="records")
document_store.write_documents(docs_to_index)

# 创建FAQ管道,并添加管道组件检索器retriever
from haystack.pipelines import FAQPipeline
pipe = FAQPipeline(retriever=retriever)

from haystack.utils import print_answers

# 开始提问
prediction = pipe.run(query="癫痫用什么药物", params={"Retriever": {"top_k": 1}})
# 打印答案
print_answers(prediction, details="medium")

注意修改代码中的路径。

这里使用的embedding模型是一个文本相似度模型,支持50多种语言,包括中文。 sentence-transformers/paraphrase-multilingual-mpnet-base-v2 · Hugging Face

各位也可以根据数据集中的问题来进行提问,但是注意,要换一个问法,我们需要让haystack进行多语义提问,而不是关键词搜索。 例如,在数据集中的问题是:癫痫会表现出哪些症状?,我们提问的时候可以提问,癫痫的表现是什么样的? 如果匹配到可以的答案,那么就可以了。

ps:数据embedding以及写入内存的过程比较耗时,可以将提问部分自行修改为while Ture, 等待接收问题。 这样可以省去每次执行脚本都要重新embedding写入,因为脚本执行结束,退出后,内存中存储的document_store会被释放。 本章后面会介绍一个持久化存储document_store的方法,其实也是调用数据库。


如果你已经测试了很多,发现,这不是基本可以用吗,中文的表现也不是很差啊,语义检索的精度,来自于文本相似度模型的表现啊。 根本不需要修改代码进行替换。

别急, 上一个文章说过,haystack之所以不支持中文,是因为分词分句的问题,英文的分词直接空格切分就好了,而中文要使用jieba。 在上面这个官方教程中,根本没使用到分词,分句。 并且问题ask的长度不长,如果按照title字段进行搜索,也就20个字符不到。 并且,基于已有问题搜索答案,本身实用性不是那么高,多是应用于已有固定解决方法或者答案。 比方说人工客服回复客户,常见的问题,基本都写好了。 也算是一种人工标注。

重点来了,如果只有文档,没有答案呢?我还要根据文档去找到答案。

各位首先想到的是langchain对吧。

其实haystack比langchain早了一两年。

接下来这个例子实用性较高,可扩展能力较高,请仔细阅读。

拿小板凳坐好。

动图封面


官方教程  Better Retrieval with Embedding Retrieval | Haystack

任务说明:我有一大堆文档,没有人工标注,没有答案,就是一大堆文档。 我要在里面搜索一些内容的答案。

英文测试内容,去上面的链接自己跑。 如果有google_colab,可以直接点这里,链接一个免费的T4显卡,全部代码块执行,就可以。

准备一些中文数据集,百科词条

测试用的一共13个百科词条。文档长度不确定。

另外还有一个大的百科词条,一共636个文档。

度盘下载:

测试用数据data_test

链接: https://pan.baidu.com/s/1pOJrV_fmKBS2EjiGiZ_27w

提取码:1234

完整数据:

链接: https://pan.baidu.com/s/1uA2QpGYHf0SP2TtrPeuu4w

提取码:1234


数据准备好了,代码如下:

import os
import logging
import time
logging.basicConfig(format="%(levelname)s - %(name)s -  %(message)s", level=logging.WARNING)
logging.getLogger("haystack").setLevel(logging.INFO)

# 写入库

from haystack.document_stores import FAISSDocumentStore
from haystack.pipelines.standard_pipelines import TextIndexingPipeline
#创建库以及索引
document_store = FAISSDocumentStore(faiss_index_factory_str="Flat",embedding_dim=768)

#加载已有的document_store
# document_store = FAISSDocumentStore.load(index_path="wiki_faiss_index.faiss", config_path="wiki_faiss_index.json")

doc_dir = 'F:\MC-PROJECT\CUDA_Preject/test_haystack\wiki\data_test'


files_to_index = [doc_dir + "/" + f for f in os.listdir(doc_dir)]
indexing_pipeline = TextIndexingPipeline(document_store)
indexing_pipeline.run_batch(file_paths=files_to_index)
# print(document_store.get_all_documents())

from haystack.nodes import EmbeddingRetriever

retriever = EmbeddingRetriever(
    document_store=document_store,
    embedding_model="shibing624/text2vec-base-chinese",
)

document_store.update_embeddings(retriever)

document_store.save(index_path="wiki_faiss_index.faiss")


from haystack.nodes import FARMReader
reader = FARMReader(model_name_or_path="uer/roberta-base-chinese-extractive-qa", use_gpu=True,context_window_size=300,max_seq_len=512)

# 下面这个IDEA研究院的模型太大
# reader = FARMReader(model_name_or_path="IDEA-CCNL/Randeng-T5-784M-QA-Chinese", use_gpu=True)


from haystack.utils import print_answers
from haystack.pipelines import ExtractiveQAPipeline

pipe = ExtractiveQAPipeline(reader, retriever)




while True:
    q = input('输入问题吧:')
    st_time = time.time()
    prediction = pipe.run(
        query=q,
        params={
            "Retriever": {"top_k": 10},
            "Reader": {"top_k": 5}
        }
    )
    # print(prediction)
    print_answers(prediction, details="all")
    end_time = time.time()

    print("计算时间为:{}".format(end_time - st_time))

说明:

  1. 首先,路径问题,不需要多说,自行修改。
  2. 使用的文本相似度模型为shibing624/text2vec-base-chinese,huggingface上开源,自行查看参数
  3. QA模型为uer/roberta-base-chinese-extractive-qa,同样HF上开源。
  4. 矢量存储库使用的是faiss,存储在本地,faiss的参数可修改地方很多,可以自行查看官方API文档,在我前面的文章有地址链接。
  5. 我写了while True循环,可以重复的提问。

执行成功后,应该是下面的样子:

我相信各位自行测试过的小伙伴,会发现,测试的结果有好有坏,有的还行,有的几乎不贴题。

如果你中间停止了脚本,再次执行一定会报以下错误。

注意看该脚本的同目录下,是不是多了这三个文件。

看代码这个部分:

from haystack.document_stores import FAISSDocumentStore
from haystack.pipelines.standard_pipelines import TextIndexingPipeline
#创建库以及索引
document_store = FAISSDocumentStore(faiss_index_factory_str="Flat",embedding_dim=768)

#加载已有的document_store
# document_store = FAISSDocumentStore.load(index_path="wiki_faiss_index.faiss", config_path="wiki_faiss_index.json")

解释: 创建document_store,创建的是faiss存储,因此,在同目录下,会出现后缀为db的文件,是将document_store进行本地化存储,同时另外两个,以faiss和json为后缀的文件,是faiss存储的索引以及配置文件。faiss存储也支持远程,需要填写地址以及存储名称,haystack会在远程服务器创建faiss持久化存储。

因此想要解决这个问题,你可以将这三个文件删除,删除后重新执行,就不会报错,但是又要进行一次文档处理,以及embedding的过程。如果文档量很大。 比如那个636个百科词条的文档,耗时会将近半小时。

那么另一种解决方法,就是将创建faiss的document_store代码注释掉,并把下面的document_store放开,代表不重新创建document_store,转而加载已有的document_store。

这样,就不需要等待重新写入这种漫长的过程了。


修改代码使其支持中文语境

分析一下,其中文表现效果时好时坏的原因。

分句,分词。 在文档预处理时,haystack使用了自定义的管道组件:

files_to_index = [doc_dir + "/" + f for f in os.listdir(doc_dir)]
indexing_pipeline = TextIndexingPipeline(document_store)
indexing_pipeline.run_batch(file_paths=files_to_index)

如果有兴趣ctrl跳转进TextIndexingPipeline,你会在里面看到preprocessor组件,这个就是对文档进行切分。

其规则会根据空行切分,也会根据英语的句号进行切分,也会根据回车符\n切分,等等。

但是,现在使用的是中文,因此只有\n,或者空行,生效。

看一下数据。你会发现。假设我们需要将文档切分成,300个字符的小文档。 同时尊重句子边界(也就是在不超过300字符的情况下,保证句子完整。 也就是说,如果下一个句子加进来,小文档的长度超过了300个字符,则省去下一个句子, 来保证不超过300个字符,同时不让每个小文档的最后一个句子,只说了一半话,就被截断了)

preprocessor类的接口如下,有兴趣请查一下官方接口文档,文档预处理,对于检索的准确度有一定影响。举个简单的例子,模型支持输入512个字符的话,如果文档切分长度为600,那么会被截断的。 诸如此类。

各位明显会看到language里面的参数是'en'。

别急,马上就是如何修改,使其支持中文。


我修改好了文件,并上传至github。只需要将我提供的文件,替换haystack同名原文件即可。

GitHub - mc112611/haystack-chinese: :mag: 基于deepsetAI的开源项目haystack进行修改,使其支持中文场景下的任务

里面两个preprocessor.py和txt.py都替换原文件,原文件的位置如下

preprocessor.py:你的解释器环境+\Lib\site-packages\haystack\nodes\preprocessor
txt.py:你的解释器环境\Lib\site-packages\haystack\nodes\file_converter

大家会在上面的目录下,找到同名文件,替换掉即可。

我们看一下替换后的preprocessor预处理器。

首先在语种加入了zh

参数等设置为默认。实际上,preprocessor为文档预处理器,这个组件是可以单独被调用的,用法不在官方教程中,需要自己去研究haystack的官方文档,以及接口文档。 可以作为管道组件添加到pipeline中的任意位置。本篇文章不提供这些复杂用法的教程。

替换完毕之后就可以支持中文了。

再执行一次,会发现表现效果好了很多,文档切分也更舒适了。

记得删除那三个faiss文件,因为这次我们要重新对文档进行处理。

PS:当然,文档质量也影响检索的结果,这里我提供的wiki文档,没有做数据清洗,会有一些符号等。如果有小伙伴想实际应用,注意这一点哦。

最佳化,等内容,在官方文档都有非常详细的使用说明。 个人总结起来肯定不如官方做的全面细致。 当然,我会尽可能在后面的文章中去写一些, 但是,一切请以官方文档为准。

个人提供这个修改源码的文件,基本上在我个人测试官方支持功能的时候,基本上没遇到问题。如果有问题,欢迎交流。


到这里,基本上haystack已经可以应用于中文场景了。

最大的问题解决了,剩下的就是照着官方教程,以及官方文档,去实际操作,包括接入翻译器,接入文本转语音,接入web搜索引擎,接入聊天应用程序,或者接入文本到图像的图文搜索。

下一章,我会更新如何微调模型,当应用某些特定领域时候,训练文本相似度模型,QA模型,使用哪些,或者微调这类模型。 有兴趣的可以看一下 sentence_transformer ,做文本相似度模型最好的库。

mc112611
关注 关注
  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
haystack之1初识haystack
Forgive Me
05-31 1456
目录初识haystackhaystack的特点最简单的QA示例总结 初识haystack 去年就关注到了haystack这个框架,那会儿还不是很完善。今年再次看到haystack现已经很完善了。 在17年的时候曾经基于RASA框架写过一篇关于如何打造一个chatbot的文章,很粗浅的介绍并写了一个chatbot。QA在NLP领域一直受到很多的关注,比如AIML就是早期的用于开chatbot的标记语言。随着深度学习时代的到来,各项NLP技术日新月异、百花齐放,业界对NLP技术本身的关注远大于QA的关注。
drf-haystack:Haystack for Django REST框架
04-30
Haystack for Django REST框架 建置状态 关于 试图简化Haystack与Django REST Framework集成的小型库。 有关最新阅读文档! 支持的版本 Python 3.6及更高版本 Django 2.2和3.0 Haystack 2.8及更高版本 Django REST ...
探索Haystack教程:构建智能的大型文档搜索系统
gitblog_00020的博客
06-25 436
探索Haystack教程:构建智能的大型文档搜索系统 haystack-tutorials Here you can find all the Tutorials for Haystack ???? 项目地址: https://gitcode.com/gh_mirror...
Haystack:构建下一代自然语言处理应用的强大框架
gitblog_00329的博客
09-14 379
Haystack:构建下一代自然语言处理应用的强大框架 haystack deepset-ai/haystack: Haystack是由Deepset AI的一个开源项目,提供了一套全面的工具集,用于构建、部署和维护大规模的企业级搜索和问答系统。它整合了NLP技术,支持对结构化和非结构化数据进行检索与理解。 ...
Haystack的介绍和使用
weixin_30342209的博客
07-10 865
一,什么是Haystack   搜索是一个日益重要的话题。用户越来越依赖于搜索从噪声信息中分离和快速找到有用信息。此外,搜索搜索可以洞察那些东西是受欢迎的,改善网站上难以查找的东西。   为此,Haystack试图整合自定义搜索,使其尽可能简单的灵活和强大到足以处理更高级的用例。haystack支持多种搜索引擎,不仅仅是whoosh,使用 solr、elastic search等搜索,也可通...
Haystack
weixin_45439324的博客
10-22 484
Haystack 1.Haystack介绍 Haystack 是在Django中对接搜索引擎的框架,搭建了用户和搜索引擎之间的沟通桥梁。 我们在Django中可以通过使用 Haystack 来调用 Elasticsearch 搜索引擎。 Haystack 可以在不修改代码的情况下使用不同的搜索后端(比如 Elasticsearch、Whoosh、Solr等等)。 2.Haystack安装...
haystack
yang_joker的博客
01-05 483
# 商品搜索 # 商品搜索 # # 1. 需求分析 # 当用户在搜索框输入关键字后,我们要为用户提供相关的搜索结果。 # # 这种需求依赖数据库的模糊查询like关键字可以实现,但是like关键字的效率极低,而且查询需要在多个字段中进行,使用like关键字也不方便。 # # 我们引入搜索引擎来实现全文检索。全文检索即在指定的任意字段中进行检索查询。 # # 2. 搜索引擎原理 # 通过搜索引擎进行...
基于django-haystack中文分词与全文搜索集成设计源码
最新发布
09-30
该源码是基于Django框架与django-haystack中文分词与全文搜索集成设计,包含69个文件,包括39个Python源代码文件、26个Python编译文件、2个XML配置文件、1个Markdown文件和1个HTML文件。项目旨在实现中文内容的...
celery-haystack:将Celery与Haystack集成的应用程序
04-14
芹菜干草堆 此Django应用程序允许您利用Celery自动更新和删除搜索索引中的对象。 要求 Django 1.8以上 ... 在设置中启用celery-haystack信号处理器 HAYSTACK_SIGNAL_PROCESSOR = 'celery_haystack.signals.Cele
django-haystack:模块化搜索Django
02-23
Haystack已获得BSD许可,可以与第方应用程序完美结合,而无需修改源代码,并支持高级功能,例如构面,更多类似内容,突出显示,空间搜索和拼写建议。 您可以在找到更多信息。 获得帮助 有一个可供一般讨论的邮件...
django-haystack Elasticsearch
11-13
django-haystack Elasticsearch 安装配置django-haystack Elasticsearch 安装配置django-haystack Elasticsearch 安装配置
Haystack 开源项目教程
gitblog_00948的博客
08-30 314
Haystack 开源项目教程 haystackSimple, extendable full-text search engine written in Elixir项目地址:https://gitcode.com/gh_mirrors/hayst/haystack 项目介绍 Haystack 是一个端到端的 LLM(大型语言模型)框架,旨在帮助用户构建由 LLM、Transformer 模型...
开源项目 headless-haystack 使用教程
gitblog_00417的博客
08-28 374
开源项目 headless-haystack 使用教程 headless-haystackCreate your own AirTag with OpenHaystack, but without the need to own an Apple device项目地址:https://gitcode.com/gh_mirrors/he/headless-haystack 项目的目录结构及介绍 ...
django-haystack使用小结
llsixly
09-25 474
接下来是网络上比较难找的,我们不需要他返回templates的数据的时候直接重写他的render_to_response函数就可以控制返回的结果了。'msg' : '不能用drf的response' , 'code' : status . HTTP_401_UNAUTHORIZED } , status = 200 , json_dumps_params = {
Haystack的介绍与使用,以及缺少依赖包安装失败解决方案
ol_m_lo的博客
07-30 1141
一,什么是Haystack   搜索是一个日益重要的话题。用户越来越依赖于搜索从噪声信息中分离和快速找到有用信息。此外,搜索搜索可以洞察那些东西是受欢迎的,改善网站上难以查找的东西。 为此,Haystack试图整合自定义搜索,使其尽可能简单的灵活和强大到足以处理更高级的用例。haystack支持多种搜索引擎,不仅仅是whoosh,使用 solr、elastic search等搜索,也可通过haystack,而且直接切换引擎即可,甚至无需修改搜索代码。 二,安装相关的包 pip install django-
[BSidesSF2020]haystack
m0_57291352的博客
09-05 354
[BSidesSF2020]haystack 题目 This vendor claims they have figured out a way to preserve the integrity and confidentiality of a message using signing instead of encryption. We only have a binary pycache file and a message off the wire – can you find the cont
haystack 介绍
iteye_7969的博客
06-01 583
  Needle in a haystack: efficient storage of billions of photos 由 Peter Vajgel 于 2009年4月30日 14:27 · 布 The Photos application is one of Facebook’s most popular features. Up to date, u...
drf-haystack
09-12
DRF-Haystack是一个用于将Django Rest Framework(DRF)与Haystack集成的库。Haystack是Django中的全文搜索框架,而DRF是一个用于构建RESTful API的强大框架。 DRF-Haystack提供了一组用于处理搜索请求和响应的DRF视图和序列化器,使得在API中实现全文搜索变得更加简单。它允许你定义搜索字段、过滤器和排序选项,并提供了灵活的配置选项。通过使用DRF-Haystack,你可以方便地将全文搜索功能添加到你的Django RESTful API中。 要使用DRF-Haystack,首先需要配置Haystack来进行全文搜索索引的创建和管理。然后,你可以使用DRF-Haystack提供的视图和序列化器类来定义搜索API端点,并将其集成到你的DRF应用程序中。 总结来说,DRF-Haystack是一个将DRF和Haystack集成起来,使得在Django RESTful API中实现全文搜索变得更加简单和方便的库。
写文章

热门文章

  • (某乎吞了我的帖子,发这里)DeepsetAI-haystack中文场景下使用(三)让haystack能用在中文任务上! 1189
  • (徒手搓LLM)逐行代码解释,从0构造一个LLM——LlaMa篇 825
  • 通俗理解旋转位置编码ROPE(二)---注意力机制与ROPE 574
  • 通俗理解旋转位置编码ROPE(一)---注意力Q加入ROPE 540

最新评论

  • (某乎吞了我的帖子,发这里)DeepsetAI-haystack中文场景下使用(三)让haystack能用在中文任务上!

    Vantablack: 佬,有空常更新啊

  • (某乎吞了我的帖子,发这里)DeepsetAI-haystack中文场景下使用(三)让haystack能用在中文任务上!

    mc112611: 感谢提示,因为数据里有一些敏感信息(其实也不算敏感,只是wiki百科词条,里面有一些人的名字表情包)。 haystack2.0版本功能完善了,依旧不支持中文,本厮找到了支持中文的方法,等我更新文章,再把数据问题处理一下,下次直接放GitHub 。 新的毕竟比旧的好。表情包

  • (某乎吞了我的帖子,发这里)DeepsetAI-haystack中文场景下使用(三)让haystack能用在中文任务上!

    饮者阿良: 谢谢大佬分享,现在词条数据被和谐了,麻烦有空的时候看一下

大家在看

  • 德敏哲Germanjet磁致伸缩位移传感器SSI输出选购及PLC设置指引 1085
  • 科普文:软件架构数据库系列之【一文搞懂MySQL中Innodb事务原理/ACID】 593
  • C++大坑之——多继承(菱形继承)
  • 【Spring篇】Spring的Aop详解
  • 【贪心算法】(第十篇)

最新文章

  • 通俗理解旋转位置编码ROPE(二)---注意力机制与ROPE
  • 通俗理解旋转位置编码ROPE(一)---注意力Q加入ROPE
  • (徒手搓LLM)逐行代码解释,从0构造一个LLM——LlaMa篇
2024年4篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家大同玻璃钢广场雕塑米奇米妮玻璃钢雕塑陕西卡通玻璃钢雕塑厂家银川户外玻璃钢雕塑设计广州商场美陈多少钱宁夏景区玻璃钢雕塑订做成品玻璃钢雕塑摆件制造十八罗汉玻璃钢雕塑南京仿石头玻璃钢花盆浙江室内商场美陈厂家直销玻璃钢海洋雕塑大全河南室外不锈钢玻璃钢人物雕塑湖南玻璃钢金属雕塑价格北京中庭商场美陈批发价门头玻璃钢雕塑生产厂家玻璃钢摆件雕塑山羊泰州公园玻璃钢花盆亳州玻璃钢雕塑浮雕厂家新乡不锈钢仿古玻璃钢景观雕塑曲阳千尚玻璃钢雕塑吉首玻璃钢雕塑价格顺义区商场美陈哪家公司好雕塑玻璃钢造型彩绘大象北京玻璃钢花盆销售企业四川玻璃钢雕塑摆件市场浙江装饰商场美陈售价云浮玻璃钢雕塑公司韶关玻璃钢西方人物雕塑深圳玻璃钢景观雕塑造型精美小区玻璃钢雕塑工厂香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化