用 LangChain 自带的 WebBaseLoader

LangChain(>=0.0.x)中提供了一个 WebBaseLoader,它能自动请求网页并提取正文文本(去掉 HTML 标签),返回一个或多个 Document。
 

from langchain.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
import os
from dotenv import load_dotenv

load_dotenv()

### 1. 用 WebBaseLoader 抓取网页
# 假设我们想检索一个或多个网页,例如:
urls = [
    "https://zh.wikipedia.org/wiki/Transformer",
    "https://juejin.cn/post/xxxxxx",  # 示例:掘金上的一篇文章
    # … 还可以加更多页面
]

# WebBaseLoader 会把每个 URL 的正文提取成一个或多个 Document
loader = WebBaseLoader(urls)
docs_from_web = loader.load()   # 这是一个 List[Document],每个 Document.page_content 是纯文本

### 2. 文档切分
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=200,
    chunk_overlap=100,
    length_function=len,
    add_start_index=True,
)

paragraphs = []
for doc in docs_from_web:
    # doc.page_content 是整个网页正文字符串
    paragraphs.extend(text_splitter.create_documents([doc.page_content]))

### 3. 嵌入模型
embeddings_model = OpenAIEmbeddings(
    model="text-embedding-3-small",
    openai_api_key=os.getenv("OPENAI_API_KEY"),
    openai_api_base="https://abc"
)

### 4. 向量数据库(Chroma)
db = Chroma.from_documents(paragraphs, embeddings_model)

### 5. 设置检索器
retriever = db.as_retriever(
    search_type="similarity_score_threshold",
    search_kwargs={"score_threshold": 0.5}
)

### 6. 构造 LLM 和 Prompt
llm = ChatOpenAI(
    model_name="gpt-3.5-turbo",
    openai_api_key=os.getenv("OPENAI_API_KEY"),
    openai_api_base="https://abc"
)

prompt_template = """
你是一个问答机器人。
你的任务是根据下述给定的已知信息回答用户问题。
确保你的回复完全依据下述已知信息。不要编造答案。
如果下述已知信息不足以回答用户的问题,请直接回复"我无法回答您的问题"。

已知信息:
{info}

用户问:
{question}

请用中文回答用户问题。
"""
from langchain.prompts import PromptTemplate
template = PromptTemplate.from_template(prompt_template)

### 7. 查询示例
query = "Transformer 中如何降低 Feedforward 层的参数量?"
docs = retriever.invoke(query)   # 得到若干个 Document

# 这里为了示例,只取召回列表中的第 1 条做 prompt
info_str = docs[0].page_content
prompt = template.format(info=info_str, question=query)

response = llm.invoke(prompt)
print(response.content)

说明:

  • WebBaseLoader(urls) 会把每个 URL 当作一个 Document,自动下载并提取正文。

  • 后面和你原来加载 PDF 的流程一模一样:text_splitter 切块、OpenAIEmbeddings 编码、Chroma.from_documents 存储向量、as_retriever 拉取相关文章、再用 ChatOpenAI 生成答案。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐