LangChain RAG入门教程:构建基于私有文档的智能问答助手

本文详述了如何通过检索增强生成(RAG)技术构建一个能够利用特定文档集合回答问题的AI系统。通过LangChain框架,可以实现超越预训练模型知识范围的定制化问答能力,适用于专业领域的精准信息检索与生成。

img

RAG技术概述及其重要性

在深入技术实现前,需要理解RAG技术的核心价值。传统语言模型如GPT-4尽管功能强大,但其知识库受限于训练数据,无法有效访问新增信息或特定领域文档。

RAG技术通过融合两个关键功能模块解决了这一局限:

  1. 检索系统:从文档集合中精确定位相关信息
  2. 生成机制:基于检索到的上下文信息生成准确、相关的响应

这种结构设计的优势在于能够构建一个基于特定知识库的AI问答系统,有效降低了幻觉(hallucination)现象,显著提升了回答的事实准确性。

LangChain框架:RAG系统的技术基础

LangChain已成为RAG应用开发的主流框架,其提供了构建完整RAG系统所需的全部核心组件:

  • 多格式文档加载器,支持各类文件类型的处理
  • 文本分割器,用于将文档切分为可处理的数据块
  • 向量存储系统,提供高效的内容索引功能
  • 文本嵌入模型,实现文本到向量的转换
  • 检索机制,用于查找相关信息
  • 链式处理流程,协调整个系统的运行逻辑

凭借这些组件的整合,LangChain极大地简化了RAG系统的构建复杂度,使得即使对AI开发经验有限的开发者也能实现功能完备的RAG应用。

Python代码

1、环境配置与基础设置

首先需要安装必要的库包,包括LangChain核心、社区扩展、向量数据库(FAISS)以及语言模型处理工具:

# filepath: example.py
# 安装所需的库
!pipinstalllangchainlangchain-communityfaiss-cpusentence-transformerstransformers

接下来导入系统所需的各个组件:

# filepath: example.py
# 核心 LangChain 组件
fromlangchain.llmsimportHuggingFacePipeline
fromlangchain.chainsimportRetrievalQA, LLMChain
fromlangchain.chains.question_answeringimportload_qa_chain
fromlangchain.promptsimportPromptTemplate

# LangChain 社区组件
fromlangchain_community.vectorstoresimportFAISS
fromlangchain_community.document_loadersimportTextLoader
fromlangchain_community.embeddingsimportHuggingFaceEmbeddings

# Hugging Face 组件
fromtransformersimportpipeline

# 标准库
importos
importurllib.request
importzipfile

2、知识库构建

RAG系统的基础是高质量的知识库。本实现中,我们使用一个包含亚洲各目的地信息的数据集作为示例:

# filepath: example.py
# 下载并提取我们的示例数据集
zip_url="https://github.com/gakudo-ai/open-datasets/raw/refs/heads/main/asia_documents.zip"
zip_path="asia_documents.zip"
extract_folder="asia_txt_files"

print("Downloading sample documents...")  # 正在下载示例文档...
urllib.request.urlretrieve(zip_url, zip_path)

print("Extracting files...")  # 正在提取文件...
os.makedirs(extract_folder, exist_ok=True)
withzipfile.ZipFile(zip_path, "r") aszip_ref:
    zip_ref.extractall(extract_folder)

print(f"Successfully extracted {len(os.listdir(extract_folder))} documents to {extract_folder}")  # 成功提取 {len(os.listdir(extract_folder))} 个文档到 {extract_folder}

3、文档处理与分块策略

RAG系统的关键步骤是文档的处理与分块。这一阶段包括:

  1. 文档加载
  2. 将文档分割为适当大小的块
  3. 为每个文本块生成向量表示
# filepath: example.py
# 从文件夹加载所有文本文件
documents= []
forfilenameinos.listdir(extract_folder):
    iffilename.endswith(".txt"):
        file_path=os.path.join(extract_folder, filename)
        loader=TextLoader(file_path)
        documents.extend(loader.load())

print(f"Loaded {len(documents)} documents")  # 加载了 {len(documents)} 个文档

# 将文档拆分成更小的块,以便更好地检索
fromlangchain.text_splitterimportCharacterTextSplitter

text_splitter=CharacterTextSplitter(
    chunk_size=500,  # 每个块的字符数
    chunk_overlap=100  # 块之间的重叠以保持上下文
)
docs=text_splitter.split_documents(documents)

print(f"Created {len(docs)} document chunks")  # 创建了 {len(docs)} 个文档块

4、向量数据库构建

RAG系统的核心是向量数据库,它实现了基于语义的高效搜索。本实现采用FAISS作为向量存储引擎,结合句子转换模型构建嵌入表示:

# filepath: example.py
# 初始化嵌入模型
embedding_model=HuggingFaceEmbeddings(
    model_name="sentence-transformers/all-MiniLM-L6-v2"  # 速度和质量的良好平衡
)

# 从我们的文档块创建一个向量存储
vectorstore=FAISS.from_documents(docs, embedding_model)

# 创建一个检索器接口

retriever=vectorstore.as_retriever(
    search_kwargs={"k": 3}  # 检索前 3 个最相关的块
)

print("Vector database created successfully!")  # 向量数据库创建成功!

5、语言模型配置

本实现使用GPT2作为基础模型,但实际应用中可替换为更高性能的模型如Llama-2或Mistral:

# filepath: example.py
# 使用 Hugging Face 模型创建一个文本生成管道
llm_pipeline=pipeline(
    "text-generation",
    model="gpt2",  # 你可以用其他模型替换它,例如 "mistralai/Mistral-7B-v0.1"
    device=0if"cuda"in [str(x) forxinpipeline.available_devices] else-1,  # 如果可用,则使用 GPU
    max_new_tokens=200  # 控制响应长度
)

# 将管道包装在 LangChain 的接口中
llm=HuggingFacePipeline(pipeline=llm_pipeline)

print("Language model loaded successfully!")  # 语言模型加载成功!

6、提示模板设计

RAG系统的输出质量很大程度上取决于提示模板的设计。以下是针对问答任务的专业提示模板:

# filepath: example.py
# 定义一个用于问答的提示模板
prompt_template="""
Answer the question based only on the following context:

Context:
{context}

Question: {query}

Helpful Answer:"""

prompt=PromptTemplate(
    input_variables=["query", "context"],
    template=prompt_template
)

print("Prompt template created!")  # 提示模板已创建!

7、RAG流程集成

将所有组件连接起来,构建完整的RAG处理流程:

# filepath: example.py
# 创建一个结合了检索器和语言模型的链
retrieval_qa=RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",  # "stuff" 只是将所有检索到的文档放入提示中
    retriever=retriever,
    return_source_documents=True,  # 在响应中包含源文档
    chain_type_kwargs={"prompt": prompt}  # 使用我们的自定义提示
)

print("RAG pipeline assembled and ready to use!")  # RAG 管道已组装好并可以使用!

8、系统测试与应用

通过针对亚洲主题的问题测试RAG系统的表现:

# filepath: example.py
# 帮助清晰显示响应的函数
defask_question(question):
    print(f"Question: {question}\n")

    # 从我们的 RAG 系统获取响应
    result=retrieval_qa({"query": question})

    print("Answer:")  # 回答:
    print(result["result"])

    print("\nSources:")  # 来源:
    fori, docinenumerate(result["source_documents"]):
        print(f"Source {i+1}: {doc.metadata.get('source', 'Unknown')}")  # 来源 {i+1}: {doc.metadata.get('source', 'Unknown')}

    print("\n"+"-"*50+"\n")

# 尝试一些问题
ask_question("What are some popular dishes in Japanese cuisine?")
ask_question("What is Vietnam known for?")
ask_question("Which countries in Asia are worth visiting?")

基础系统已经完成了,我们还可以在多方面进行优化空间

系统优化策略

1、高性能语言模型应用

虽然GPT-2适用于演示目的,但在生产环境中应考虑使用更强大的模型以提升响应质量:

# filepath: example.py
# 使用更强大的模型的示例
llm_pipeline=pipeline(
    "text-generation",
    model="mistralai/Mistral-7B-v0.1",  # 更强大的开源模型
    device=0,
    max_new_tokens=300
)

2、检索策略优化

可通过多种技术优化默认的相似性搜索机制:

# filepath: example.py
# 创建一个带有 MMR(最大边际相关性)的检索器
# 这有助于确保检索到的文档的多样性
retriever=vectorstore.as_retriever(
    search_type="mmr",
    search_kwargs={"k": 5, "fetch_k": 10, "lambda_mult": 0.5}
)

# 或者尝试混合搜索(结合语义和关键词搜索)
fromlangchain.retrieversimportContextualCompressionRetriever
fromlangchain.retrievers.document_compressorsimportLLMChainExtractor

# 创建一个压缩器,仅提取文档的相关部分
compressor=LLMChainExtractor.from_llm(llm)

# 创建一个压缩检索器
compression_retriever=ContextualCompressionRetriever(
    base_retriever=retriever,
    base_compressor=compressor
)

3、文档分块策略优化

文档分块方式对检索质量有重大影响:

# filepath: example.py
# 尝试不同的分块策略
fromlangchain.text_splitterimportRecursiveCharacterTextSplitter

text_splitter=RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200,
    separators=["\n\n", "\n", ". ", " ", ""]  # 尝试在段落/句子边界处分割
)

常见问题及解决方案

1、检索质量问题

当系统检索到不相关信息时,可采取以下措施:

  • 使用更高质量的嵌入模型,如all-mpnet-base-v2替代all-MiniLM-L6-v2
  • 调整文本块大小和重叠参数
  • 增加检索文档数量
  • 实现检索结果的重排序机制

2、响应质量问题

当系统响应不准确或偏离主题时:

  • 应用更强大的语言模型
  • 优化提示模板中的指令表述
  • 尝试不同的链式策略,如使用refine替代stuff
  • 在提示中加入示例以实现少样本学习

3、性能效率问题

当系统响应速度较慢时:

  • 使用更轻量级的嵌入模型
  • 减小文本块大小和检索文档数量
  • 对语言模型进行量化处理(4位或8位精度)
  • 采用更高效的向量存储解决方案,如Chroma或Qdrant

总结

通过本文所述方法,已成功构建了一个能够基于特定文档集合回答问题的完整RAG系统。尽管示例使用了有关亚洲目的地的小型数据集,但同样的技术架构适用于任何规模的文档集合。

RAG技术的后续发展可考虑以下方向:

  1. 规模扩展:应用于更大规模的专业文档集合
  2. 模型优化:测试不同的嵌入模型和语言模型组合
  3. 功能增强:实现引用追踪、来源验证或多步骤推理
  4. 部署优化:从本地测试环境转向生产级部署

检索增强生成技术代表了当前AI应用的一个最具实用价值的方向,它使开发者能够创建将大型语言模型的通用能力与特定领域知识相结合的系统。通过构建这样的基础系统,已为更复杂的AI应用奠定了技术基础,这些应用将能够深度理解并有效利用专业领域的知识资源。

如何零基础入门 / 学习AI大模型?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高

那么我作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,希望可以帮助到更多学习大模型的人!至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

👉 福利来袭优快云大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈

全套AGI大模型学习大纲+路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

read-normal-img

640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈
基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉 福利来袭优快云大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈

img

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

### 构建RAG系统初学者指南 #### 定义RAG系统 检索增强生成(Retrieval-Augmented Generation, RAG)是一种结合了密集向量索引和自然语言处理模型的技术,用于提高文本生成的质量和准确性。通过利用外部知识库中的信息来补充训练数据集的信息不足之处。 #### 准备工作环境 为了从头开始创建一个简单的RAG系统,首先需要安装必要的软件包并设置开发环境。对于Python用户来说,可以依赖Hugging Face Transformers库以及Faiss或其他相似的矢量化搜索引擎来进行实现[^2]。 ```bash pip install transformers faiss-cpu datasets torch ``` #### 数据收集与预处理 构建有效的RAG应用之前,获取高质量的数据源至关重要。这些资源可能包括但不限于网页抓取的内容、百科全书条目或是特定领域内的文档集合。接着要对原始素材执行清洗操作去除噪声,并将其转换成适合后续使用的格式。 #### 创建语料库索引 一旦拥有了经过清理后的文本片段列表,则可以通过编码器将它们映射到高维空间里的稠密表示形式——即所谓的嵌入(embeddings),之后再把这些嵌入存储在一个高效的近似最近邻(Near Neighbor Search,NNS)结构里以便快速查找最相关的项。 ```python from sentence_transformers import SentenceTransformer import numpy as np import faiss # 使用预训练的语言模型作为编码器 encoder = SentenceTransformer('all-MiniLM-L6-v2') # 假设有如下一些句子组成的语料库 corpus_sentences = ["Example document one.", "Another example text."] # 获取每篇文档对应的embedding embeddings = encoder.encode(corpus_sentences) # 初始化FAISS索引并向其中添加所有的embeddings dimensionality = embeddings.shape[1] index = faiss.IndexFlatL2(dimensionality) index.add(np.array([emb.tolist() for emb in embeddings])) ``` #### 集成查询接口 最后一步就是设计能够接收输入问题并将之转化为潜在匹配答案的过程。这通常涉及到先计算询问字符串相对于整个数据库内各个项目的相似度得分;随后挑选出排名靠前的结果返回给调用方。 ```python def retrieve_top_k(query: str, k=5): query_embedding = encoder.encode([query]) distances, indices = index.search( np.array(query_embedding).astype("float32"), k=k ) top_results = [(distances[0][i], corpus_sentences[idx]) for i, idx in enumerate(indices[0])] return sorted(top_results, key=lambda x:x[0]) print(retrieve_top_k("Find me something interesting")) ``` 以上代码展示了如何基于已有的工具链搭建起基本框架,在此基础上还可以进一步探索优化策略比如微调编码组件或者引入更复杂的评分机制等方法提升性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值