•RAG 流程回顾,
•语句窗口检索(SWR)的概念,
•SWR 详细实现,
•如何优化和评估SWR
如果你只是为了了解一下概念,那么读到这里就可以了,后面是实现程序和评估演示。
下面演示如何使用和评估语句窗口检索。
获取和解析文档,和之前一样的步骤:
importwarnings
warnings.filterwarnings('ignore')
importutils
importos
importopenai
openai.api_key=utils.get_openai_api_key()
fromllama_indeximportSimpleDirectoryReader
documents=SimpleDirectoryReader(
input_files=["./eBook-How-to-Build-a-Career-in-AI.pdf"]
).load_data()把文件合并成一个文档对象方便我们处理:
fromllama_indeximportDocument
document=Document(text="\n\n".join([doc.textfordocindocuments]))创建一个支持 SentenceWindow 的 NodeParser 节点处理器(窗口大小我们默认为3):
fromllama_index.node_parserimportSentenceWindowNodeParser
#createthesentencewindownodeparserw/defaultsettings
node_parser=SentenceWindowNodeParser.from_defaults(
window_size=3,
window_metadata_key="window",
original_text_metadata_key="original_text",
)用标准方法ServiceContext.from_defaults构建Context,传入我们上一步创建的node_parser。
fromllama_index.llmsimportOpenAI
llm=OpenAI(model="gpt-3.5-turbo",temperature=0.1)
fromllama_indeximportServiceContext
sentence_context=ServiceContext.from_defaults(
llm=llm,
embed_model="local:BAAI/bge-small-en-v1.5",
#embed_model="local:BAAI/bge-large-en-v1.5"
node_parser=node_parser,
)使用过 VectorStoreIndex 构建 Index,
fromllama_indeximportVectorStoreIndex
sentence_index=VectorStoreIndex.from_documents(
[document],service_context=sentence_context
)持久化到磁盘,这里我们指定当前相对目录(后续可以从该目录恢复,就不用重复前面的流程了)。
sentence_index.storage_context.persist(persist_dir="./sentence_index")
fromllama_index.indices.postprocessorimportMetadataReplacementPostProcessor
postproc=MetadataReplacementPostProcessor(
target_metadata_key="window"
)fromllama_index.schemaimportNodeWithScore
fromcopyimportdeepcopy
scored_nodes=[NodeWithScore(node=x,score=1.0)forxinnodes]
nodes_old=[deepcopy(n)forninnodes]使用 PostProcess 处理原来的节点。
replaced_nodes=postproc.postprocess_nodes(scored_nodes)
fromllama_index.indices.postprocessorimportSentenceTransformerRerank
rerank=SentenceTransformerRerank(
top_n=2,model="BAAI/bge-reranker-base"
)sentence_window_engine=sentence_index.as_query_engine(
similarity_top_k=6,node_postprocessors=[postproc,rerank]
)window_response=sentence_window_engine.query(
"在人工智能领域建立职业生涯的关键是什么?"
)最终回应:在人工智能领域建立职业生涯的关键包括学习基础技术技能、
参与项目、找到工作以及成为支持性社区的一部分。使用使用同样的方法进行评估,同样是构建问题列表,评估两步。
eval_questions=[]
withopen('generated_questions.text','r')asfile:
forlineinfile:
#Removenewlinecharacterandconverttointeger
item=line.strip()
eval_questions.append(item)
fromtrulens_evalimportTru
defrun_evals(eval_questions,tru_recorder,query_engine):
forquestionineval_questions:
withtru_recorderasrecording:
response=query_engine.query(question)下面比较下不同参数下 SWR 的性能如何。
创建窗口大小为 1 的 index:
sentence_index_1=build_sentence_window_index(
documents,
llm=OpenAI(model="gpt-3.5-turbo",temperature=0.1),
embed_model="local:BAAI/bge-small-en-v1.5",
sentence_window_size=1,
save_dir="sentence_index_1",
)
sentence_window_engine_1=get_sentence_window_query_engine(
sentence_index_1
)
tru_recorder_1=get_prebuilt_trulens_recorder(
sentence_window_engine_1,
app_id='sentencewindowengine1'
)创建窗口大小为 3 的 index:
sentence_index_3=build_sentence_window_index(
documents,
llm=OpenAI(model="gpt-3.5-turbo",temperature=0.1),
embed_model="local:BAAI/bge-small-en-v1.5",
sentence_window_size=3,
save_dir="sentence_index_3",
)
sentence_window_engine_3=get_sentence_window_query_engine(
sentence_index_3
)
tru_recorder_3=get_prebuilt_trulens_recorder(
sentence_window_engine_3,
app_id='sentencewindowengine3'
)查看对比:
可以看到窗口大小为 3 的时候,评估效果的三个指标都表现很好。
实际的开发过程中,我们也是需要一次次调整参数,进行评估对比,找出最优的 RAG 方法和参数。
--- END ---
| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |