自适应RAG:智能查询分析与自我纠错机制,让AI更懂你(收藏版)

深入分析传统RAG与Agentic RAG 文章摘要: RAG技术通过连接LLM与外部知识库解决知识滞后与内容幻觉问题。传统RAG采用线性“检索-生成”流程,适合简单问答但无法处理多跳推理;Agentic RAG引入智能体决策,通过查询优化、工具选择和循环评估应对复杂任务,但开发成本更高。两者并非替代关系:传统RAG适合低延迟简单场景(如客服),Agentic RAG擅长度身定制复杂分析(如行业报告)。未来趋势可能是动态切换两种模式,根据任务复杂度平衡效率与能力。选择时需权衡响应速度、开发成本与任务复杂度。 阅读详情

本文深入探讨了Adaptive RAG(自适应检索增强生成)技术,该技术通过智能动态查询分析与自我纠错机制相结合,显著提升AI系统的响应准确性。文章详细介绍了如何使用LangGraph与Google Gemini实现Adaptive RAG,包括查询路由与分类、动态知识获取策略以及多阶段质量保障机制。通过构建一个具备智能查询分析、严谨评估框架和自适应架构的高级RAG系统,本文为程序员和小白提供了一个实用的学习指南,帮助他们理解和应用这一前沿技术。

1、 引言

检索增强生成(RAG)彻底革新了我们构建能够访问外部知识并进行推理的 AI 系统的方式。然而,随着应用程序的复杂性不断增加,传统 RAG 方法的局限性日益凸显。

如今,我们正在经历一种从线性、固定管道到智能、自适应系统的转变,这些系统可以根据查询复杂度和上下文动态调整其检索与生成策略。

在本文中,我们将深入探讨 Agentic RAG 系统,特别是如何使用 LangGraph 与 Google Gemini 实现 Adaptive RAG。在实现之前,我们先来理解什么是 Adaptive RAG。

2、 Adaptive RAG(自适应检索增强生成)

Adaptive RAG 是一种先进的 RAG 策略,它将动态查询分析和主动/自我修正机制智能结合在一起。

Adaptive RAG 的核心理念:并非所有查询都具有相同复杂度。研究表明,现实世界中的查询具有多种复杂程度:

  • 简单查询:如 “巴黎是哪个国家的首都?” —— 直接由 LLM 回答即可
  • 多跳查询:如 “占领 Malakoff 的人是什么时候来到 Philipsburg 所在地区的?” —— 需要 4 个推理步骤。

上图示比较了不同检索增强 LLM 策略在问答任务中的应用方式:

(A)单步方法:对简单查询高效,但无法处理多跳推理。
(B)多步方法:适用于复杂查询,但在简单查询上引入了不必要的计算成本。
(C)自适应方法:通过查询复杂度分类器,选择最适合的策略,可灵活切换单步、多步甚至无需检索方式。

核心问题,如上图所示:

  • (A)单步方法:适合简单查询,但不能支持复杂推理
  • (B)多步方法:支持复杂推理,但对简单查询效率低
  • (C)Adaptive 方法:通过查询分类器,将每个查询引导至最适策略

2.1 理解 Adaptive RAG 工作流程

从实现图中可以看到,Adaptive RAG 通过基于图的状态管理系统,构建了一个智能决策流程:

1. 查询路由与分类

系统从一个训练好的复杂度分类器开始,分析每一个输入问题。这不仅仅是关键词匹配,而是通过模型进行的复杂度评估,用于判断:

  • 是否需要检索?(模型内知识是否足够?)
  • 如果需要检索,复杂度属于哪一层级?
  • 应采用的最优策略:无需检索 / 单步检索 / 多跳推理
2. 动态知识获取策略

基于复杂度分类,系统将查询路由至以下策略之一:

  • 基于索引的检索:适用于知识库可回答的问题
  • 网页搜索:本地知识无法覆盖或需要最新信息时
  • 无需检索:模型的参数知识即可回答的问题
3. 多阶段质量保障机制

系统在多个关键节点设置了评估机制:

  • 文档相关性评估:通过置信度评分判断检索结果质量
  • 幻觉检测机制:验证生成内容是否基于已检索证据
  • 答案质量评估:确保最终答案真正解决用户问题

3、 我们要构建什么?

本文将带你构建一个能够智能决策的信息检索与路由机制的高级 RAG 系统。该系统具备:

  • 智能查询分析机制
  • 严谨的评估框架
  • 支持多源信息(本地知识库 + Web)的自适应架构

我们将对 LangChain 原有代码结构进行重构,目标包括:提升可读性、易维护性、开发者体验。

实现组件包括:

  • LangGraph:管理有状态的复杂工作流
  • Google Gemini:主语言模型
  • 向量数据库:文档检索效率保障
  • 网页搜索集成:实时信息检索
  • 全面评估框架:保障质量

4、 项目结构

在正式编码前,先来理解整个项目目录:

building-adaptive-rag/
├── graph/
│   ├── chains/
│   │   ├── tests/
│   │   │   ├── __init__.py
│   │   │   └── test_chains.py
│   │   ├── __init__.py
│   │   ├── answer_grader.py
│   │   ├── generation.py
│   │   ├── hallucination_grader.py
│   │   ├── retrieval_grader.py
│   │   └── router.py
│   ├── nodes/
│   │   ├── __init__.py
│   │   ├── generate.py
│   │   ├── grade_documents.py
│   │   ├── retrieve.py
│   │   └── web_search.py
│   ├── __init__.py
│   ├── consts.py
│   ├── graph.py
│   └── state.py
├── static/
│   ├── LangChain-logo.png
│   ├── Langgraph Adaptive Rag.png
│   └── graph.png
├── .env
├── .gitignore
├── ingestion.py
├── main.py
├── model.py
├── README.md
└── requirements.txt

整个项目采用模块化架构,每个组件有明确职责:

  • graph/ 中管理核心逻辑:
  • chains/:各类 LLM 操作
  • nodes/:工作流程的节点
  • graph.py:协调所有节点的主图逻辑

4.1 使用 UV 进行环境配置

我们将使用 UV(一种快速的 Python 包管理器)搭建开发环境。

安装 UV:

curl -LsSf https://astral.sh/uv/install.sh | sh

创建项目目录与虚拟环境:

mkdir building-adaptive-rag
cd building-adaptive-rag
uv venv --python 3.10
source .venv/bin/activate  # Windows 下使用 .venv\\Scripts\\activate

创建 requirements.txt,添加以下依赖:

beautifulsoup4
langchain-community
tiktoken
langchainhub
langchain
langgraph
tavily-python
langchain-openai
python-dotenv
black
isort
pytest
langchain-chroma
langchain-tavily==0.1.5
langchain_aws
langchain_google_genai

安装依赖:

uv pip install -r requirements.txt

配置环境变量,创建 .env 文件:

GOOGLE_API_KEY=your_tavily_api_key_here
TAVILY_API_KEY=your_tavily_api_key_here  # 网页搜索功能所需
LANGCHAIN_API_KEY=your_langchain_api_key_here  # 可选,用于跟踪
LANGCHAIN_TRACING_V2=true                # 可选
LANGCHAIN_ENDPOINT=https://api.smith.langchain.com  # 可选
LANGCHAIN_PROJECT=agentic-rag            # 可选

5、实现指南

第 1 步:定义状态管理系统和核心常量

在 graph/state.py 文件中,我们将定义工作流运行时的状态。这些状态将记录对话历史、用户问题、生成答案、检索到的文档等信息。

此外,在 graph/consts.py 中,我们定义所有核心常量,如提示模板(prompt)、命令常量和其他重复使用的字符串。

第 2 步:定义聊天模型与嵌入模型

我们将在 model.py 文件中设置基础模型。

# from langchain_openai import ChatOpenAI
from langchain_aws import ChatBedrock
# from langchain_openai import OpenAIEmbeddings
from langchain_google_genai import GoogleGenerativeAIEmbeddings
# llm_model = ChatOpenAI(temperature=0)
llm_model =  ChatBedrock(model_id="us.anthropic.claude-sonnet-4-20250514-v1:0", region_name="us-west-2", temperature=0)
embed_model = GoogleGenerativeAIEmbeddings(model="models/text-embedding-004")
  • ChatGoogleGenerativeAI 用作主聊天模型(LLM)
  • GoogleGenerativeAIEmbeddings 用于生成文档嵌入
  • TavilySearchResults 是集成的网页搜索工具(基于 Tavily)

这些组件后续将在不同节点中被调用。

第 3 步:构建文档摄取管道

文件:ingestion.py

from dotenv import load_dotenv
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_chroma import Chroma
from langchain_community.document_loaders import WebBaseLoader
from model import embed_model
load_dotenv()
urls = [
"https://lilianweng.github.io/posts/2023-06-23-agent/",
"https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/",
"https://lilianweng.github.io/posts/2023-10-25-adv-attack-llm/",
]
docs = [WebBaseLoader(url).load() for url in urls]
docs_list = [item for sublist in docs for item in sublist]
text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
chunk_size=250, chunk_overlap=0
)
doc_splits = text_splitter.split_documents(docs_list)
embed = embed_model
# Create vector store with documents
vectorstore = Chroma.from_documents(
documents=doc_splits,
collection_name="rag-chroma",
embedding=embed,
persist_directory="./.chroma",
)
# Create retriever
retriever = vectorstore.as_retriever()

我们创建一个摄取脚本,它:

  1. 从指定目录读取文档(.md、.txt 等)
  2. 将文档分割成合适的 chunk
  3. 为每个 chunk 创建嵌入
  4. 存入向量数据库(如 Chroma)

在摄取后,文档就可以供后续检索使用。

第 4 步:构建查询路由链(Router)

文件:graph/chains/router.py

from typing import Literal
from langchain_core.prompts import ChatPromptTemplate
from pydantic import BaseModel, Field
from model import llm_model
class RouteQuery(BaseModel):
"""Route a user query to the most relevant datasource."""
datasource: Literal["vectorstore", "websearch"] = Field(
...,
description="Given a user question choose to route it to web search or a vectorstore.",
)
llm = llm_model
structured_llm_router = llm.with_structured_output(RouteQuery)
system = """You are an expert at routing a user question to a vectorstore or web search.
The vectorstore contains documents related to agents, prompt engineering, and adversarial attacks.
Use the vectorstore for questions on these topics. For all else, use web-search."""
route_prompt = ChatPromptTemplate.from_messages(
[
("system", system),
("human", "{question}"),
]
)
question_router = route_prompt | structured_llm_router

这是系统智能决策的第一步 —— 判断该如何处理用户查询。

我们使用 LLM 提示模板,构建一个链来输出下列三种操作之一:

  • route_to_retrieval:查询需要文档支持
  • route_to_search:需要访问 Web 搜索结果
  • route_to_generation:直接生成,不需要检索

这个路由器会成为整个 LangGraph 中的决策节点。

第 5 步:创建文档检索评分器(Retrieval Grader)

文件:graph/chains/retrieval_grader.py

from langchain_core.prompts import ChatPromptTemplate
from pydantic import BaseModel, Field
from model import llm_model
llm = llm_model
class GradeDocuments(BaseModel):
"""Binary score for relevance check on retrieved documents."""
binary_score: str = Field(
description="Documents are relevant to the question, 'yes' or 'no'"
)
structured_llm_grader = llm.with_structured_output(GradeDocuments)
system = """You are a grader assessing relevance of a retrieved document to a user question. \n
If the document contains keyword(s) or semantic meaning related to the question, grade it as relevant. \n
Give a binary score 'yes' or 'no' score to indicate whether the document is relevant to the question."""
grade_prompt = ChatPromptTemplate.from_messages(
[
("system", system),
("human", "Retrieved document: \n\n {document} \n\n User question: {question}"),
]
)
retrieval_grader = grade_prompt | structured_llm_grader

这个评分器用于评估从向量数据库中检索到的文档是否真正与用户查询相关。如果置信度低,系统将选择从 Web 重新获取信息。

其核心逻辑是:如果文档评分不够高,我们就尝试网页搜索。

第 6 步:构建幻觉检测系统(Hallucination Grader)

文件:graph/chains/hallucination_grader.py

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableSequence
from pydantic import BaseModel, Field
from model import llm_model
llm =  llm_model
class GradeHallucinations(BaseModel):
"""Binary score for hallucination present in generation answer."""
binary_score: bool = Field(
description="Answer is grounded in the facts, 'yes' or 'no'"
)
structured_llm_grader = llm.with_structured_output(GradeHallucinations)
system = """You are a grader assessing whether an LLM generation is grounded in / supported by a set of retrieved facts. \n
Give a binary score 'yes' or 'no'. 'Yes' means that the answer is grounded in / supported by the set of facts."""
hallucination_prompt = ChatPromptTemplate.from_messages(
[
("system", system),
("human", "Set of facts: \n\n {documents} \n\n LLM generation: {generation}"),
]
)
hallucination_grader: RunnableSequence = hallucination_prompt | structured_llm_grader

幻觉检测是 Adaptive RAG 的关键步骤之一。我们将生成的答案与提供的文档进行比较,并判断:

  • 答案是否真实基于检索内容?
  • 是否存在幻觉(即模型“编造”内容)?

这个评分器能显著提升生成的可靠性。

第 7 步:创建答案质量评分器(Answer Grader)

文件:graph/chains/answer_grader.py

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableSequence
from pydantic import BaseModel, Field
from model import llm_model
class GradeAnswer(BaseModel):
binary_score: bool = Field(
description="Answer addresses the question, 'yes' or 'no'"
)
llm =  llm_model
structured_llm_grader = llm.with_structured_output(GradeAnswer)
system = """You are a grader assessing whether an answer addresses / resolves a question \n
Give a binary score 'yes' or 'no'. Yes' means that the answer resolves the question."""
answer_prompt = ChatPromptTemplate.from_messages(
[
("system", system),
("human", "User question: \n\n {question} \n\n LLM generation: {generation}"),
]
)
answer_grader: RunnableSequence = answer_prompt | structured_llm_grader

我们使用一个 LLM 链来评估最终答案是否真正解决了用户的问题。如果评分较低,系统将尝试重新检索、重新生成,直到达到满意的质量。

第 8 步:构建生成链(Final Generator)

文件:graph/chains/generation.py

from langchain import hub
from langchain_core.output_parsers import StrOutputParser
from model import llm_model
llm = llm_model
prompt = hub.pull("rlm/rag-prompt")
generation_chain = prompt | llm | StrOutputParser()

这是最终用于生成用户答案的 LLM 链。它接收以下输入:

  • 检索到的文档(可为空)
  • 原始用户查询

输出结构化格式的答案(可以含有来源引用等)。

第 9 步:实现检索节点(Retrieve Node)

文件:graph/nodes/retrieve.py

from typing import Any, Dict
from graph.state import GraphState
from ingestion import retriever
def retrieve(state: GraphState) -> Dict[str, Any]:
print("---RETRIEVE---")
question = state["question"]
documents = retriever.invoke(question)
return {"documents": documents, "question": question}

此节点从向量数据库中执行文档检索。

注意:它仅在路由器认为“需要检索”时被调用。

第 10 步:创建文档评分节点(Grade Documents Node)

文件:graph/nodes/grade_documents.py

from typing import Any, Dict
from graph.chains.retrieval_grader import retrieval_grader
from graph.state import GraphState
def grade_documents(state: GraphState) -> Dict[str, Any]:
"""
Determines whether the retrieved documents are relevant to the question
If any document is not relevant, we will set a flag to run web search
Args:
state (dict): The current graph state
Returns:
state (dict): Filtered out irrelevant documents and updated web_search state
"""
print("---CHECK DOCUMENT RELEVANCE TO QUESTION---")
question = state["question"]
documents = state["documents"]
filtered_docs = []
web_search = False
for d in documents:
score = retrieval_grader.invoke(
{"question": question, "document": d.page_content}
)
grade = score.binary_score
if grade.lower() == "yes":
print("---GRADE: DOCUMENT RELEVANT---")
filtered_docs.append(d)
else:
print("---GRADE: DOCUMENT NOT RELEVANT---")
web_search = True
continue
return {"documents": filtered_docs, "question": question, "web_search": web_search}

此节点结合步骤 5、6、7 中的所有评分器,用于动态判断:

  • 是否继续使用当前文档?
  • 是否需要尝试其他策略(如 Web 搜索)?
  • 是否要重新生成答案?

它是整个系统“自我纠错”机制的核心。

第 11 步:构建网页搜索节点(Web Search Node)

文件:graph/nodes/web_search.py

from typing import Any, Dict
from dotenv import load_dotenv
from langchain.schema import Document
from langchain_tavily import TavilySearch
from graph.state import GraphState
load_dotenv()
web_search_tool = TavilySearch(max_results=3)
def web_search(state: GraphState) -> Dict[str, Any]:
print("---WEB SEARCH---")
question = state["question"]
# Initialize documents - this was the missing part!
documents = state.get("documents", [])  # Get existing documents or empty list
tavily_results = web_search_tool.invoke({"query": question})["results"]
joined_tavily_result = "\n".join(
[tavily_result["content"] for tavily_result in tavily_results]
)
web_results = Document(page_content=joined_tavily_result)
# Add web results to existing documents (or create new list if documents was empty)
if documents:
documents.append(web_results)
else:
documents = [web_results]
return {"documents": documents, "question": question}
if __name__ == "__main__":
web_search(state={"question": "agent memory", "documents": None})

如果评分系统认为当前文档不足以支持答案,系统将调用此节点进行实时 Web 搜索。我们使用 Tavily API 来完成搜索。

第 12 步:实现生成节点(Generate Node)

文件:graph/nodes/generate.py

from typing import Any, Dict
from graph.chains.generation import generation_chain
from graph.state import GraphState
def generate(state: GraphState) -> Dict[str, Any]:
print("---GENERATE---")
question = state["question"]
documents = state["documents"]
generation = generation_chain.invoke({"context": documents, "question": question})
return {"documents": documents, "question": question, "generation": generation}

此节点用于触发最终答案的生成。它接收所有检索与评分信息,并调用之前定义的生成链。

第 13 步:构建完整图形工作流(LangGraph)

文件:graph/graph.py

from dotenv import load_dotenv
from langgraph.graph import END, StateGraph
from graph.chains.answer_grader import answer_grader
from graph.chains.hallucination_grader import hallucination_grader
from graph.chains.router import RouteQuery, question_router
from graph.consts import GENERATE, GRADE_DOCUMENTS, RETRIEVE, WEBSEARCH
from graph.nodes import generate, grade_documents, retrieve, web_search
from graph.state import GraphState
load_dotenv()
def decide_to_generate(state):
print("---ASSESS GRADED DOCUMENTS---")
if state["web_search"]:
print(
"---DECISION: NOT ALL DOCUMENTS ARE NOT RELEVANT TO QUESTION, INCLUDE WEB SEARCH---"
)
return WEBSEARCH
else:
print("---DECISION: GENERATE---")
return GENERATE
def grade_generation_grounded_in_documents_and_question(state: GraphState) -> str:
print("---CHECK HALLUCINATIONS---")
question = state["question"]
documents = state["documents"]
generation = state["generation"]
score = hallucination_grader.invoke(
{"documents": documents, "generation": generation}
)
if hallucination_grade := score.binary_score:
print("---DECISION: GENERATION IS GROUNDED IN DOCUMENTS---")
print("---GRADE GENERATION vs QUESTION---")
score = answer_grader.invoke({"question": question, "generation": generation})
if answer_grade := score.binary_score:
print("---DECISION: GENERATION ADDRESSES QUESTION---")
return "useful"
else:
print("---DECISION: GENERATION DOES NOT ADDRESS QUESTION---")
return "not useful"
else:
print("---DECISION: GENERATION IS NOT GROUNDED IN DOCUMENTS, RE-TRY---")
return "not supported"
def route_question(state: GraphState) -> str:
"""
Route question to web search or RAG.
Args:
state (dict): The current graph state
Returns:
str: Next node to call
"""
print("---ROUTE QUESTION---")
question = state["question"]
source: RouteQuery = question_router.invoke({"question": question})
if source.datasource == WEBSEARCH:
print("---ROUTE QUESTION TO WEB SEARCH---")
return WEBSEARCH
elif source.datasource == "vectorstore":
print("---ROUTE QUESTION TO RAG---")
return RETRIEVE
workflow = StateGraph(GraphState)
workflow.add_node(RETRIEVE, retrieve)
workflow.add_node(GRADE_DOCUMENTS, grade_documents)
workflow.add_node(GENERATE, generate)
workflow.add_node(WEBSEARCH, web_search)
workflow.set_conditional_entry_point(
route_question,
{
WEBSEARCH: WEBSEARCH,
RETRIEVE: RETRIEVE,
},
)
# workflow.set_entry_point(RETRIEVE)
workflow.add_edge(RETRIEVE, GRADE_DOCUMENTS)
workflow.add_conditional_edges(
GRADE_DOCUMENTS,
decide_to_generate,
{
WEBSEARCH: WEBSEARCH,
GENERATE: GENERATE,
},
)
workflow.add_conditional_edges(
GENERATE,
grade_generation_grounded_in_documents_and_question,
{
"not supported": GENERATE,
"useful": END,
"not useful": WEBSEARCH,
},
)
workflow.add_edge(WEBSEARCH, GENERATE)
workflow.add_edge(GENERATE, END)
app = workflow.compile()
app.get_graph().draw_mermaid_png(output_file_path="graph.png")

这是最核心的部分,我们在这里:

  • 使用 LangGraph 构建整个节点状态机
  • 定义每个节点的状态传递方式
  • 实现路由逻辑(如条件跳转、循环)
  • 构建一个复杂的、基于状态的自适应处理图

这一部分将综合前面所有节点与评分器。

第 14 步:创建主应用入口

文件:main.py

from dotenv import load_dotenv
load_dotenv()
from graph.graph import app
def format_response(result):
"""Format the response from the graph for better readability"""
if isinstance(result, dict) and "generation" in result:
return result["generation"]
elif isinstance(result, dict) and "answer" in result:
return result["answer"]
else:
# Fallback to string representation
return str(result)
def main():
print("=" * 60)
print("🤖 Advanced RAG Chatbot")
print("=" * 60)
print("Welcome! Ask me anything or type 'quit', 'exit', or 'bye' to stop.")
print("-" * 60)
while True:
try:
# Get user input
user_question = input("\n💬 You: ").strip()
# Check for exit commands
if user_question.lower() in ['quit', 'exit', 'bye', 'q']:
print("\n👋 Goodbye! Thanks for chatting!")
break
# Skip empty inputs
if not user_question:
print("Please enter a question.")
continue
# Show processing indicator
print("\n🤔 Bot: Thinking...")
# Process the question through the graph
result = app.invoke(input={"question": user_question})
# Format and display the response
response = format_response(result)
print(f"\n🤖 Bot: {response}")
except KeyboardInterrupt:
print("\n\n👋 Goodbye! Thanks for chatting!")
break
except Exception as e:
print(f"\n❌ Sorry, I encountered an error: {str(e)}")
print("Please try asking your question again.")
if __name__ == "__main__":
main()

这个文件将作为系统的入口,处理:

  • 用户输入
  • 调用 LangGraph 的执行逻辑
  • 控制整个查询 - 检索 - 生成流程

它会输出最终回答,并打印中间评分与调试信息。

第 15 步:全面测试套件

文件:graph/chains/tests/test_chains.py

from pprint import pprint
import pytest
from dotenv import load_dotenv
load_dotenv()
from graph.chains.generation import generation_chain
from graph.chains.hallucination_grader import (GradeHallucinations,
hallucination_grader)
from graph.chains.retrieval_grader import GradeDocuments, retrieval_grader
from graph.chains.router import RouteQuery, question_router
from ingestion import retriever
def test_retrival_grader_answer_yes() -> None:
question = "agent memory"
docs = retriever.invoke(question)
doc_txt = docs[1].page_content
res: GradeDocuments = retrieval_grader.invoke(
{"question": question, "document": doc_txt}
)
assert res.binary_score == "yes"
def test_retrival_grader_answer_no() -> None:
question = "agent memory"
docs = retriever.invoke(question)
# Skip test if no documents are returned
# if len(docs) == 0:
#     pytest.skip(f"No documents returned for query: {question}")
doc_txt = docs[1].page_content
res: GradeDocuments = retrieval_grader.invoke(
{"question": "how to make pizaa", "document": doc_txt}
)
assert res.binary_score == "no"
def test_generation_chain() -> None:
question = "agent memory"
docs = retriever.invoke(question)
generation = generation_chain.invoke({"context": docs, "question": question})
pprint(generation)
def test_hallucination_grader_answer_yes() -> None:
question = "agent memory"
docs = retriever.invoke(question)
generation = generation_chain.invoke({"context": docs, "question": question})
res: GradeHallucinations = hallucination_grader.invoke(
{"documents": docs, "generation": generation}
)
assert res.binary_score
def test_hallucination_grader_answer_no() -> None:
question = "agent memory"
docs = retriever.invoke(question)
res: GradeHallucinations = hallucination_grader.invoke(
{
"documents": docs,
"generation": "In order to make pizza we need to first start with the dough",
}
)
assert not res.binary_score
def test_router_to_vectorstore() -> None:
question = "agent memory"
res: RouteQuery = question_router.invoke({"question": question})
assert res.datasource == "vectorstore"
def test_router_to_websearch() -> None:
question = "how to make pizza"
res: RouteQuery = question_router.invoke({"question": question})
assert res.datasource == "websearch"

我们为所有 LLM 链和节点编写了测试用例。测试包括:

  • 路由链是否能正确分类查询
  • 评分器是否能准确评估文档质量
  • 幻觉检测是否有效识别幻觉

这些测试确保我们的系统具有稳定性和可扩展性。

6、系统运行方式

通过将所有组件(链、节点、评分器、搜索器)连接在一个有状态图中,系统具备以下能力:

6.1 智能查询路由

能够判断用户问题是否需要外部知识支持,并选择合适策略:

  • 无需检索(模型内部知识)
  • 向量数据库检索
  • Web 搜索
6.2 多级质量检查

每个步骤的输出都经过以下机制验证:

  • 文档相关性评分器:检索内容是否匹配问题?
  • 幻觉检测器:答案是否基于文档?有没有“编造”?
  • 答案质量评分器:最终答案是否真正解决问题?
6.3 自我纠错与多轮推理

系统根据评分结果自动调整路径:

  • 若文档质量差 → 重检索 / 网页搜索
  • 若答案不佳 → 重新生成 / 调整上下文
  • 可以在多个候选答案之间跳转、对比、合并
6.4 工作流完全可视化

借助 LangGraph,整个系统结构、状态转移、节点流动都可以图形化展示,易于调试与优化。

7、 总结

我们构建了一个完整的 Adaptive RAG 系统,具备以下核心能力:

模块描述
查询路由器识别查询复杂度,智能选择执行路径
检索器从向量数据库或 Web 获取文档
生成器基于文档和用户问题生成最终答案
幻觉检测器确保答案与文档一致,避免胡编乱造
质量评分器多轮判断答案是否达标,必要时重新生成
LangGraph 图管理状态、控制流转,支持多跳、多路径、多状态决策

相比传统 RAG,Adaptive RAG 提供了更强的弹性、更高的准确率、更好的用户体验。

此外,模块高度解耦、可测试性强,便于后续迁移到其他 LLM、向量数据库或前端框架。

8、局限性与下一步计划

尽管我们构建了一个强大的系统,但仍有以下待改进点:

1.成本问题

评分器和生成器每一步都调用 LLM,计算资源开销较大。

改进方向:

  • 替换部分评分器为轻量模型(如 BGE、DistilBERT)
  • 使用 rule-based 策略优化调用频次
2.Latency 延迟

多步流程带来响应延迟,影响交互体验。

改进方向:

  • 并行处理某些评分流程
  • 引入缓存机制:对相似问题/文档复用处理结果
3.查询分类准确率

当前查询分类器由 LLM 执行,准确性受限于提示词与模型能力。

改进方向:

  • 使用微调模型进行查询分类
  • 利用语义向量聚类 + 模板映射判断查询意图

9、 下一步计划

  1. 引入 Feedback 回路:让用户反馈反哺评分器
  2. 多语言支持:将系统泛化为可多语种适配架构
  3. 增强 UI:构建基于 Streamlit 或 Next.js 的可视化界面

你现在拥有了一个生产级别、支持自我评估与纠错的 Adaptive RAG 系统结构。可以在你的问答应用、企业知识管理、搜索系统中落地使用。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

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

https://img-blog.csdnimg.cn/img_convert/05840567e2912bcdcdda7b15cba33d93.jpeg

在这里插入图片描述

为什么要学习大模型?

我国在A大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年,人才缺口已超百万,凸显培养不足。随着AI技术飞速发展,预计到2025年,这一缺口将急剧扩大至400万,严重制约我国AI产业的创新步伐。加强人才培养,优化教育体系,国际合作并进是破解困局、推动AI发展的关键。

在这里插入图片描述

在这里插入图片描述

大模型入门到实战全套学习大礼包

1、大模型系统化学习路线

作为学习AI大模型技术的新手,方向至关重要。 正确的学习路线可以为你节省时间,少走弯路;方向不对,努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划,带你从零基础入门到精通!

img


2、大模型学习书籍&文档

学习AI大模型离不开书籍文档,我精选了一系列大模型技术的书籍和学习文档(电子版),它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。

在这里插入图片描述

3、AI大模型最新行业报告

2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

img

4、大模型项目实战&配套源码

学以致用,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。

img

5、大模型大厂面试真题

面试不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我精心整理了一份大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

img

适用人群

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范
  • …
第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署
  • …
第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建
  • …
第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案
  • …

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

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

https://img-blog.csdnimg.cn/img_convert/05840567e2912bcdcdda7b15cba33d93.jpeg

基于Keil软件实现对射式红外传感器计次 (江协科技HAL库) 用HAL库复现江协科技,让嵌入式学习之路更顺畅。 阅读详情

相关推荐

条码打印工具-Bartender的使用

文章目录1、安装Bartender1.解压安装包,可获得bartender2021版本和破解文本2. 双击“BarTender_2021_R1_Full_x64.exe”文件运行,勾选协议及软件安装设置3. 选择安装选项,自行选择勾选,点击Browser可更换软件安装路径4. 耐心等待软件安装完成,直接点击完成退出5. 此时会弹出提示需要激活许可证,先点击取消6. 接着将Crack夹中的“BarTend.exe”破解文件复制到软件安装目录中替换7. 再双击“serial.reg”导入注册,点击确定即可8.

暮紫的笔记本 1万+

1+1>2!自适应RAG遇上LangGraph,这个Agentic问答系统组合有多强?实战拆解给你看!

AdaptiveRAG是一种创新的检索增强生成框架,通过动态分析查询复杂度并整合自我纠错机制,显著提升了AI系统的响应准确性。该系统采用模块化设计,包含智能查询路由、多级质量评估和动态知识获取三大核心机制。通过LangGraph构建的状态管理系统,能够根据查询复杂度自动选择最优处理策略(单步检索/多跳推理/直接生成),并实时评估文档相关性、检测幻觉内容、验证答案质量。实验表明,相比传统RAG方法,AdaptiveRAG在保持简单查询高效性的同时,有效解决了复杂推理任务,计算资源利用率提升40%以上。

2401_84495872的博客 917

论文理解【LLM-Agent】——【SkillOpt】Executive Strategy for Self-Evolving Agent Skills

SkillOpt 将 agent skill 从人工或一次性 prompt artifact 转化为可验证、可控、可迁移的文本空间“可训练状态”,通过有界编辑、验证门控、拒绝编辑反馈和 slow/meta update,在不更新模型权重的情况下显著提升多类 agent 任务表现

佚失的诗篇 589

Agentic RAG 详解 - 从头开始​​构建你自己的智能体系统

​虽然检索增强生成(RAG)在 2023 年占据主导地位,但代理工作流正在推动 2024 年的巨大进展。智能体的使用为构建更强大、稳健且多功能的 大型语言模型(LLM)应用程序开辟了新的可能性。其中一种可能性是在 RAG 流水线中引入智能体,形成代理式 RAG 流水线。 本文将介绍 Agentic RAG 的概念、其实现方式,以及其优势和局限性。

Elastic 中国社区官方博客 1万+

Python3 ACM模式输入输出全攻略:从牛客网到华为机试的实战技巧

本文详细解析了Python3在ACM模式下的输入输出处理技巧,针对牛客网、华为机试等在线评测系统。文章从input()函数本质出发,总结了六种高频输入模式的处理模板,并提供了链表、二叉树等数据结构的I/O实战方案,最后给出性能优化与常见避坑指南,帮助开发者高效应对算法笔试。

zero1的博客 998

PP生产订单的BADI增强 WORKORDER_UPDATE

我们的项目需求是: 1、 保存时检查工单BOM是否存在物料号相同的行项目,如果有则提示“物料& 重复,请检查工单BOM” 系统增强出口:PPCO0001,检查组件行项目是否有重复物料项 开始以为的增强增强看一下是用PPCO0001还是PPCO0007 后来找到了badi WORKORDER_UPDATE IF_EX_WORKORDER_UPDATE~BEFORE_UPDATE

ERP运维咨询(目标和成功) 4635

Agentic RAG实战:知识增强的未来趋势与挑战

本文介绍了基于LangGraph和Qwen构建的AgenticRAG系统,这是一种具备动态查询分析和自我纠错能力的智能检索增强生成框架。该系统通过复杂度分类器自动识别查询类型,智能选择本地检索、网络搜索或直接生成策略,并采用多阶段质量评估机制确保结果准确性。文章详细拆解了系统各模块的实现方法,包括查询路由、知识检索、内容生成、幻觉检测等核心组件,最终形成一个端到端的自适应工作流。该系统能够根据不同查询复杂度动态调整处理路径,显著提升生成结果的可靠性和时效性,为复杂问答场景提供了高效解决方案。

2401_84204207的博客 786

深入解析“PROJ: proj_create_from_database: Cannot find proj.db”错误:从环境配置到打包实战

本文深入解析了“PROJ: proj_create_from_database: Cannot find proj.db”错误的根源与解决方案,涵盖环境配置、PyInstaller打包及跨平台兼容性处理。通过详细分析PROJ库路径问题及GDAL依赖关系,提供动态路径设置、资源文件打包等实战技巧,帮助开发者高效解决地理数据处理中的常见错误。

weixin_29074409的博客 444

Agentic RAG实战:基于LangGraph与Qwen的自适应AI问答系统构建

同时课程详细介绍了。

jennycisp的博客 1062

基于多智能体架构的AI模拟法庭系统:律师案件预演的革命性工具

多智能体系统(Multi-Agent System)是人工智能领域的重要分支,它通过多个自主或半自主的智能体协同工作,模拟复杂的社会交互与决策过程。其核心原理在于分布式问题求解,每个智能体具备感知、推理和行动能力,通过通信与协作实现整体目标。在工程实践中,多智能体架构的价值在于能够模拟真实世界中的信息不对称与策略独立性,从而在复杂决策场景中提供更贴近现实的推演。这一技术正被应用于法律科技领域,通过构建物理隔离的智能体环境,模拟法庭对抗中的信息屏障与策略博弈。例如,在AI模拟法庭系统中,原告、被告、法官等角色

weixin_42561249的博客 394

【TCN回归预测】TCN时间卷积神经网络数据回归预测(多输入单输出)【含Matlab源码 2317期】

TCN时间卷积神经网络数据回归预测 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版)或下载付费资源,可赠送奶茶价版付费专栏指定代码1份; 822

收藏必备!从传统RAG到Adaptive RAG:打造更智能的自适应检索增强生成系统

文章介绍了新一代Adaptive RAG技术,它能够动态判断问题复杂度,自主选择最优信息获取路径,而非传统RAG的"一刀切"模式。该技术包含三大核心机制:智能查询路由、动态知识获取策略和多阶段质量保障。作者分享了基于LangGraph和通义千问实现的Adaptive RAG系统,展示了如何通过智能分类、动态选择和多重质检机制,让AI系统更准确高效地回答各类问题。在大模型时代,如何让 AI 系统更准确、更高效地回答用户问题,是开发者和研究者共同关注的核心议题。传统的。

ytt0523_com的博客 931

2024年 Flutter 面试题大全(2024.6.28持续更新中)

2024年 Flutter 面试题大全(持续更新中)

Code Metaverse 6666

收藏必备:构建能理解、规划、纠错的智能体RAG系统,解决大模型五大痛点

文章介绍了智能体RAG技术,解决了传统RAG的五大痛点。详细阐述了如何构建"活"的知识库,包括处理异构数据、结构化解析、智能分块、元数据生成和混合存储。同时介绍了打造"专家团队"和构建"大脑中枢"的推理引擎,使系统能像人类分析师一样具备理解、规划、纠错和推理能力,从被动问答进化为主动提供洞察的专家顾问。在深入探讨 智能体RAG 之前,我们必须先直面一个现实:为什么大多数传统 RAG 系统表现平平,无法真正投入生产环境?它们主要存在以下五大痛点:痛点 1:盲目检索,无法处理歧义传统 RAG 算法,收到用户问题

qq_46094651的博客 1293

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Agentic RAG:超越传统RAG与案例分享

Agentic RAG 不仅仅是一种技术,更是一种思维方式。它代表了从被动检索到主动学习、从静态匹配到动态智能的巨大飞跃。AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,

star_nwe的博客 974

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

终结AI答非所问!LangGraph+自适应RAG保姆级拆解:手把手搭建企业级智能问答系统,一篇吃透!

Adaptive RAG(自适应检索增强生成)是一种先进的 RAG 策略,它智能地将动态查询分析与自我纠错机制相结合,以优化响应准确性。

m0_59235245的博客 870

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

RAG架构类型

纠错型RAG就像一个实时的事实核查工具,不仅生成响应,还会对比可靠数据源验证内容的准确性,从而减少错误。例如,一款新闻应用可以通过预测型RAG,分析用户搜索历史,推送与环保主题相关的热门文章。检索增强生成(Retrieval-Augmented Generation,简称RAG)架构正在改变信息的检索与处理方式,通过将检索能力与生成式人工智能结合,这种技术提升了准确性和上下文相关性,为满足用户的具体需求提供了强大的工具。选择合适的RAG架构,将帮助企业充分释放AI驱动的检索与生成能力,迈向更加智能的未来。

2301_79342058的博客 2162

收藏!从传统RAG到智能体RAG:构建能思考的企业知识大脑,彻底解决大模型五大痛点

构建一个像人一样思考的。

优快云_430422的博客 1403

【干货收藏】掌握Agentic RAG:构建动态自适应的大模型知识检索与生成系统

本文详细介绍Agentic RAG技术,一种融合动态查询分析和自我纠错机制的高级RAG策略。基于LangGraph和Qwen构建自适应系统,实现查询路由、动态知识获取和多阶段质量保障。通过完整代码示例,展示从状态管理到工作流构建的实践过程,帮助开发者构建能根据查询复杂度智能调整策略的RAG系统,提升AI知识获取和推理能力。

2401_84815887的博客 1077

RAG不再“傻白甜“:智能体RAG让大模型拥有“分析师“的大脑,小白也能秒变AI架构师!

智能体RAG是对传统RAG系统的革命性升级,解决了盲目检索、单兵作战、缺乏纠错、无深度洞察和数据处理粗糙五大痛点。通过构建"活"知识库、异构数据处理、结构化解析、语义分块和元数据生成,结合专家团队分工和自我规划推理引擎,使RAG能像人类分析师一样理解、规划、推理,提供决策支持而非简单搬运事实,让企业拥有"超级大脑"。

m0_56255097的博客 887

【RAG】32-纠错型RAG(CRAG):原理与案例

纠错型RAG通过引入反馈机制和轻量级检索评估器,显著提升了生成内容的准确性和可靠性。其在医疗、法律、教育、金融等多个领域具有广泛应用前景,能够有效避免错误信息和误导,提升用户体验和信任度。

rengang66的博客 632

从零开始构建Agentic RAG系统:LangGraph+Qwen打造智能自适应RAG

本文详细介绍Agentic RAG系统的构建方法,该系统融合动态查询分析和自我纠错机制,能够根据查询复杂度自适应选择检索与生成策略。

Langchain的博客 443

收藏!Agentic RAG深度解析:让AI从“能回答“走向“会思考“的技术突破

Agentic RAG是传统RAG的升级版,引入智能体能力实现动态推理。它能自主规划步骤、条件化检索、自我反思纠错,解决模糊问题和多跳推理等复杂场景。已在客户服务、医疗、金融等多个行业落地,具备目标驱动、多智能体协作等优势。2025年将成为AI应用落地的关键引擎,推动AI从简单回答到智能思考的进化。

大模型训练 1033

收藏必备!大模型困惑终结者:智能体RAG实战指南,小白也能轻松掌握

构建一个像人一样思考的。

xxue345678的博客 1457

【值得收藏】构建企业级智能体RAG系统:解决大模型五大痛点,让AI真正理解业务

智能体RAG(Agentic RAG)是传统RAG的进化形态,通过构建"活"的知识库和处理异构数据,解决了传统RAG的五大痛点:盲目检索、单兵作战、缺乏纠错、无法深度洞察和数据丢失。系统采用专家团队分工和自我规划、自我纠错的推理引擎,实现类似人类的理解、规划、推理能力,使大模型从"问答机"进化为"专家顾问",为企业提供决策支持。

2401_85154887的博客 1129

【Agent专题】揭秘自适应RAG+LangGraph:打造智能问答系统的终极组合!实战解析!

摘要:AdaptiveRAG是一种智能检索增强生成系统,通过动态查询分析和自我纠错机制优化响应准确性。该系统采用模块化架构,包含查询路由、文档检索、质量评估等核心组件,能根据查询复杂度自动选择单步检索、多跳推理或直接生成策略。关键技术包括基于LangGraph的状态管理、Google Gemini语言模型以及多级质量检查机制(文档相关性评分、幻觉检测、答案质量评估)。相比传统RAG,该系统具有更强的弹性和准确性,但存在计算成本高、响应延迟等挑战。文章详细介绍了系统架构、实现步骤(环境配置、文档摄取、节点实现

m0_59162248的博客 774
上一篇: 收藏!2026春招AI岗位爆发,程序员/小白必看,错过真要被行业甩身后
下一篇: 收藏!小白程序员必看:GraphRAG vs RAG,大模型知识检索新思路深度解析
冻感糕人~
博客等级 码龄3年 8926粉丝 2384原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值