






















此篇的学习笔记来自于B站强哥学编程,记录了关键的代码片段和知识整理,方便后续对相应知识点的复习,这一篇是RAG的关键LangChain代码。
RAG是一种结合了检索和生成的AI技术,通过从外部知识库检索相关信息,增强大语言模型的生成能力,从而提供更准确、更相关的回答。
此篇使用的LangChain版本是1.x,于2026年4月。
from langchain_community.document_loaders import WebBaseLoader
import bs4
page_url = "https://news.cctv.com/2025/08/07/ARTIwHXTjBUTWQHIhY3pmv7Z250807.shtml"
bs4_strainer = bs4.SoupStrainer()
loader = WebBaseLoader(
web_paths=(page_url, ),
bs_kwargs={"parse_only": bs4_strainer}
)
docs = loader.load()
WebBaseLoader加载网页内容List[Document]类型,每个Document包含页面内容和元数据from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, # 每个文本段的字符数
chunk_overlap=200, # 文本段之间的重叠字符数
add_start_index=True # 添加起始索引
)
all_splits = text_splitter.split_documents(docs)
RecursiveCharacterTextSplitter将长文本分割成较短的文本段,分段的长度和重叠长度都在这里指定from langchain_ollama import OllamaEmbeddings
embedding = OllamaEmbeddings(model="nomic-embed-text")
OllamaEmbeddings将文本转换为向量,也就是向量模型使用的是本地Ollama部署的nomic-embed-text模型作为嵌入模型向量模型通常比常见大模型小很多,将其分离开来也可以有效的降低成本。
from langchain_chroma import Chroma
vector_store = Chroma(
collection_name="rag_collection",
embedding_function=embedding,
persist_directory="./chroma_rag_db"
)
ids = vector_store.add_documents(documents=all_splits)
Chroma作为向量数据库,所以这里import的是Chroma的模块Note: add_documents是不会对库里已有内容进行排重的,排重需要自己额外的写代码处理。
from langchain_ollama import OllamaEmbeddings
from langchain_chroma import Chroma
embedding = OllamaEmbeddings(model="nomic-embed-text")
vector_store = Chroma(
collection_name="rag_collection",
embedding_function=embedding,
persist_directory="./chroma_rag_db"
)
from langchain.tools import tool
@tool(response_format="content_and_artifact")
def retrieve_context(query: str):
"""Retrieve information to help answer a query"""
retrieved_docs = vector_store.similarity_search(query, k=2)
content = '\n\n'.join(
(f"Source:{doc.metadata}\nContent:{doc.page_content}") for doc in retrieved_docs
)
return content, retrieved_docs
@tool装饰器定义了一个检索工具similarity_search方法根据查询向量检索最相似的文档from langchain.agents import create_agent
system_prompt = """
你可以使用信息检索工具,回答用户的问题
"""
agent = create_agent(
model="deepseek:deepseek-chat",
tools=[retrieve_context],
system_prompt=system_prompt
)
results = agent.invoke(
{"messages":[{"role": "user", "content": "讲一下 3i/Atlas"}]}
)
deepseek:deepseek-chat模型,这是调用的Deepseek API,需要付费去购买,这里也可以替换成本地的ollama里部署的模型nomic-embed-text模型,这是一个专门用于文本嵌入的模型Chroma作为向量数据库,它是一个轻量级的开源向量存储similarity_search方法,基于余弦相似度进行检索k=2,即返回最相似的2个文档create_agent创建了一个能够使用工具的AgentRAG技术通过结合检索和生成,有效地解决了大语言模型知识 cutoff 和幻觉问题。本学习笔记基于两个示例代码,详细介绍了RAG的索引和查询流程,包括文档加载、文本分割、向量化、向量存储以及基于Agent的查询实现。通过合理配置参数和选择合适的模型,可以构建一个高效、准确的RAG系统。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。