智能体4- RAG 技术详解
2025-11-16 本文已影响0人
R7_Perfect
在前几篇文章中,我们构建了一个基础 Agent,理解了其决策逻辑(ReAct)并通过提示工程提升了智能水平。但你是否遇到过这样的问题:
?Agent 回答不了你私有文档中的问题,比如企业内部手册、PDF 报告或技术文档。
这正是 RAG(Retrieval-Augmented Generation)技术要解决的问题。今天,我们就来揭开它的面纱,并实战打造一个能读懂你文档的智能 Agent。
1. 什么是 RAG?
RAG(检索增强生成)是一种 将检索(Retrieval)与生成(Generation)结合起来 的方法。它的基本思路是:
- 从外部知识库中检索相关信息(如你的文档);
- 把检索结果作为上下文提供给语言模型;
- 语言模型据此进行回答生成。
它的目标是弥补语言模型“只知训练前知识”的缺陷,让 Agent 实时“读文档、查资料”。
2. 核心架构解析
RAG 架构由以下几部分组成:
┌────────────┐
│ 用户提问 │
└────┬───────┘
↓
┌────────────┐
│ 检索组件(向量库)│ ← 从文档中检索相关信息
└────┬───────┘
↓
┌────────────┐
│ 语言模型(LLM) │ ← 根据检索信息生成答案
└────┬───────┘
↓
┌────────────┐
│ 返回答案 │
└────────────┘
关键组件包括:
- 文档加载与切分(Loader & Splitter)
- 向量化存储(Vector Store)
- 语言模型集成(LLM + Prompt)
- 查询链路(RetrievalQA Chain)
3. 实战:让 Agent 读懂你的 PDF 文档
Step 1:安装所需依赖
pip install langchain openai faiss-cpu pypdf tiktoken
pip install -U sentence-transformers
测试文档内容:
ee95a464-55ce-486d-be61-3286686ab3c3.png
import os
# 配置 Hugging Face 镜像源,解决连接超时问题
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.embeddings import OpenAIEmbeddings, HuggingFaceEmbeddings, HuggingFaceBgeEmbeddings
# 1. 加载文档
loader = PyPDFLoader("C:/Users/XX/RAG测试.pdf")
pages = loader.load()
# 2. 文本切分
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)#每个文本块的最大字符数为500。,相邻文本块之间会有50个字符的重叠部分。这种设计可以确保在分块时不会丢失上下文信息。
docs = text_splitter.split_documents(pages)
# 3. 构建向量数据库
# embedding_model = OpenAIEmbeddings()
# 创建中文 Embedding 模型(bge-small-zh)
embedding_model = HuggingFaceBgeEmbeddings(
model_name="BAAI/bge-small-zh-v1.5",# https://huggingface.co/BAAI/bge-small-zh-v1.5
model_kwargs={"device": "cpu"}, # 如果你有 GPU,可改为 "cuda"
encode_kwargs={"normalize_embeddings": True} # 官方推荐开启
)
if __name__ == "__main__":
text = "上海市天气状况"
embeddings = embedding_model.embed_query(text)
print(embeddings)
输出:
[-0.029581082984805107,
0.022155417129397392,
-0.04619835689663887,
0.002687456551939249,
0.010141762904822826,
0.03677787631750107,
-0.04895878955721855,
0.03459969907999039,
0.09580954164266586,
-0.00027241400675848126,
0.0484747588634491,
-0.21692204475402832,
-0.01903385855257511,
-0.009855132550001144,
0.014768422581255436,
-0.043791916221380234,
-0.019390679895877838,
-0.031548622995615005,
-0.002949550049379468,
-0.014980154111981392,
-0.024507658556103706,
-0.030062075704336166,
-0.07023793458938599,
-0.02528921142220497,
0.007703866809606552,
-0.09330738335847855,
0.03910378739237785,
-0.020433424040675163,
0.009958695620298386,
-0.026872482150793076,
0.000924916414078325,
-0.02778564766049385,
0.007053080480545759,
-0.0014056081417948008,
0.007186720613390207,
-0.05270468071103096,
-0.05986092612147331,
0.027881652116775513,
0.005776677746325731,
0.017728574573993683,
0.008879763074219227,
0.007373031694442034,
0.027590926736593246,
-0.06738419830799103,
0.010412726551294327,
-0.10702558606863022,
-0.03855978697538376,
0.008076646365225315,
0.032585930079221725,
-0.0485864132642746,
-0.021173125132918358,
0.024873506277799606,
0.0369960218667984,
0.004002674482762814,
0.03225691244006157,
-0.022109180688858032,
0.011464200913906097,
0.010257992893457413,
-0.05303194373846054,
-0.016110176220536232,
0.04336193576455116,
-0.07163885235786438,
-0.029887154698371887,
0.01938614435493946,
0.08808805048465729,
-0.0467386469244957,
0.07544055581092834,
0.109442800283432,
-0.014677125960588455,
0.07013051211833954,
0.036154039204120636,
0.08296218514442444,
0.012313615530729294,
-0.011081286706030369,
0.009447846561670303,
-0.09093211591243744,
0.06732100993394852,
-0.02177753672003746,
-0.02515346370637417,
-0.05090457946062088,
-0.028196994215250015,
-0.025511600077152252,
0.059230003505945206,
0.031319279223680496,
0.0394548699259758,
0.05243581160902977,
-0.03575890138745308,
0.013352020643651485,
-0.0721338614821434,
0.023060260340571404,
0.027560178190469742,
-0.05931586027145386,
0.03257621452212334,
-3.7858259020140395e-05,
-0.04163965582847595,
0.012193480506539345,
0.021681170910596848,
-0.019847555086016655,
-0.05604814365506172,
-0.017278164625167847,
0.0097498232498765,
0.00300241494551301,
0.013053897768259048,
-0.0468081533908844,
0.021521251648664474,
0.07034935802221298,
0.012573327869176865,
-0.06910377740859985,
-0.01426085364073515,
0.03446565195918083,
-0.049614351242780685,
-0.0065774754621088505,
-0.016060633584856987,
0.04321311414241791,
-0.07330174744129181,
-0.08036684989929199,
0.007330489344894886,
0.06236322969198227,
0.08720891922712326,
-0.007945498451590538,
-0.03989185020327568,
-0.06663037836551666,
0.013987690210342407,
0.007703692186623812,
-0.04371108114719391,
-0.0273507758975029,
0.047642555087804794,
0.07320704311132431,
0.04516744986176491,
-0.007409409154206514,
-0.0037812672089785337,
0.02378752827644348,
0.032275810837745667,
-0.034093018621206284,
0.007756748236715794,
0.08698706328868866,
0.008446742780506611,
-0.04274335503578186,
-0.09433849155902863,
-0.029773591086268425,
0.04020163416862488,
0.020276345312595367,
-0.03222506120800972,
-0.0019099218770861626,
0.02948644943535328,
0.038597892969846725,
-0.031150316819548607,
0.0040572346188127995,
0.07499624788761139,
-0.031739555299282074,
-0.011143614538013935,
-0.022619804367423058,
0.0842561423778534,
0.032799381762742996,
0.025393430143594742,
-0.01476184744387865,
-0.017185749486088753,
-0.02925422228872776,
0.009812276810407639,
0.031155163422226906,
0.0052347565069794655,
0.03880435228347778,
0.022860417142510414,
-0.008190670050680637,
0.011060738936066628,
0.02558198757469654,
-0.013422590680420399,
-0.020426670089364052,
-0.06882493942975998,
0.03701121360063553,
0.02496282197535038,
-0.013558566570281982,
0.02956872247159481,
0.04057662561535835,
-0.026752570644021034,
-0.03817496821284294,
-0.06168525293469429,
-0.01810268498957157,
0.039884235709905624,
-0.0025339419953525066,
-0.007495837286114693,
-0.018164576962590218,
0.023259077221155167,
0.014820203185081482,
-0.04873059317469597,
0.053648874163627625,
-0.030041983351111412,
-0.02676224149763584,
0.00334513233974576,
-0.020351406186819077,
-0.010845586657524109,
0.0787864476442337,
-0.027445493265986443,
-0.017500724643468857,
-0.05747588723897934,
0.019175611436367035,
-0.017072703689336777,
-0.018190555274486542,
0.06221124157309532,
-0.01999807171523571,
0.006884825881570578,
-0.0446302630007267,
0.031226254999637604,
-0.02786775678396225,
-0.04582912474870682,
-0.007599995471537113,
-0.025826331228017807,
0.00662388326600194,
-0.010066195391118526,
-0.07126403599977493,
-0.05654437094926834,
0.0485161729156971,
-0.06677820533514023,
0.03826065734028816,
-0.008212820626795292,
-0.00975006353110075,
-0.016371876001358032,
-0.022342292591929436,
-0.00944227259606123,
-0.09022392332553864,
0.027809273451566696,
-0.00200494728051126,
-0.0016295951791107655,
-0.04274249076843262,
-0.06343556940555573,
-0.09267628937959671,
0.04708093777298927,
0.08940928429365158,
0.006199372932314873,
-0.013457401655614376,
-0.06720450520515442,
-0.055025599896907806,
-0.027209382504224777,
-0.007819680497050285,
0.022493645548820496,
0.004066400229930878,
-0.06924054026603699,
0.023265928030014038,
-0.027737492695450783,
-0.05939890071749687,
-0.05631876736879349,
0.08118132501840591,
-0.023511674255132675,
-0.013185502961277962,
-0.07219626009464264,
0.029771536588668823,
-0.02602853812277317,
-0.002246093936264515,
-0.010793900117278099,
0.009755536913871765,
0.053925205022096634,
0.05732940509915352,
-0.032105494290590286,
-0.034966159611940384,
-0.009195197373628616,
-0.003296246286481619,
0.009593765251338482,
0.017353933304548264,
0.004402955062687397,
-0.008712057955563068,
-0.05000261962413788,
-0.002712557092308998,
0.04883212968707085,
0.04871518164873123,
0.00375741277821362,
-0.057366546243429184,
-0.022058794274926186,
0.010861690156161785,
-0.08082834631204605,
0.042300961911678314,
0.015573784708976746,
0.11176961660385132,
-0.007374265231192112,
-0.054080620408058167,
0.01601879484951496,
0.05210829898715019,
-0.0335308201611042,
0.06114539876580238,
0.04900650680065155,
0.0025496669113636017,
0.04523054510354996,
0.06247855722904205,
-0.032102666795253754,
-0.029229121282696724,
0.006608746014535427,
0.10031294077634811,
0.0024874676018953323,
-0.009278949350118637,
-0.027631787583231926,
0.005159436725080013,
0.06684834510087967,
0.006706679239869118,
-0.04779854416847229,
0.11411220580339432,
0.021618861705064774,
-0.014722159132361412,
0.05092679336667061,
-0.01123471837490797,
0.05763058736920357,
0.05128065496683121,
0.036188047379255295,
0.0708170086145401,
0.0006362973363138735,
-0.013267140835523605,
0.021230073645710945,
-0.04462089017033577,
0.022951003164052963,
-0.0016219048993662,
-0.0747874453663826,
-0.016802098602056503,
0.012379789724946022,
0.052043285220861435,
-0.0037224823608994484,
-0.04406362026929855,
-0.002615549834445119,
-0.032415084540843964,
-0.036220453679561615,
0.04676026105880737,
-0.017956405878067017,
0.0406663678586483,
-0.0435938686132431,
0.011282160878181458,
-0.06804706901311874,
-0.0670110285282135,
0.03646094724535942,
-0.06799977272748947,
0.005664198659360409,
-0.04688825085759163,
0.054888930171728134,
0.020895013585686684,
0.0077871656976640224,
-0.025069132447242737,
-0.02426554262638092,
-0.011246866546571255,
0.041307345032691956,
-0.020825063809752464,
-0.04736502096056938,
-0.04552030190825462,
0.03366156294941902,
0.1390589475631714,
0.011093148961663246,
0.07668657600879669,
0.052095573395490646,
0.013390700332820415,
0.022842856124043465,
0.04040932655334473,
-0.07884978502988815,
0.003041305812075734,
0.08930332213640213,
0.01545032300055027,
-0.0775429755449295,
0.022095341235399246,
0.0120274992659688,
-0.04367924481630325,
-0.016639458015561104,
-0.026526933535933495,
0.03542771935462952,
-0.028491081669926643,
-0.046982258558273315,
0.03229294344782829,
-0.0032153897918760777,
0.05781954154372215,
-0.047234538942575455,
-0.06887222826480865,
-0.022620709612965584,
0.034946419298648834,
0.11225811392068863,
0.0385381281375885,
0.016253728419542313,
0.06474976241588593,
-0.028245095163583755,
-0.07231568545103073,
-0.018982447683811188,
-0.06743544340133667,
-0.00928095355629921,
-0.10409951210021973,
-0.07531958818435669,
-0.019483957439661026,
-0.09116016328334808,
-0.05183156952261925,
-0.013794034719467163,
0.016460951417684555,
-0.03199610859155655,
-0.0019153050379827619,
0.053948547691106796,
-0.023286260664463043,
-0.09582950919866562,
0.03202613815665245,
-0.01271121297031641,
-0.011089911684393883,
0.05345475673675537,
-0.04238029941916466,
-0.022892385721206665,
0.04883420094847679,
-0.02739003114402294,
-0.05549647659063339,
-0.02442680113017559,
-0.03150840476155281,
0.0006097604054957628,
0.007694205269217491,
0.06774550676345825,
-0.02038797177374363,
-0.022677071392536163,
-0.02078733593225479,
0.006485678255558014,
0.004761992953717709,
0.03178132697939873,
-0.014621642418205738,
-0.049014896154403687,
-0.11637595295906067,
0.21096882224082947,
-0.013522438704967499,
-0.006711671128869057,
-0.030247721821069717,
0.024793187156319618,
-0.028583263978362083,
0.02579299733042717,
0.044492628425359726,
-0.030177423730492592,
0.006305207498371601,
0.024016885086894035,
-0.013268264010548592,
0.0015033718664199114,
0.031001480296254158,
0.017414629459381104,
-0.03929337486624718,
-0.04721375182271004,
-0.02145463414490223,
-0.07702650874853134,
-0.06076524034142494,
0.01099892146885395,
-0.020620550960302353,
0.08999831974506378,
0.06721369177103043,
-0.004079548176378012,
-0.01055802684277296,
-0.00045605486957356334,
-0.030186429619789124,
-0.044606804847717285,
-0.035494450479745865,
-0.043613094836473465,
0.042755089700222015,
-0.004491761326789856,
0.020326124504208565,
0.032661329954862595,
-0.012807102873921394,
-0.031438495963811874,
0.01026603952050209,
-0.0018758135847747326,
0.041009653359651566,
0.0621202178299427,
0.08519697934389114,
-0.0016214540228247643,
-0.020816177129745483,
-0.049766577780246735,
0.028006555512547493,
-0.02752542681992054,
-0.014226979576051235,
0.02348148450255394,
-0.03176003694534302,
-0.02179534360766411,
0.057814013212919235,
0.040064748376607895,
0.031242692843079567,
-0.013603942468762398,
0.056134361773729324,
-0.038844574242830276,
0.0333402194082737,
0.013119315728545189,
-0.06893086433410645,
0.0037132888101041317,
0.02886112965643406,
-0.019278228282928467,
0.05461926758289337,
0.0033744771499186754,
0.010521464981138706,
-0.07069475948810577,
-0.03058553673326969,
-0.04047008976340294,
-0.020317399874329567,
-0.052351295948028564,
-0.007341762073338032,
0.02224370837211609,
-0.0451950766146183,
-0.03361283615231514,
0.09131401777267456,
0.02667008526623249,
0.03898905962705612,
-0.01065791118890047,
0.036934662610292435,
-0.0310208760201931,
0.0028870904352515936,
0.054987672716379166,
-0.02622821554541588,
0.019161203876137733,
0.03416365012526512,
0.0012859031558036804,
-0.03643832355737686,
-0.02176753804087639,
0.051700931042432785,
-0.0013403559569269419,
-0.06263616681098938,
0.054123613983392715,
0.03554295748472214,
-0.040640730410814285,
-0.03242940828204155,
0.017252136021852493,
0.04750048369169235,
0.011804022826254368,
0.06699083000421524,
0.03728321194648743,
-0.023722195997834206]
假设某个3维简化版本:
-
文本 "上海市天气状况" → (0.8, -0.2, 0.5)
- 维度1 (0.8):可能代表"地名"特征很强
- 维度2 (-0.2):可能代表"时间"特征较弱
- 维度3 (0.5):可能代表"天气"特征中等
-
语义相似的文本在向量空间中距离更近
- 例如 "北京天气" → (0.7, -0.1, 0.6) 与 "上海市天气状况" 距离很近
- 例如 "吃饭了吗" → (-0.3, 0.9, -0.2) 与上述向量距离很远
接下去让大模型来处理向量库
db = FAISS.from_documents(docs, embedding_model)
# retriever = db.as_retriever()
# results = retriever.get_relevant_documents("文档中提到的某个关键词")
#
# for i, doc in enumerate(results):
# print(f"匹配结果 {i+1}: {doc.page_content}")
# 4. 初始化语言模型
API_KEY = os.getenv('DEEPSEEK_API_KEY')
llm = ChatOpenAI(
model='deepseek-chat',
openai_api_key=API_KEY,
openai_api_base='https://api.deepseek.com/v1'
)
# 5. 构建 RAG 问答链
rag_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=db.as_retriever(),
return_source_documents=True
)
输出:
根据提供的上下文,上海市的天气状况对应编号 **2**。但具体天气信息(如温度、天气现象等)未在上下文中详细说明。建议您通过天气预报平台或应用查询实时天气详情。
符合PDF中的内容
4. 提示工程与 RAG 协同进化
在 RAG 的基础上使用提示工程,可以进一步优化智能体行为,比如:
- 指定回答格式:“请分点概括”
- 控制输出风格:“用专业语气简洁回答”
- 加入角色设定:“你是文档分析专家”
这使得你的 Agent 不仅“知其然”,更能“言之有物”。
5. 小结与展望
本篇文章我们系统学习了 RAG 技术的原理与实战方法。它是让 Agent 融入私有知识的重要路径,也是实现“个性化智能体”的关键一环。