RAG實戰3-如何追蹤哪些文件片段被用於檢索增強生成

一蓑烟雨度平生發表於2024-03-07

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

相關文章