RAG实战3-如何追踪哪些文档片段被用于检索增强生成
RAG实战3-如何追踪哪些文档片段被用于检索增强生成
本文是RAG实战2-如何使用LlamaIndex存储和读取embedding向量的续集,在阅读本文之前请先阅读前篇。
在前篇中,我们介绍了如何使用LlamaIndex存储和读取embedding向量。在本文中,我们将介绍在LlamaIndex中如何获得被用于检索增强生成的文档片段。
下面的代码展示了如何使用LlamaIndex追踪哪些文档片段被用于检索增强生成:
import logging
import sys
import torch
from llama_index.core import PromptTemplate, Settings, StorageContext, load_index_from_storage, QueryBundle
from llama_index.core.schema import MetadataMode
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.huggingface import HuggingFaceLLM
# 定义日志
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
# 定义system prompt
SYSTEM_PROMPT = """You are a helpful AI assistant."""
query_wrapper_prompt = PromptTemplate(
"[INST]<<SYS>>\n" + SYSTEM_PROMPT + "<</SYS>>\n\n{query_str}[/INST] "
)
# 使用llama-index创建本地大模型
llm = HuggingFaceLLM(
context_window=4096,
max_new_tokens=2048,
generate_kwargs={"temperature": 0.0, "do_sample": False},
query_wrapper_prompt=query_wrapper_prompt,
tokenizer_name='/yldm0226/models/Qwen1.5-14B-Chat',
model_name='/yldm0226/models/Qwen1.5-14B-Chat',
device_map="auto",
model_kwargs={"torch_dtype": torch.float16},
)
Settings.llm = llm
# 使用llama-index-embeddings-huggingface构建本地embedding模型
Settings.embed_model = HuggingFaceEmbedding(
model_name="/yldm0226/RAG/BAAI/bge-base-zh-v1.5"
)
# 从存储文件中读取embedding向量和向量索引
storage_context = StorageContext.from_defaults(persist_dir="doc_emb")
index = load_index_from_storage(storage_context)
# 构建查询引擎
query_engine = index.as_query_engine(similarity_top_k=5)
# 获取我们抽取出的相似度前五的片段
contexts = query_engine.retrieve(QueryBundle("不耐疲劳,口燥、咽干可能是哪些证候?"))
print('-'*10 + 'ref' + '-'*10)
for i, context in enumerate(contexts):
print('*'*10 + f'chunk {i} start' + '*'*10)
content = context.node.get_content(metadata_mode=MetadataMode.LLM)
print(content)
print('*' * 10 + f'chunk {i} end' + '*' * 10)
print('-'*10 + 'ref' + '-'*10)
# 查询获得答案
response = query_engine.query("不耐疲劳,口燥、咽干可能是哪些证候?")
print(response)
运行代码,可以得到query的输出为:
从提供的中医临床证候信息来看,口燥、咽干的症状可能与以下证候相关:
1. 津液不足证:由于津液生成不足或者体内燥热导致,表现为口眼喉鼻干燥,咽干是其中的一个症状。
2. 津亏热结证:津液亏虚加上热邪内结,也可能出现口燥和咽干。
3. 津液亏涸证:严重的津液亏损可能导致口唇干燥、咽部干燥,伴随其他严重脱水症状。
4. 燥干清窍证:气候干燥或体质原因引起的津液缺乏,口鼻咽喉干燥也是其特征。
5. 津伤化燥证:燥热内蕴或内热化燥损伤津液,也会出现口燥、频饮但不解渴的现象。
因此,这些证候都有可能与不耐疲劳和口燥、咽干的症状相符合,需要结合其他临床表现来确定具体的证候类型。建议在中医诊断中由专业医生根据全人情况判断。
对于"不耐疲劳,口燥、咽干可能是哪些证候?"这个查询,其相似度前五的片段如下:
片段序号 | 片段信息 |
---|---|
1 | file_path: document/中医临床诊疗术语证候.txt 4.6.1.1 津液不足证 syndrome/pattern of fluid and humor insufficiency 津亏证 因津液生成不足,或嗜食辛辣,蕴热化燥,邪热灼损津液所致。临床以口眼喉鼻及皮肤等干燥,大便干结,小便短少,舌质偏红而干,脉细数等为特征的证候。 4.6.1. |
2 | file_path: document/中医临床诊疗术语证候.txt 临床以口干、舌燥,频饮而不解其渴,食多、善饥,夜尿频多,逐渐消瘦,舌质红,舌苔薄黄或少,脉弦细或滑数,伴见皮肤干燥,四肢乏力,大便干结等为特征的证候。 4.6.3.2 津亏热结证 syndrome/pattern of fluid depletion and heat binding 液干热结证 因津液亏虚,热邪内结所致。 |
3 | file_path: document/中医临床诊疗术语证候.txt 临床以口眼喉鼻及皮肤等干燥,大便干结,小便短少,舌质偏红而干,脉细数等为特征的证候。 4.6.1.2 津液亏涸证 syndrome/pattern of fluid and humor scantiness 津液亏耗证 津液干枯证 因津液亏损,形体官窍失养所致。临床以口干、唇裂,鼻燥无涕,皮肤干瘪,目陷、螺瘪,甚则肌肤甲错,舌质红而少津,舌中裂,脉细或数,可伴见口渴、欲饮,干咳,目涩,大便干,小便少等为特征的证候。 |
4 | file_path: document/中医临床诊疗术语证候.txt 临床以鼻咽干涩或痛,口唇燥干,舌质红,舌苔白或燥,脉浮或微数,伴见发热、无汗,头痛或肢节酸痛等为特征的证候。 3.6.3.2 燥干清窍证 syndrome/pattern of dryness harassing the upper orifices 因气候或环境干燥,津液耗损,清窍失濡所致。临床以口鼻、咽喉干燥,两眼干涩,少泪、少涕、少津、甚则衄血,舌质瘦小、舌苔干而少津,脉细等为特征的证候。 |
5 | file_path: document/中医临床诊疗术语证候.txt 6.3.1 津伤化燥证 syndrome/pattern of fluid damage transforming into dryness 津伤燥热证 因燥热内蕴,或内热化燥,伤津耗液所致。临床以口干、舌燥,频饮而不解其渴,食多、善饥,夜尿频多,逐渐消瘦,舌质红,舌苔薄黄或少,脉弦细或滑数,伴见皮肤干燥,四肢乏力,大便干结等为特征的证候。 4.6.3. |
可以看出,我们得到的query的输出中的证候都是这几个片段中的,大模型也确实根据我们检索出的片段进行了回复。
片段1和片段5的结尾存在多余的章节号,这主要与我们使用的embedding模型和设置的chunk_size
有关。我们可以通过追踪观察这些被用于检索增强生成的文档片段来调整chunk_size
的值,以让embedding模型切分出的片段更合理,提高RAG系统的表现。
如果想追踪更多的检索片段,可以提高similarity_top_k
的值。
如果想追踪片段具体的相似度得分(Similarity Score)的值,可以将log中的level
设置为DEBUG级别。