使用 ElasticSearch 作为知识库,存储向量及相似性搜索

打印 上一主题 下一主题

主题 845|帖子 845|积分 2535

一、ElasticSearch 向量存储及相似性搜索

在当今大数据时代,快速有用地搜索和分析海量数据成为了许多企业和组织的紧张需求。Elasticsearch 作为一款功能强大的分布式搜索和分析引擎,为我们提供了一种优秀的办理方案。除了传统的文本搜索,Elasticsearch 还引入了向量存储的概念,以实现更准确、更高效的相似性搜索。
在 Elasticsearch 中,我们可以将文档或数据转换为数值化向量的方法存入。每个文档被表示为一个向量,其中每个维度对应于文档中的一个特征或属性。这种向量化的表示使得文档之间的相似性计算变得大概。
使用场景:


  • 相似文档搜索:通过将文档转换为向量,并使用向量相似性函数,如 dot product 或 cosine similarity,可以快速找到与查询文档最相似的文档,从而实现准确且高效的相似文档搜索。
  • 推荐系统:将用户和商品等表示为向量,可以根据用户的喜欢和举动,推荐与其兴趣相似的商品。
  • 图像搜索:将图像转换为向量表示,并使用相似性度量,可以在图像库中快速找到与查询图像相似的图像。
下面基于上篇文章使用到的 Chinese-medical-dialogue-data 中文医疗对话数据作为知识内容进行实行。
本篇实行使用 ES 版本为:7.14.0
二、Chinese-medical-dialogue-data 数据集

GitHub 地址如下:
   https://github.com/Toyhom/Chinese-medical-dialogue-data
  数据分了 6 个科目类型:

数据格式如下所示:

其中 ask 为病症的问题描述,answer 为病症的回答。
由于数据较多,本次实行仅使用 IM_内科 数据的前 5000 条数据进行测试。
三、Embedding 模型

Embedding 模型使用开源的 chinese-roberta-wwm-ext-large ,该模型输出为 1024 维。
huggingface 地址:
   https://huggingface.co/hfl/chinese-roberta-wwm-ext-large
  基本使用如下:
  1. from transformers import BertTokenizer, BertModel
  2. import torch
  3. # 模型下载的地址
  4. model_name = 'D:\\AIGC\\model\\chinese-roberta-wwm-ext-large'
  5. def embeddings(docs, max_length=300):
  6.     tokenizer = BertTokenizer.from_pretrained(model_name)
  7.     model = BertModel.from_pretrained(model_name)
  8.     # 对文本进行分词、编码和填充
  9.     input_ids = []
  10.     attention_masks = []
  11.     for doc in docs:
  12.         encoded_dict = tokenizer.encode_plus(
  13.             doc,
  14.             add_special_tokens=True,
  15.             max_length=max_length,
  16.             padding='max_length',
  17.             truncation=True,
  18.             return_attention_mask=True,
  19.             return_tensors='pt'
  20.         )
  21.         input_ids.append(encoded_dict['input_ids'])
  22.         attention_masks.append(encoded_dict['attention_mask'])
  23.     input_ids = torch.cat(input_ids, dim=0)
  24.     attention_masks = torch.cat(attention_masks, dim=0)
  25.     # 前向传播
  26.     with torch.no_grad():
  27.         outputs = model(input_ids, attention_mask=attention_masks)
  28.     # 提取最后一层的CLS向量作为文本表示
  29.     last_hidden_state = outputs.last_hidden_state
  30.     cls_embeddings = last_hidden_state[:, 0, :]
  31.     return cls_embeddings
  32. if __name__ == '__main__':
  33.     res = embeddings(["你好,你叫什么名字"])
  34.     print(res)
  35.     print(len(res))
  36.     print(len(res[0]))
复制代码
运行后可以看到如下日志:

四、ElasticSearch 存储向量

创建向量索引

  1. PUT http://127.0.0.1:9200/medical_index
复制代码
  1. {
  2.     "settings": {
  3.         "number_of_shards": 3,
  4.         "number_of_replicas": 1
  5.     },
  6.     "mappings": {
  7.         "properties": {
  8.             "ask_vector": {  
  9.                 "type": "dense_vector",  
  10.                 "dims": 1024  
  11.             },
  12.                         "ask": {  
  13.                 "type": "text",
  14.                 "analyzer": "ik_max_word",
  15.                 "search_analyzer": "ik_smart"
  16.             },
  17.             "answer": {  
  18.                 "type": "text",
  19.                 "analyzer": "ik_max_word",
  20.                 "search_analyzer": "ik_smart"
  21.             }
  22.         }
  23.     }
  24. }
复制代码
其中 dims 为向量的长度。

查看创建的索引:
  1. GET http://127.0.0.1:9200/medical_index
复制代码

数据存入 ElasticSearch

引入 ElasticSearch 依赖库:
  1. pip install elasticsearch -i https://pypi.tuna.tsinghua.edu.cn/simple
复制代码
  1. from elasticsearch import Elasticsearch
  2. from transformers import BertTokenizer, BertModel
  3. import torch
  4. import pandas as pd
  5. def embeddings_doc(doc, tokenizer, model, max_length=300):
  6.     encoded_dict = tokenizer.encode_plus(
  7.         doc,
  8.         add_special_tokens=True,
  9.         max_length=max_length,
  10.         padding='max_length',
  11.         truncation=True,
  12.         return_attention_mask=True,
  13.         return_tensors='pt'
  14.     )
  15.     input_id = encoded_dict['input_ids']
  16.     attention_mask = encoded_dict['attention_mask']
  17.     # 前向传播
  18.     with torch.no_grad():
  19.         outputs = model(input_id, attention_mask=attention_mask)
  20.     # 提取最后一层的CLS向量作为文本表示
  21.     last_hidden_state = outputs.last_hidden_state
  22.     cls_embeddings = last_hidden_state[:, 0, :]
  23.     return cls_embeddings[0]
  24. def add_doc(index_name, id, embedding_ask, ask, answer, es):
  25.     body = {
  26.         "ask_vector": embedding_ask.tolist(),
  27.         "ask": ask,
  28.         "answer": answer
  29.     }
  30.     result = es.create(index=index_name, id=id, doc_type="_doc", body=body)
  31.     return result
  32. def main():
  33.     # 模型下载的地址
  34.     model_name = 'D:\\AIGC\\model\\chinese-roberta-wwm-ext-large'
  35.     # ES 信息
  36.     es_host = "http://127.0.0.1"
  37.     es_port = 9200
  38.     es_user = "elastic"
  39.     es_password = "elastic"
  40.     index_name = "medical_index"
  41.     # 数据地址
  42.     path = "D:\\AIGC\\dataset\\Chinese-medical-dialogue-data\\Chinese-medical-dialogue-data\\Data_数据\\IM_内科\\内科5000-33000.csv"
  43.     # 分词器和模型
  44.     tokenizer = BertTokenizer.from_pretrained(model_name)
  45.     model = BertModel.from_pretrained(model_name)
  46.     # ES 连接
  47.     es = Elasticsearch(
  48.         [es_host],
  49.         port=es_port,
  50.         http_auth=(es_user, es_password)
  51.     )
  52.     # 读取数据写入ES
  53.     data = pd.read_csv(path, encoding='ANSI')
  54.     for index, row in data.iterrows():
  55.         # 写入前 5000 条进行测试
  56.         if index >= 500:
  57.             break
  58.         ask = row["ask"]
  59.         answer = row["answer"]
  60.         # 文本转向量
  61.         embedding_ask = embeddings_doc(ask, tokenizer, model)
  62.         result = add_doc(index_name, index, embedding_ask, ask, answer, es)
  63.         print(result)
  64. if __name__ == '__main__':
  65.     main()
复制代码

五、相似性搜索

1. 余弦相似度算法:cosineSimilarity

  1. from elasticsearch import Elasticsearch
  2. from transformers import BertTokenizer, BertModel
  3. import torch
  4. def embeddings_doc(doc, tokenizer, model, max_length=300):
  5.     encoded_dict = tokenizer.encode_plus(
  6.         doc,
  7.         add_special_tokens=True,
  8.         max_length=max_length,
  9.         padding='max_length',
  10.         truncation=True,
  11.         return_attention_mask=True,
  12.         return_tensors='pt'
  13.     )
  14.     input_id = encoded_dict['input_ids']
  15.     attention_mask = encoded_dict['attention_mask']
  16.     # 前向传播
  17.     with torch.no_grad():
  18.         outputs = model(input_id, attention_mask=attention_mask)
  19.     # 提取最后一层的CLS向量作为文本表示
  20.     last_hidden_state = outputs.last_hidden_state
  21.     cls_embeddings = last_hidden_state[:, 0, :]
  22.     return cls_embeddings[0]
  23. def search_similar(index_name, query_text, tokenizer, model, es, top_k=3):
  24.     query_embedding = embeddings_doc(query_text, tokenizer, model)
  25.     print(query_embedding.tolist())
  26.     query = {
  27.         "query": {
  28.             "script_score": {
  29.                 "query": {"match_all": {}},
  30.                 "script": {
  31.                     "source": "cosineSimilarity(params.queryVector, 'ask_vector') + 1.0",
  32.                     "lang": "painless",
  33.                     "params": {
  34.                         "queryVector": query_embedding.tolist()
  35.                     }
  36.                 }
  37.             }
  38.         },
  39.         "size": top_k
  40.     }
  41.     res = es.search(index=index_name, body=query)
  42.     hits = res['hits']['hits']
  43.     similar_documents = []
  44.     for hit in hits:
  45.         similar_documents.append(hit['_source'])
  46.     return similar_documents
  47. def main():
  48.     # 模型下载的地址
  49.     model_name = 'D:\\AIGC\\model\\chinese-roberta-wwm-ext-large'
  50.     # ES 信息
  51.     es_host = "http://127.0.0.1"
  52.     es_port = 9200
  53.     es_user = "elastic"
  54.     es_password = "elastic"
  55.     index_name = "medical_index"
  56.     # 分词器和模型
  57.     tokenizer = BertTokenizer.from_pretrained(model_name)
  58.     model = BertModel.from_pretrained(model_name)
  59.     # ES 连接
  60.     es = Elasticsearch(
  61.         [es_host],
  62.         port=es_port,
  63.         http_auth=(es_user, es_password)
  64.     )
  65.     query_text = "我有高血压可以拿党参泡水喝吗"
  66.     similar_documents = search_similar(index_name, query_text, tokenizer, model, es)
  67.     for item in similar_documents:
  68.         print("================================")
  69.         print('ask:', item['ask'])
  70.         print('answer:', item['answer'])
  71. if __name__ == '__main__':
  72.     main()
复制代码
打印日志如下:

   ================================
ask: 我有高血压这两天女婿来的时间给我拿了些党参泡水喝,您好高血压可以吃党参吗?
answer: 高血压病人可以口服党参的。党参有降血脂,降血压的作用,可以彻底消除血液中的垃圾,从而对冠心病以及心血管疾病的患者都有肯定的稳定预防工作作用,因此平常口服党参能阔别三高的危害。别的党参除了益气养血,降低中枢神经作用,调解消化系统功能,健脾补肺的功能。感谢您的进行咨询,盼望我的解释对你有所帮助。
================================
ask: 我准备过两天去看我叔叔,顺便带些人参,但是他有高血压,您好人参高血压可以吃吗?
answer: 人参有肯定的调压作用,重要用来气虚体虚的患者,如果有气血不足,气短乏力,神经衰弱,神经衰弱忘记等不适症状的话,可以得当口服人参调养身体,但是对于高血压的病人,如果恒久食用人参的话,大概会对血压引发肯定影响,所以,比较好到医院中医科实施辨证论治调治,看怎样适合食用人参。
================================
ask: 我妈妈有点高血压,比较近我朋友送了我一些丹参片,我想知道高血压能吃丹参片吗?
answer: 丹参片具备活血化瘀打通血管的作用可以致使血液粘稠度减低,所以就容易致使血管内血液供应便好防止出现血液粘稠,致使血压降落,所以对降血压是有肯定帮助的,高血压患者是常常使用丹参片实施治疗的。可以预防,因为血液粘稠引来的冠心病心绞痛以及外周血管脑水肿症状。
  2. 点积算法:dotProduct

计算给定查询向量和文档向量之间的点积度量。
  1. from elasticsearch import Elasticsearch
  2. from transformers import BertTokenizer, BertModel
  3. import torch
  4. def embeddings_doc(doc, tokenizer, model, max_length=300):
  5.     encoded_dict = tokenizer.encode_plus(
  6.         doc,
  7.         add_special_tokens=True,
  8.         max_length=max_length,
  9.         padding='max_length',
  10.         truncation=True,
  11.         return_attention_mask=True,
  12.         return_tensors='pt'
  13.     )
  14.     input_id = encoded_dict['input_ids']
  15.     attention_mask = encoded_dict['attention_mask']
  16.     # 前向传播
  17.     with torch.no_grad():
  18.         outputs = model(input_id, attention_mask=attention_mask)
  19.     # 提取最后一层的CLS向量作为文本表示
  20.     last_hidden_state = outputs.last_hidden_state
  21.     cls_embeddings = last_hidden_state[:, 0, :]
  22.     return cls_embeddings[0]
  23. def search_similar(index_name, query_text, tokenizer, model, es, top_k=3):
  24.     query_embedding = embeddings_doc(query_text, tokenizer, model)
  25.     print(query_embedding.tolist())
  26.     query = {
  27.         "query": {
  28.             "script_score": {
  29.                 "query": {"match_all": {}},
  30.                 "script": {
  31.                     "source": "dotProduct(params.queryVector, 'ask_vector')+1.0",
  32.                     "lang": "painless",
  33.                     "params": {
  34.                         "queryVector": query_embedding.tolist()
  35.                     }
  36.                 }
  37.             }
  38.         },
  39.         "size": top_k
  40.     }
  41.     res = es.search(index=index_name, body=query)
  42.     hits = res['hits']['hits']
  43.     similar_documents = []
  44.     for hit in hits:
  45.         similar_documents.append(hit['_source'])
  46.     return similar_documents
  47. def main():
  48.     # 模型下载的地址
  49.     model_name = 'D:\\AIGC\\model\\chinese-roberta-wwm-ext-large'
  50.     # ES 信息
  51.     es_host = "http://127.0.0.1"
  52.     es_port = 9200
  53.     es_user = "elastic"
  54.     es_password = "elastic"
  55.     index_name = "medical_index"
  56.     # 分词器和模型
  57.     tokenizer = BertTokenizer.from_pretrained(model_name)
  58.     model = BertModel.from_pretrained(model_name)
  59.     # ES 连接
  60.     es = Elasticsearch(
  61.         [es_host],
  62.         port=es_port,
  63.         http_auth=(es_user, es_password)
  64.     )
  65.     query_text = "我有高血压可以拿党参泡水喝吗"
  66.     similar_documents = search_similar(index_name, query_text, tokenizer, model, es)
  67.     for item in similar_documents:
  68.         print("================================")
  69.         print('ask:', item['ask'])
  70.         print('answer:', item['answer'])
  71. if __name__ == '__main__':
  72.     main()
复制代码

   ================================
ask: 我有高血压这两天女婿来的时间给我拿了些党参泡水喝,您好高血压可以吃党参吗?
answer: 高血压病人可以口服党参的。党参有降血脂,降血压的作用,可以彻底消除血液中的垃圾,从而对冠心病以及心血管疾病的患者都有肯定的稳定预防工作作用,因此平常口服党参能阔别三高的危害。别的党参除了益气养血,降低中枢神经作用,调解消化系统功能,健脾补肺的功能。感谢您的进行咨询,盼望我的解释对你有所帮助。
================================
ask: 我准备过两天去看我叔叔,顺便带些人参,但是他有高血压,您好人参高血压可以吃吗?
answer: 人参有肯定的调压作用,重要用来气虚体虚的患者,如果有气血不足,气短乏力,神经衰弱,神经衰弱忘记等不适症状的话,可以得当口服人参调养身体,但是对于高血压的病人,如果恒久食用人参的话,大概会对血压引发肯定影响,所以,比较好到医院中医科实施辨证论治调治,看怎样适合食用人参。
================================
ask: 我妈妈有点高血压,比较近我朋友送了我一些丹参片,我想知道高血压能吃丹参片吗?
answer: 丹参片具备活血化瘀打通血管的作用可以致使血液粘稠度减低,所以就容易致使血管内血液供应便好防止出现血液粘稠,致使血压降落,所以对降血压是有肯定帮助的,高血压患者是常常使用丹参片实施治疗的。可以预防,因为血液粘稠引来的冠心病心绞痛以及外周血管脑水肿症状。
  3. L1曼哈顿隔断:l1norm

计算给定查询向量和文档向量之间的L1隔断。
  1. from elasticsearch import Elasticsearch
  2. from transformers import BertTokenizer, BertModel
  3. import torch
  4. def embeddings_doc(doc, tokenizer, model, max_length=300):
  5.     encoded_dict = tokenizer.encode_plus(
  6.         doc,
  7.         add_special_tokens=True,
  8.         max_length=max_length,
  9.         padding='max_length',
  10.         truncation=True,
  11.         return_attention_mask=True,
  12.         return_tensors='pt'
  13.     )
  14.     input_id = encoded_dict['input_ids']
  15.     attention_mask = encoded_dict['attention_mask']
  16.     # 前向传播
  17.     with torch.no_grad():
  18.         outputs = model(input_id, attention_mask=attention_mask)
  19.     # 提取最后一层的CLS向量作为文本表示
  20.     last_hidden_state = outputs.last_hidden_state
  21.     cls_embeddings = last_hidden_state[:, 0, :]
  22.     return cls_embeddings[0]
  23. def search_similar(index_name, query_text, tokenizer, model, es, top_k=3):
  24.     query_embedding = embeddings_doc(query_text, tokenizer, model)
  25.     print(query_embedding.tolist())
  26.     query = {
  27.         "query": {
  28.             "script_score": {
  29.                 "query": {"match_all": {}},
  30.                 "script": {
  31.                     "source": "1 / (1 + l1norm(params.queryVector, doc['ask_vector']))",
  32.                     "lang": "painless",
  33.                     "params": {
  34.                         "queryVector": query_embedding.tolist()
  35.                     }
  36.                 }
  37.             }
  38.         },
  39.         "size": top_k
  40.     }
  41.     res = es.search(index=index_name, body=query)
  42.     hits = res['hits']['hits']
  43.     similar_documents = []
  44.     for hit in hits:
  45.         similar_documents.append(hit['_source'])
  46.     return similar_documents
  47. def main():
  48.     # 模型下载的地址
  49.     model_name = 'D:\\AIGC\\model\\chinese-roberta-wwm-ext-large'
  50.     # ES 信息
  51.     es_host = "http://127.0.0.1"
  52.     es_port = 9200
  53.     es_user = "elastic"
  54.     es_password = "elastic"
  55.     index_name = "medical_index"
  56.     # 分词器和模型
  57.     tokenizer = BertTokenizer.from_pretrained(model_name)
  58.     model = BertModel.from_pretrained(model_name)
  59.     # ES 连接
  60.     es = Elasticsearch(
  61.         [es_host],
  62.         port=es_port,
  63.         http_auth=(es_user, es_password)
  64.     )
  65.     query_text = "我有高血压可以拿党参泡水喝吗"
  66.     similar_documents = search_similar(index_name, query_text, tokenizer, model, es)
  67.     for item in similar_documents:
  68.         print("================================")
  69.         print('ask:', item['ask'])
  70.         print('answer:', item['answer'])
  71. if __name__ == '__main__':
  72.     main()
复制代码

   ================================
ask: 我有高血压这两天女婿来的时间给我拿了些党参泡水喝,您好高血压可以吃党参吗?
answer: 高血压病人可以口服党参的。党参有降血脂,降血压的作用,可以彻底消除血液中的垃圾,从而对冠心病以及心血管疾病的患者都有肯定的稳定预防工作作用,因此平常口服党参能阔别三高的危害。别的党参除了益气养血,降低中枢神经作用,调解消化系统功能,健脾补肺的功能。感谢您的进行咨询,盼望我的解释对你有所帮助。
================================
ask: 我准备过两天去看我叔叔,顺便带些人参,但是他有高血压,您好人参高血压可以吃吗?
answer: 人参有肯定的调压作用,重要用来气虚体虚的患者,如果有气血不足,气短乏力,神经衰弱,神经衰弱忘记等不适症状的话,可以得当口服人参调养身体,但是对于高血压的病人,如果恒久食用人参的话,大概会对血压引发肯定影响,所以,比较好到医院中医科实施辨证论治调治,看怎样适合食用人参。
================================
ask: 我妈妈有点高血压,比较近我朋友送了我一些丹参片,我想知道高血压能吃丹参片吗?
answer: 丹参片具备活血化瘀打通血管的作用可以致使血液粘稠度减低,所以就容易致使血管内血液供应便好防止出现血液粘稠,致使血压降落,所以对降血压是有肯定帮助的,高血压患者是常常使用丹参片实施治疗的。可以预防,因为血液粘稠引来的冠心病心绞痛以及外周血管脑水肿症状。
  4. l2 欧几里得隔断:l2norm

计算给定查询向量和文档向量之间的欧几里德隔断。
  1. from elasticsearch import Elasticsearch
  2. from transformers import BertTokenizer, BertModel
  3. import torch
  4. def embeddings_doc(doc, tokenizer, model, max_length=300):
  5.     encoded_dict = tokenizer.encode_plus(
  6.         doc,
  7.         add_special_tokens=True,
  8.         max_length=max_length,
  9.         padding='max_length',
  10.         truncation=True,
  11.         return_attention_mask=True,
  12.         return_tensors='pt'
  13.     )
  14.     input_id = encoded_dict['input_ids']
  15.     attention_mask = encoded_dict['attention_mask']
  16.     # 前向传播
  17.     with torch.no_grad():
  18.         outputs = model(input_id, attention_mask=attention_mask)
  19.     # 提取最后一层的CLS向量作为文本表示
  20.     last_hidden_state = outputs.last_hidden_state
  21.     cls_embeddings = last_hidden_state[:, 0, :]
  22.     return cls_embeddings[0]
  23. def search_similar(index_name, query_text, tokenizer, model, es, top_k=3):
  24.     query_embedding = embeddings_doc(query_text, tokenizer, model)
  25.     print(query_embedding.tolist())
  26.     query = {
  27.         "query": {
  28.             "script_score": {
  29.                 "query": {"match_all": {}},
  30.                 "script": {
  31.                     "source": "1 / (1 + l2norm(params.queryVector, doc['ask_vector']))",
  32.                     "lang": "painless",
  33.                     "params": {
  34.                         "queryVector": query_embedding.tolist()
  35.                     }
  36.                 }
  37.             }
  38.         },
  39.         "size": top_k
  40.     }
  41.     res = es.search(index=index_name, body=query)
  42.     hits = res['hits']['hits']
  43.     similar_documents = []
  44.     for hit in hits:
  45.         similar_documents.append(hit['_source'])
  46.     return similar_documents
  47. def main():
  48.     # 模型下载的地址
  49.     model_name = 'D:\\AIGC\\model\\chinese-roberta-wwm-ext-large'
  50.     # ES 信息
  51.     es_host = "http://127.0.0.1"
  52.     es_port = 9200
  53.     es_user = "elastic"
  54.     es_password = "elastic"
  55.     index_name = "medical_index"
  56.     # 分词器和模型
  57.     tokenizer = BertTokenizer.from_pretrained(model_name)
  58.     model = BertModel.from_pretrained(model_name)
  59.     # ES 连接
  60.     es = Elasticsearch(
  61.         [es_host],
  62.         port=es_port,
  63.         http_auth=(es_user, es_password)
  64.     )
  65.     query_text = "我有高血压可以拿党参泡水喝吗"
  66.     similar_documents = search_similar(index_name, query_text, tokenizer, model, es)
  67.     for item in similar_documents:
  68.         print("================================")
  69.         print('ask:', item['ask'])
  70.         print('answer:', item['answer'])
  71. if __name__ == '__main__':
  72.     main()
复制代码

   ================================
ask: 我有高血压这两天女婿来的时间给我拿了些党参泡水喝,您好高血压可以吃党参吗?
answer: 高血压病人可以口服党参的。党参有降血脂,降血压的作用,可以彻底消除血液中的垃圾,从而对冠心病以及心血管疾病的患者都有肯定的稳定预防工作作用,因此平常口服党参能阔别三高的危害。别的党参除了益气养血,降低中枢神经作用,调解消化系统功能,健脾补肺的功能。感谢您的进行咨询,盼望我的解释对你有所帮助。
================================
ask: 我准备过两天去看我叔叔,顺便带些人参,但是他有高血压,您好人参高血压可以吃吗?
answer: 人参有肯定的调压作用,重要用来气虚体虚的患者,如果有气血不足,气短乏力,神经衰弱,神经衰弱忘记等不适症状的话,可以得当口服人参调养身体,但是对于高血压的病人,如果恒久食用人参的话,大概会对血压引发肯定影响,所以,比较好到医院中医科实施辨证论治调治,看怎样适合食用人参。
================================
ask: 我妈妈有点高血压,比较近我朋友送了我一些丹参片,我想知道高血压能吃丹参片吗?
answer: 丹参片具备活血化瘀打通血管的作用可以致使血液粘稠度减低,所以就容易致使血管内血液供应便好防止出现血液粘稠,致使血压降落,所以对降血压是有肯定帮助的,高血压患者是常常使用丹参片实施治疗的。可以预防,因为血液粘稠引来的冠心病心绞痛以及外周血管脑水肿症状。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

卖不甜枣

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表