LlamaIndex 查询本地html文件
除了纯文本、CSV等格式以外,常见的数据格式还包括网页,也就是html文件。网页文件,又可以分为本地文件(预先下载好的,或者本身就存于本地),以及直接通过url地址访问(当前的很多大语言应用,例如腾讯元宝,都支持网页搜索)。这篇文章将介绍,如何使用LlamaIndex加载本地的html文件,并进行解析。
准备工作
在工作目录下,创建文件 example.html,这个文件的内容,来源于我自己的博客(http://www.tracefact.net/tech/122.html)。我只是在浏览器中打开,然后鼠标右键,“查看源代码”,然后保存了下来。
因为这篇文章是中文内容,而对中文进行向量化处理,我们可以从 HuggingFace 上下载特定的embed模型。地址是:https://huggingface.co/BAAI/bge-base-zh-v1.5。该模型是 BGE(BAAI General Embedding) 系列的中等规模版本,专为中文文本嵌入优化, 定位为平衡性能与效率的通用嵌入模型,适用于资源有限但需较高精度的场景。可以通过 git clone https://huggingface.co/BAAI/bge-base-zh-v1.5
将其下载到本地。需要注意的是,因为墙的原因,需要在命令行(例如PowerShell)配置代理,例如:
$env:HTTP_PROXY = "http://127.0.0.1:1080" $env:HTTPS_PROXY = "https://127.0.0.1:1080"
Hugging Face 成立于 2016 年,总部位于美国纽约,被称为 “AI界的Github”。其上托管了数以万计的预训练模型、数据集。
代码实现
在工作目录下,创建文件query_html.py。在下面的代码中,我们使用FlatReader来构建文档,FlatReader通常用来处理纯文本文件,而此处 example.html 是HTML格式的网页。因此,又单独构建了HtmlNodeParser,用来将文档处理为合适的节点。
from pathlib import Path from llama_index.core import DocumentSummaryIndex, VectorStoreIndex, Settings from llama_index.core import node_parser from llama_index.core.node_parser import HTMLNodeParser from llama_index.readers.file import FlatReader from llama_index.embeddings.huggingface import HuggingFaceEmbedding from llama_index.llms.openai import OpenAI import os from dotenv import load_dotenv load_dotenv() # 加载环境变量 print("OPENAI_API_BASE:" + os.getenv("OPENAI_API_BASE")) # 打印API Base Settings.llm = OpenAI(model="gpt-4o") # 配置参数 CONFIG = { "html_path": "./example.html", # 目标HTML文件路径 "query_text": "请总结本文核心观点", # 提问内容 "embed_model": "../models/bge-base-zh-v1.5", # 中文嵌入模型 "chunk_size": 1024, # 文本分块大小 "excluded_tags": ["script", "style"] # 排除的HTML标签 } def load_and_parse_html(): """加载并解析HTML文件""" reader = FlatReader() html_path = Path(CONFIG["html_path"]) file_name = html_path.name print(f"正在加载文件: {file_name}") # 打印正在加载的文件名 documents = reader.load_data(html_path, extra_info={"file_name": file_name}) # 配置HTML解析器 node_parser = HTMLNodeParser( tags = ["article", "p", "h1", "h2", "h3", "h4", "h5", "h6", "li", "td", "th", "div", "span", "a"], # 保留的HTML标签 excluded_tags = CONFIG["excluded_tags"], # 排除的HTML标签 include_metadata = True, # 包含元数据 ) return node_parser, documents def build_query_engin(): """构建查询引擎""" # 设置中文嵌入模型 Settings.embed_model = HuggingFaceEmbedding( model_name=CONFIG["embed_model"], # 嵌入模型名称 normalize=True, # 归一化嵌入向量 ) parser, documents = load_and_parse_html() index = VectorStoreIndex.from_documents( documents, node_parser=parser, # 使用自定义的HTML解析器 show_progress=True, # 显示进度条 chunk_size=CONFIG["chunk_size"], # 文本分块大小 ) return index.as_query_engine( similarity_top_k=3, # 检索前3个最相似的节点 similarity_cutoff = 0.35 # 相似度阈值 ) def execute_query(): """执行查询""" try: query_engine = build_query_engin() response = query_engine.query(CONFIG["query_text"]) print(f"\n---- 问题 ----\n{CONFIG['query_text']}") # 打印问题 print(f"\n---- 回答 ----\n{response.response}") # 打印回答 # if response.source_nodes: # 检查是否有相关节点 # print("\n---- 相关节点 ----") # 打印相关节点 # for node in response.source_nodes: # print(f" 来源文件:{node.metadata.get('file_name', '未知')}") # 打印来源文件 # print(f" 文本内容:{node.text}") # 打印文本内容 # print(f" 匹配分数: {node.score:.2f}") # 打印匹配分数 except Exception as e: # 捕获异常 print(f"发生错误:{e}") # 打印错误信息 if __name__ == "__main__": execute_query() # 执行查询
执行上面的代码,如果一切正常,那么会出现类似下面的结果:
py query_html.py OPENAI_API_BASE:https://api.zhizengzeng.com/v1 正在加载文件: example.html Parsing nodes: 100%|███████████████████████████████████████████| 1/1 [00:00<00:00, 1.14it/s] Generating embeddings: 100%|█████████████████████████████████| 11/11 [00:04<00:00, 2.36it/s] ---- 问题 ---- 请总结本文核心观点 ---- 回答 ---- 本文的核心观点是强调在互联网和知识工作领域,传统的强制管理方式可能导致员工的对抗情绪,而通过激发员工的自驱力和传达工作的意义,可以提高团队的积极性和效率。此外,文章探讨了社会结构的变化,指出技术进步和自动化减少了对劳动力的需求,导致财富和收入的分层现象。通过需求供给理论,文章还分析了就业市场的动态变化,说明岗位数量和薪酬受市场需求和供给的影响。
感谢阅读,希望这篇文章能给你带来帮助!