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級別。