基于Langchain-RAG实现网页摘要检索工具,通过WebBaseLoader加载网页并分割文档,构建向量存储和检索器。采用两种摘要方法:检索链结合文档链生成问答式摘要,或使用内置摘要链直接总结。需注意通过提示词模板显式控制输出语言,避免默认英文输出。
在之前Langchain-RAG的实战中,我们已梳理完整的RAG流程。今天的目标明确:动手实现一个基于Langchain-RAG的网页摘要检索工具。简单来说,就是让机器帮助“阅读”网页,并提炼核心信息。
日常工作中,我们常需快速获取某个网页的核心信息。但许多网页内容冗长,逐字阅读并不现实。若有一个工具能自动将网页正文的核心内容总结成摘要,效率提升将十分显著。今天就用Langchain将这个功能落地。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
WebBaseLoader是LangChain社区提供的文档加载器,职责是从指定网页URL抓取内容,并解析、清洗、封装为标准Document对象。具体流程分三步:
page_content(文本内容)和metadata(元数据)。web_path:网页地址
bs_kwargs:解析指南
打开目标网页,我们只需正文部分,页头、页脚均不需要。查看网页源码发现,detailContent段正是所需内容。
loader = WebBaseLoader(web_path="https://www.gov.cn/yaowen/liebiao/202603/content_7061810.htm",# bs_kwargs=dict(parse_only=bs4.SoupStrainer(id="UCAP-CONTENT"))# 分割,将网页中目标内容进行分割bs_kwargs={"parse_only":bs4.SoupStrainer(id="UCAP-CONTENT")})docs = loader.load()
#文本切割splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=100)documents = splitter.split_documents(docs)# 实例化向量空间vector_store = Chroma.from_documents(documents=documents,embedding=llm_embeddings)#检索器retriever = vector_store.as_retriever()# 注意prompt模板中包含 {context} 和 {input} 模板#需要使用{context}变量表示上下文,该变量会自动从retriever中获取#而human中限定了变量{input},链必须使用此变量system_prompt = """您是问答任务的助理。使用以下上下文回答问题,上下文:<{context}>如果您不知道答案,不要从其他渠道获取,只说不知道。"""prompt_template = ChatPromptTemplate.from_messages([("system", system_prompt),("human", "{input}")])
# ====================== 方式1:retrieval_chain + documents_chain ======================#创建链,预定义链 create_stuff_documents_chain 文档链documents_chain = create_stuff_documents_chain(client,prompt_template)# 参数1:检索器 参数2:文档链retrieval_chain = create_retrieval_chain(retriever, documents_chain)# 用大模型生成答案resp = retrieval_chain.invoke({"input":"会议说了什么"})print("=========方式1:retrieval_chain + documents_chain==========")print(resp["answer"])
# 定义明确要求中文摘要的提示词模板# 注意:{text} 是占位符,链会自动将文档内容填充prompt_template = """请用中文简洁总结以下文本的主要内容:{text}请确保摘要完全使用中文,并涵盖核心要点。中文摘要:"""prompt = PromptTemplate(template=prompt_template, input_variables=["text"])summarize_chain = load_summarize_chain(llm=client,chain_type="stuff", # 使用stuff策略prompt=prompt)# 执行摘要summary = summarize_chain.invoke(docs)
summary = summarize_chain.invoke(docs)
2. 直接调用且不指定约束时,输出的摘要可能为英文。
summarize_chain = load_summarize_chain(llm=client,chain_type="stuff" # 使用stuff策略)# 执行摘要summary = summarize_chain.invoke(docs)
输入纯中文文档,但通过LangChain的load_summarize_chain处理后,摘要输出却为英文。原因何在?
load_summarize_chain内部默认的Prompt Template要求输入英文。两种方式总结的摘要质量相差不大。方式1较为谨慎,会在摘要末尾声明“仅基于给定上下文得出”。
至此,一个网页内容摘要提取工具已实现。如需提取大量网页内容,可基于此核心功能拓展。当数量级上升后,可限定摘要字数,将网页分类,同类信息汇总至表格,进而进行更深入的数据分析和处理。
github
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述