收藏!小白程序员轻松入门大模型:CRAG技术详解与LangChain实战
本文详细介绍了CRAG纠正性检索增强生成技术一种先进的自然语言处理方法旨在提升基于检索的生成RAG技术的鲁棒性与准确性。通过引入轻量级检索评估器CRAG能够评估检索文档质量并据此触发不同的知识检索动作确保生成结果的准确性和可靠性。文章还结合LangChain框架中的LangGraph工具展示了CRAG技术的实际应用并简化了评估检索质量和知识精炼等步骤适合小白和程序员学习实践。通过本文读者可以了解CRAG的基本原理、实现方法并通过实例掌握其在实际应用中的部署。为了提高RAG的性能结合大模型的RAG技术涌现出很多的改进方案SELF-RAGAdaptive RAGCRAG等技术相继被提出今天就来介绍CRAG这个技术并采用langchain全家桶中的LangGraph框架实现CRAG。看看CRAG比传统RAG强多少。纠正性检索增强生成——CRAG纠正性检索增强生成Corrective Retrieval-Augmented GenerationCRAGhttps://arxiv.org/pdf/2401.15884 是一种先进的自然语言处理技术旨在提高基于检索的生成Retrieval-Augmented GenerationRAG方法的鲁棒性和准确性。CRAG通过引入一个轻量级的检索评估器来评估检索到的文档的质量并根据评估结果触发不同的知识检索动作以确保生成结果的准确性和可靠性。CRAG纠正性检索增强生成的工作流程如上方图所示主要包括以下几个步骤检索文档首先基于用户的查询系统执行检索操作以获取相关的文档或信息。评估检索质量CRAG使用一个轻量级的检索评估器对检索到的每个文档进行质量评估计算出一个量化的置信度分数。触发知识检索动作根据置信度分数CRAG将触发以下三种动作之一正确如果评估器认为文档与查询高度相关将采用该文档进行知识精炼。错误如果文档被评估为不相关或误导性CRAG将利用网络搜索寻找更多知识来源。模糊对于相关性不确定的文档CRAG会结合正确和错误的处理策略以提高检索的鲁棒性。知识精炼对于评估为正确的文档CRAG将进行知识精炼抽取关键信息并过滤掉无关信息。网络搜索在需要时CRAG会执行网络搜索以寻找更多高质量的知识来源以纠正或补充检索结果。分解-重组CRAG采用一种分解-重组算法将检索到的文档解构为关键信息块筛选重要信息并重新组织成结构化知识。生成文本最后利用经过优化和校正的知识提高了生成文本的准确性和鲁棒性。LangGraph简介LangGraph 是 LangChain 的一个重要扩展库它允许开发者构建基于大型语言模型LLMs的复杂应用特别是那些需要循环或多个智能体agents协作的应用。以下是 LangGraph 的一些关键特性和概念状态图StateGraphLangGraph 使用状态图来表示整个应用的状态图中的节点和边定义了应用的流程和逻辑4。节点Nodes在 LangGraph 中节点可以是任何可调用的 Python 函数也可以是 LangChain 中的可运行组件如链Chains或智能体Agents。每个节点执行特定的任务如推理、调用工具或生成响应。边Edges边定义了节点之间的连接和数据流。LangGraph 支持不同类型的边包括起始边Starting Edge定义任务的起始节点。普通边Normal Edge表示一个节点完成后立即跳转到下一个节点。条件边Conditional Edge基于条件函数的结果决定跳转到哪个节点4。循环和多智能体支持LangGraph 支持构建循环图允许智能体在循环中被调用直到任务完成。这对于需要迭代或多步骤交互的应用非常有用。状态管理LangGraph 允许开发者定义和维护一个中央状态对象该对象会根据节点的跳转不断更新。状态对象的属性可以自定义以适应不同的应用需求。LangGraph 设计为与框架无关这意味着每个节点都是一个常规的 Python 函数可以轻松地与现有的 Python 生态系统集成。LangGraph 扩展了 LangChain 表达式语言LCEL允许协调多个链或智能体提供了一种高级的 LCEL 语言使得逻辑更清晰。通过 LangGraph开发者可以创建出能够处理更复杂交互和循环逻辑的智能体应用从而推动基于大型语言模型的应用开发向更高级别的自动化和智能化发展。实战部分当然本次实现的不是完整版的CRAG相比于原论文简化了评估检索质量这一步和省掉了知识精炼和分解-重组这两个步骤。代码主要参考下方但是在llm模型,embeding模型以及prompt上做了一些修改。https://github.com/langchain-ai/langgraph/blob/main/examples/rag/langgraph_crag.ipynb初始化知识库和大模型LLM这里的向量服务器是采用xinference 本地部署的bge-base-zhv1.5,大模型部分采用的glm4免费送的一些tokenfrom langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.document_loaders import WebBaseLoader from langchain_community.vectorstores import Chroma from langchain_openai import OpenAIEmbeddings from langchain_community.embeddings import XinferenceEmbeddings ###向量服务 xinference XinferenceEmbeddings( server_url*, model_uidbge-base-zhv15 ) ###知识收集和预处理 urls [ https://spaces.ac.cn/archives/9907, https://spaces.ac.cn/archives/9920 ] 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_size250, chunk_overlap0 ) doc_splits text_splitter.split_documents(docs_list) # 向量入库 vectorstore Chroma.from_documents( documentsdoc_splits, collection_namerag-chroma, embeddingxinference, ) retriever vectorstore.as_retriever() ### 初始化llm llm ChatOpenAI( temperature0.95, modelglm-4, openai_api_key*, openai_api_basehttps://open.bigmodel.cn/api/paas/v4/ )搜索结果评价 agent的定义# 搜索结果评价 agent system 请扮演是一位评估检索文档与用户问题相关性的评分员。 如果文档包含与问题相关的关键词或语义请将其评为yes,否则评为no 直接给出yes 和 no .//n grade_prompt ChatPromptTemplate.from_messages( [ (system, system), (human, 以下是://n 检索文档: //n//n {document} //n//n 用户问题: {question}), ] ) retrieval_grader grade_prompt | llm | StrOutputParser() ##测试搜索结果评价 agent question 什么是cool paper docs retriever.get_relevant_documents(question) doc_txt docs[0].page_content print(retrieval_grader.invoke({question:question, document: doc_txt})) ## 评价结果 yesRAG agent的定义#RAG agent from langchain import hub from langchain_core.output_parsers import StrOutputParser prompt hub.pull(rlm/rag-prompt) # Post-processing def format_docs(docs): return //n//n.join(doc.page_content for doc in docs) rag_chain prompt | llm | StrOutputParser() generation rag_chain.invoke({context: docs, question: question}) print(generation) ## rag结果 Cool Papers是一个辅助科研人员刷论文的网站它逐日收录论文并提供了站内检索系统。该网站还引入了venue分支收录了如ICLR、IC等会议历年的论文集。Cool Papers的开发得到了GPT4和Kimi等人工智能模型的支持可以帮助用户快速了解论文内容。搜索query优化agent定义#搜索query 优化agent system 您是一位搜索query优化专家负责将搜索输入的问题转换成一个更优的版本一定不要改变原义更适合网络搜索,尽量精简一点 re_write_prompt ChatPromptTemplate.from_messages( [ (system, system), ( human, 这是用户的问题: //n//n {question} //n 请直接输出优化后的问题:, ), ] ) question_rewriter re_write_prompt | llm | StrOutputParser() question_rewriter.invoke({question: question}) ##优化结果 cool paper 定义及特点搜索工具定义### web Search 工具 from langchain_community.tools.tavily_search import TavilySearchResults import os os.environ[TAVILY_API_KEY] web_search_tool TavilySearchResults(k3) web_search_tool.invoke({query: 如何有效缩小毛孔})搜索结果如下[{url:https://beautyfoomall.com/blogs/news/毛孔大怎么办什么可以收缩毛孔,content:Dec 8, 2021 — Dec 8, 2021... 毛孔粗大。缩小面部毛孔可根据皮肤的不同种类进行治疗利用护肤品补水、射频、激光、食疗等方法是可以延缓皮肤衰老缩小面部毛孔 ... 有效Cellreturn/xa0...},{url:https://zhuanlan.zhihu.com/p/281404233,content:12种有效方法收缩毛孔的教你怎么样让毛孔变小 · 1、化妆前可以用冰凉的毛巾收缩紧致毛孔 · 2、使用化妆棉创造水嫩豆腐肌 · 3、多喝水从内到外让肌肤水水 · 4、用饭团搓/xa0...},{url:https://fashion.sina.cn/zl/2016-06-23/detail-ifxtmses0755122.d.html,content:Jun 22, 2016 — Jun 22, 2016鸡蛋橄榄油鸡蛋打散加入橄榄油搅匀敷脸15分钟洗干净。如果蛋液能放在冰箱里冰镇效果更好不仅可以收缩毛孔还可以美白。},{url:https://www.zhihu.com/question/40366369,content:Feb 14, 2016 — Feb 14, 2016从目前来看用护肤品把毛孔“彻底缩小”的确有难度不过要让毛孔暂时一段时间内“视觉上缩小”还是有办法的。 反对那种一谈毛孔粗大就建议别人去医美的言论/xa0...},{url:https://skintypesolutions.com/zh/blogs/皮肤护理/皮肤科医生建议如何收缩毛孔,content:Nov 14, 2023 — Nov 14, 2023在这篇文章中我将解释导致毛孔扩大的原因并提供基于证据的策略来帮助缩小毛孔并使其不那么明显。 我将帮助您找到最好的毛孔缩小剂产品和美容程序。}]流程图的定义###定义agent graph from langchain.schema import Document from typing_extensions import TypedDict from typing import List class GraphState(TypedDict): Represents the state of our graph. Attributes: question: question generation: LLM generation web_search: whether to add search documents: list of documents question: str generation: str web_search: str documents: List[str] def retrieve(state): Retrieve documents Args: state (dict): The current graph state Returns: state (dict): New key added to state, documents, that contains retrieved documents print(---RETRIEVE---) question state[question] # Retrieval documents retriever.get_relevant_documents(question) print(documents[0]) return {documents: documents, question: question} def generate(state): Generate answer Args: state (dict): The current graph state Returns: state (dict): New key added to state, generation, that contains LLM generation print(---GENERATE---) question state[question] documents state[documents] # RAG generation generation rag_chain.invoke({context: documents, question: question}) return {documents: documents, question: question, generation: generation} def grade_documents(state): Determines whether the retrieved documents are relevant to the question. Args: state (dict): The current graph state Returns: state (dict): Updates documents key with only filtered relevant documents print(---CHECK DOCUMENT RELEVANCE TO QUESTION---) question state[question] documents state[documents] # Score each doc filtered_docs [] web_search No for d in documents: score retrieval_grader.invoke( {question: question, document: d.page_content} ) ifyesin score: print(---GRADE: DOCUMENT RELEVANT---) filtered_docs.append(d) else: print(---GRADE: DOCUMENT NOT RELEVANT---) web_search Yes continue return {documents: filtered_docs, question: question, web_search: web_search} def transform_query(state): Transform the query to produce a better question. Args: state (dict): The current graph state Returns: state (dict): Updates question key with a re-phrased question print(---TRANSFORM QUERY---) question state[question] documents state[documents] # Re-write question better_question question_rewriter.invoke({question: question}) print(优化后的qurey是 better_question) return {documents: documents, question: better_question} def web_search(state): Web search based on the re-phrased question. Args: state (dict): The current graph state Returns: state (dict): Updates documents key with appended web results print(---WEB SEARCH---) question state[question] documents state[documents] # Web search docs web_search_tool.invoke({query: question}) web_results //n.join([d[content] for d in docs]) print(搜索结果是 web_results) web_results Document(page_contentweb_results) documents.append(web_results) return {documents: documents, question: question} ### Edges def decide_to_generate(state): Determines whether to generate an answer, or re-generate a question. Args: state (dict): The current graph state Returns: str: Binary decision for next node to call print(---ASSESS GRADED DOCUMENTS---) question state[question] web_search state[web_search] filtered_documents state[documents] if web_search Yes: # All documents have been filtered check_relevance # We will re-generate a new query print( ---DECISION: ALL DOCUMENTS ARE NOT RELEVANT TO QUESTION, TRANSFORM QUERY--- ) returntransform_query else: # We have relevant documents, so generate answer print(---DECISION: GENERATE---) returngenerate from langgraph.graph import END, StateGraph workflow StateGraph(GraphState) # Define the nodes workflow.add_node(retrieve, retrieve) # retrieve workflow.add_node(grade_documents, grade_documents) # grade documents workflow.add_node(generate, generate) # generatae workflow.add_node(transform_query, transform_query) # transform_query workflow.add_node(web_search_node, web_search) # web search # Build graph workflow.set_entry_point(retrieve) workflow.add_edge(retrieve, grade_documents) workflow.add_conditional_edges( grade_documents, decide_to_generate, { transform_query: transform_query, generate: generate, }, ) workflow.add_edge(transform_query, web_search_node) workflow.add_edge(web_search_node, generate) workflow.add_edge(generate, END) # Compile app workflow.compile()流程图的可视化from IPython.display import Image, display try: display(Image(app.get_graph(xrayTrue).draw_mermaid_png())) except: # This requires some extra dependencies and is optional pass流程图可视化结果开始问问题第一个是知识库有的问题所以走的是左边的路线直接本地rag后检索质量评估结果不错最终生成结果。Cool Papers是一个用于刷论文的辅助网站开发者曾在博客中分享其开发体验和更新进度。该网站逐日收录论文并经历了几次较大的变化如引入venue分支收录了一些会议历年的论文集。随着时间的积累Cool Papers还增加了一个站内检索系统以提高检索效率。from pprint import pprint # Run inputs {question: Cool Papers 是什么} for output in app.stream(inputs): for key, value in output.items(): # Node pprint(fNode {key}:) # Optional: print full state at each node # pprint.pprint(value[keys], indent2, width80, depthNone) pprint(---------------------------------) # Final generation pprint(value[generation])第一个是知识库没有的问题所以走的是右边的路线直接本地rag后检索质量评估结果很差然后走web搜索rag 生成结果有效缩小毛孔的方法包括1. 使用鸡蛋和橄榄油自制面膜敷脸冰镇后效果更佳2. 化妆前用冰凉的毛巾敷脸帮助收缩毛孔3.多喝水保持肌肤水润。此外还可以根据皮肤类型选择合适的护肤品和美容程序进行毛孔缩小治疗from pprint import pprint # Run inputs {question: 如何缩小毛孔} for output in app.stream(inputs): for key, value in output.items(): # Node pprint(fNode {key}:) # Optional: print full state at each node # pprint.pprint(value[keys], indent2, width80, depthNone) pprint(---------------------------------) # Final generation pprint(value[generation])最后2026年技术圈的分化愈发明显降薪裁员潮持续蔓延传统开发、测试等岗位大批缩水不少从业者陷入职业焦虑与之形成鲜明对比的是AI大模型相关岗位迎来疯狂扩招薪资逆势飙升150%大厂更是直接开出70-100W年薪疯抢具备实战能力的大模型人才甚至放宽年龄限制只求能快速落地技术、创造价值很多程序员、职场新人纷纷入局大模型领域绝非盲目跟风而是实实在在看到了不可替代的价值优势这也是2026年最值得抓住的职业风口1、窗口期红利入门门槛友好不同于成熟赛道的“内卷式招聘”2026年大模型人才缺口巨大简历只要达标掌握基础AI应用具备简单项目经验年龄、学历均非硬性要求小白可快速入门转行程序员也能无缝衔接2、技术可复用上手速度翻倍如果你有前后端开发、测试、数据分析等基础在大模型落地、系统部署、Prompt工程等环节会更具优势无需从零开始复用原有技术能力就能快速进阶3、懂业务更吃香竞争力翻倍单纯懂技术已不够2026年大厂更看重“技术业务”的复合型人才有垂直领域金融、医疗、工业等经验者能精准定位模型落地痛点薪资比纯技术岗高出30%以上更重要的是即便没有转型需求用AI大模型工具为工作赋能、提升效率也已经成为80%企业的硬性要求——不会用大模型提效未来很可能被行业淘汰那么2026年小白/程序员该如何高效学习大模型很多人想入门大模型却陷入两大困境要么到处搜集零散资料不成体系越学越懵要么被收费高昂的课程割韭菜花了钱却学不到实战技能白白浪费时间走弯路。今天就给大家精心整理了一份2026年最新、免费、系统化的AI大模型学习资源包覆盖从零基础入门到商业实战、从理论沉淀到面试通关的全流程所有资料均已整理归档无需拼凑直接领取就能上手学习小白可照做程序员可进阶扫码免费领取全部内容1、大模型系统化学习路线这份学习路线结合2026年行业趋势和新手学习规律由行业专家精心设计从零基础到精通每一步都有明确指引帮你节省80%的无效学习时间少走弯路、高效进阶避免踩坑。2、从0到进阶大模型学习视频教程从入门到进阶这里都有跟着老师学习事半功倍。3、大模型学习书籍电子文档涵盖2026年最新技术要点包括基础入门、Transformer核心原理、Prompt工程、RAG实战、模型微调与部署等内容4、AI大模型最新行业报告报告包含腾讯、阿里、甲子光年等权威机构发布的核心内容还有2026年中文大模型基准测评报告、AI Agent行业研究报告等帮你站在行业前沿把握技术风口。5、大模型项目实战配套源码项目包含Deepseek R1、GPT项目、MCP项目、RAG实战等热门方向还有视频配套代码手把手教你从0到1完成项目开发既能练手提升技术又能丰富简历为求职和职业发展加分。6、2026大模型大厂面试真题2026年大模型面试已全面升级不再单纯考察基础原理而是转向侧重技术落地和业务结合的综合考察很多程序员和新手因为缺乏针对性准备明明技术不错却在面试中失利。适用人群四阶段学习规划共90天可落地执行第一阶段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 项目内容安全互联网信息服务算法备案…扫码免费领取全部内容7、这些资料真的有用吗这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】https://mp.weixin.qq.com/s/UNAD6ZS5p0eofHdSwaZvvg