手搓一个完整的RAG+Langchain(爬虫版)
·
用 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生成答案。
更多推荐
所有评论(0)