引言:什么是RAG技术?

在人工智能快速发展的今天,如何让AI模型能够基于特定知识库给出准确答案是一个重要挑战。RAG(Retrieval-Augmented Generation,检索增强生成) 技术应运而生,它结合了信息检索和文本生成的优势,让AI能够"查阅资料"后再回答问题。

想象一下,你有一个无所不知的助手,但它有时会忘记具体细节。RAG就像给这个助手配了一个智能书架,当它需要回答特定问题时,会先从这个书架上找到相关资料,然后基于这些资料给出精准答案。

本文将带你一步步使用LangChain框架,构建一个能够查询特定博客内容的智能问答系统,并通过实际案例展示其强大的问答能力。

环境准备

首先,我们需要安装必要的Python包:

bash

pip install -qU langchain-core langchain langchain-text-splitters langchain-community bs4 langchain-huggingface langchain_deepseek

代码详解

1. 导入必要的库

python

import os
import requests
from bs4 import BeautifulSoup
from langchain.agents import create_agent
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.tools import tool
from langchain_deepseek import ChatDeepSeek
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_core.documents import Document

功能说明

  • requestsBeautifulSoup用于网页内容抓取和解析

  • LangChain相关模块构建AI代理和文本处理流程

  • HuggingFaceEmbeddings将文本转换为向量表示

  • ChatDeepSeek提供大语言模型能力

2. 初始化向量数据库

python

embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
vector_store = InMemoryVectorStore(embeddings)

功能说明

  • 创建文本嵌入模型,将文字转换为数学向量

  • 初始化内存向量数据库,用于存储和检索文档

  • 这相当于建立了一个"智能书架",可以理解文本的语义

3. 配置API和服务

python

os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_API_KEY"] = "your_langsmith_api_key"
os.environ["LANGSMITH_ENDPOINT"] = "https://eu.api.smith.langchain.com"
os.environ["LANGSMITH_PROJECT"] = "your_project_name"

os.environ["DEEPSEEK_API_KEY"] = "your_deepseek_api_key"

model = ChatDeepSeek(model="deepseek-chat", temperature=0)

功能说明

  • 配置LangSmith用于监控和调试AI应用

  • 设置DeepSeek API密钥,这是我们的AI大脑

  • 初始化聊天模型,temperature=0确保回答更加确定性

4. 网页内容加载器

python

def manual_web_loader(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36'
    }
    response = requests.get(url, headers=headers, timeout=30)
    soup = BeautifulSoup(response.text, 'html.parser')
    
    content_parts = []
    for class_name in ["post-content", "post-title", "post-header"]:
        elements = soup.find_all(class_=class_name)
        for element in elements:
            content_parts.append(element.get_text())
    
    full_content = "\n".join(content_parts)
    return [Document(page_content=full_content, metadata={"source": url})]

docs = manual_web_loader("https://blog.csdn.net/weixin_40582941/article/details/155031787")

功能说明

  • 模拟浏览器访问目标网页,避免被反爬机制阻挡

  • 使用BeautifulSoup解析HTML,提取文章标题、内容和头部信息

  • 将提取的内容封装成LangChain文档格式,保留来源信息

  • 这就像是一个专业的资料收集员,只获取我们需要的核心内容

5. 文本分割处理

python

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
all_splits = text_splitter.split_documents(docs)

_ = vector_store.add_documents(documents=all_splits)

功能说明

  • 将长文档分割成1000字符的小块,重叠200字符保持上下文连贯

  • 将分割后的文档块存入向量数据库

  • 这相当于把一本书分成多个章节,每个章节都有适当重叠,确保内容连贯性

6. 构建检索工具

python

@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)
    serialized = "\n\n".join(
        (f"Source: {doc.metadata}\nContent: {doc.page_content}")
        for doc in retrieved_docs
    )
    return serialized, retrieved_docs

tools = [retrieve_context]

功能说明

  • 创建检索工具,能够根据问题查找最相关的2个文档片段

  • 返回找到的内容及其来源信息

  • 这就像是给AI配了一个研究助手,能够快速找到相关资料

7. 创建AI代理并提问

python

prompt = (
    "You have access to a tool that retrieves context from a blog post. "
    "Use the tool to help answer user queries."
)
agent = create_agent(model, tools, system_prompt=prompt)

query = "如何构建AI聊天应用?"
for step in agent.stream(
    {"messages": [{"role": "user", "content": query}]},
    stream_mode="values",
):
    step["messages"][-1].pretty_print()

功能说明

  • 创建AI代理,赋予它使用检索工具的能力

  • 向代理提问,它会自动调用检索工具查找相关资料

  • 以流式方式输出回答,提供更好的用户体验

实战案例:RAG系统问答过程全解析

让我们通过一个具体问题来展示RAG系统的完整工作流程。当用户提问"如何构建AI聊天应用?"时,系统的工作过程如下:

第一阶段:问题理解和初步检索

text

================================ Human Message =================================
如何构建AI聊天应用?
================================== Ai Message ==================================
我来帮您查找关于构建AI聊天应用的相关信息。
Tool Calls:
  retrieve_context (call_00_gnpnetS2ikajPBwzJL4h5j76)
 Call ID: call_00_gnpnetS2ikajPBwzJL4h5j76
  Args:
    query: 如何构建AI聊天应用

系统行为

  • AI代理识别到这是一个需要专业知识的问题

  • 自动调用检索工具,使用原始问题进行第一次搜索

  • 尝试从知识库中找到最相关的信息

第二阶段:优化搜索策略

当第一次检索没有找到足够相关信息时,系统会智能调整搜索策略:

text

================================== Ai Message ==================================
让我尝试更具体的搜索:
Tool Calls:
  retrieve_context (call_00_SBWolq4LvQByYrRKUDb89LDR)
 Call ID: call_00_SBWolq4LvQByYrRKUDb89LDR
  Args:
    query: AI聊天机器人开发 构建 教程

系统行为

  • 分析第一次检索结果,发现需要更具体的关键词

  • 自动优化搜索词,加入"开发"、"教程"等更具体的关键词

  • 这体现了系统的智能推理能力

第三阶段:扩展搜索范围

text

================================== Ai Message ==================================
让我搜索更多相关主题:
Tool Calls:
  retrieve_context (call_00_3ChPVWQNwwVbArZrnPajzTXp)
 Call ID: call_00_3ChPVWQNwwVbArZrnPajzTXp
  Args:
    query: 聊天应用开发 人工智能 技术栈

系统行为

  • 进一步扩展搜索范围,尝试不同的关键词组合

  • 加入"技术栈"等更技术性的术语

  • 系统展现了多轮检索和持续优化的能力

第四阶段:综合知识生成答案

当系统发现知识库中相关信息有限时,它会结合自身的通用知识生成全面答案:

text

================================== Ai Message ==================================
基于我的知识,我来为您详细介绍如何构建AI聊天应用:

## 构建AI聊天应用的完整流程

### 1. 确定应用类型
- **客服机器人** - 用于客户服务
- **个人助手** - 类似Siri、Alexa
- **社交聊天机器人** - 用于娱乐或社交
- **企业级助手** - 用于内部工作流程

### 2. 技术架构选择

#### 前端技术
- Web端:React、Vue.js、Angular
- 移动端:React Native、Flutter、原生开发
- 桌面端:Electron

#### 后端技术
- Node.js、Python (Flask/Django)、Java
- 数据库:MongoDB、PostgreSQL、Redis
- 消息队列:RabbitMQ、Kafka

### 3. AI核心组件

#### 自然语言处理(NLP)
- **意图识别** - 理解用户意图
- **实体提取** - 识别关键信息
- **对话管理** - 维护对话状态

#### 机器学习模型
- 预训练模型:GPT系列、BERT、T5
- 自定义模型训练
- 集成第三方API(如OpenAI、Google Dialogflow)

### 4. 开发步骤

#### 第一阶段:需求分析
- 定义使用场景
- 确定目标用户
- 规划对话流程

#### 第二阶段:原型设计
- 设计对话流程图
- 创建用户界面原型
- 制定回复策略

#### 第三阶段:技术实现
- 搭建基础架构
- 集成NLP服务
- 开发对话逻辑
- 实现用户界面

#### 第四阶段:测试优化
- 功能测试
- 用户体验测试
- 性能优化
- 持续改进

### 5. 关键考虑因素

#### 用户体验
- 响应速度
- 回复准确性
- 错误处理
- 个性化体验

#### 安全性
- 数据加密
- 用户隐私保护
- 防止恶意使用

#### 可扩展性
- 模块化设计
- 易于维护
- 支持多语言
- 云端部署

### 6. 推荐工具和框架

#### 开发框架
- Rasa - 开源对话AI框架
- Microsoft Bot Framework
- Google Dialogflow
- Amazon Lex

#### 云服务
- AWS Lex + Lambda
- Google Cloud Dialogflow
- Azure Bot Service
- OpenAI API

### 7. 最佳实践

1. **从小开始** - 先实现核心功能
2. **持续学习** - 基于用户反馈改进
3. **多轮对话** - 支持复杂交互
4. **上下文理解** - 记住对话历史
5. **人性化设计** - 自然的对话体验

您对哪个具体方面更感兴趣?我可以提供更详细的技术实现方案。

技术原理解析

RAG工作流程

  1. 检索(Retrieval):根据用户问题,从知识库中找到最相关的信息

  2. 增强(Augmentation):将检索到的信息与原始问题结合

  3. 生成(Generation):基于增强后的信息生成最终答案

向量搜索原理

  • 将文本转换为高维空间中的向量

  • 通过计算向量间的相似度找到相关内容

  • 语义相似的文本在向量空间中位置接近

系统优势展示

通过上面的实战案例,我们可以看到RAG系统的几大优势:

1. 智能检索能力

  • 多轮检索:系统会自动尝试不同的搜索策略

  • 关键词优化:智能调整搜索词以获得更好结果

  • 语义理解:基于向量相似度而非简单关键词匹配

2. graceful降级机制

当特定知识库信息不足时,系统能够:

  • 识别信息缺口

  • 转向通用知识库

  • 仍然提供有价值的全面回答

3. 结构化输出

  • 答案组织清晰,层次分明

  • 涵盖技术栈、开发流程、最佳实践等多个维度

  • 便于用户理解和实际应用

应用场景

这种基于RAG的技术可以广泛应用于:

  • 企业知识库:构建内部文档问答系统

  • 学术研究:快速查询论文和研究成果

  • 客服系统:基于产品文档提供准确客服回答

  • 教育培训:创建智能学习助手

优势特点

  1. 准确性高:答案基于真实文档,减少幻觉现象

  2. 可追溯:可以查看答案的来源文档

  3. 易于更新:只需更新知识库,无需重新训练模型

  4. 成本较低:相比微调大模型,RAG实现成本更低

  5. 智能检索:具备多轮检索和搜索优化能力

总结

通过本文的介绍和实战案例,我们全面展示了如何使用LangChain框架构建基于RAG技术的智能问答系统。这种技术让AI不再是"凭空想象",而是能够基于真实资料给出可靠答案,在实际应用中具有重要价值。

特别值得一提的是,系统展现出的智能检索优化graceful降级机制,使其在专业知识不足时仍能提供有价值的回答,这大大提升了系统的实用性和用户体验。

随着AI技术的不断发展,RAG将成为连接大模型与专业知识的重要桥梁,为各行各业提供更加智能、可靠的解决方案。无论是技术开发者还是终端用户,都能从这种智能问答系统中获得实实在在的价值。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐