{ "cells": [ { "cell_type": "code", "execution_count": 4, "id": "cf7f3510", "metadata": {}, "outputs": [], "source": [ "from pymilvus import MilvusClient, DataType\n", "\n", "# 连接 Milvus 服务(默认端口 19530)\n", "client = MilvusClient(uri=\"http://localhost:19530\")" ] }, { "cell_type": "code", "execution_count": 6, "id": "3d9ba158", "metadata": {}, "outputs": [], "source": [ "dimension = 1024 # 向量维度,需要和 Embedding 模型的输出维度一致\n", "collection_name = \"demo_collection\"\n", "metric_type = \"COSINE\" # 余弦相似度,适合文本语义匹配\n", "\n", "# ---- 第一步:定义 Schema ----\n", "# Schema 描述了集合中每条数据的结构\n", "schema = client.create_schema()\n", "# 主键字段,INT64 类型,自动递增\n", "schema.add_field(field_name=\"id\", is_primary=True, auto_id=True, datatype=DataType.INT64)\n", "# 向量字段,存储文本的 Embedding 表示\n", "schema.add_field(field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=dimension)\n", "# 文本字段,存储原始文本内容\n", "schema.add_field(field_name=\"text\", datatype=DataType.VARCHAR, max_length=2000)\n", "\n", "# ---- 第二步:创建集合 ----\n", "# 如果已存在同名集合,先删除(开发阶段用,生产环境慎用)\n", "if client.has_collection(collection_name):\n", " client.drop_collection(collection_name)\n", "\n", "client.create_collection(\n", " collection_name=collection_name,\n", " schema=schema,\n", " metric_type=metric_type,\n", ")\n", "\n", "# ---- 第三步:创建索引 ----\n", "# 索引决定了向量检索的速度和精度平衡\n", "index_params = MilvusClient.prepare_index_params()\n", "index_params.add_index(\n", " field_name=\"vector\",\n", " index_type=\"AUTOINDEX\", # 自动选择最优索引,适合大多数场景\n", ")\n", "client.create_index(\n", " collection_name=collection_name,\n", " index_params=index_params\n", ")" ] }, { "cell_type": "code", "execution_count": 7, "id": "52d1b99e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "成功插入 5 条数据\n" ] } ], "source": [ "from langchain_community.embeddings import DashScopeEmbeddings\n", "from dotenv import load_dotenv\n", "import os\n", "\n", "load_dotenv()\n", "api_key = os.getenv('QWEN_API_KEY')\n", "\n", "# 初始化 Embedding 模型(这里用阿里通义的 text-embedding-v3)\n", "embedding_model = DashScopeEmbeddings(\n", " model=\"text-embedding-v3\",\n", " dashscope_api_key=\"sk-6af01b3077774064abef9af95c388892\" # 替换为你的真实 API Key\n", ")\n", "\n", "# 准备一些测试文本\n", "docs = [\n", " \"Milvus 就像是一个专门存放‘向量’的超级仓库,能在几毫秒内从千万级数据中找出最相似的片段。\",\n", " \"RAG 技术的本质,就是给大模型配上一个能随时查阅的‘外部外挂大脑’(知识库)。\",\n", " \"大模型之所以聪明,是因为它通过多层神经网络,学会了文字背后的隐藏含义和逻辑关系。\",\n", " \"为了应对不同的数据量,向量数据库提供了多种‘索引’策略,选对了索引,检索速度能快十倍。\",\n", " \"Embedding 就像是一座桥梁,把人类看得懂的文字,翻译成了计算机能算得清楚的空间坐标。\"\n", "]\n", "\n", "# 将文本转为向量并组装成插入数据\n", "data = []\n", "for doc in docs:\n", " vector = embedding_model.embed_query(doc) # 文本 → 向量\n", " data.append({\"vector\": vector, \"text\": doc})\n", "\n", "# 批量插入\n", "res = client.insert(\n", " collection_name=collection_name,\n", " data=data\n", ")\n", "print(f\"成功插入 {len(data)} 条数据\")" ] }, { "cell_type": "code", "execution_count": null, "id": "62b1a254", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'id': 467404046897263742, 'distance': 0.7400630712509155, 'entity': {'id': 467404046897263742, 'text': 'Milvus 就像是一个专门存放‘向量’的超级仓库,能在几毫秒内从千万级数据中找出最相似的片段。', 'vector': [-0.06820037961006165, 0.021867545321583748, -0.05982557311654091, 0.039896637201309204, -0.07863011211156845, -0.006547662429511547, -0.018707606941461563, 0.05156708508729935, 0.0268497783690691, 0.06378033757209778, -0.03601941466331482, 0.007967695593833923, 0.0332665853202343, 0.043735090643167496, 0.06707598268985748, -0.03245236724615097, -0.01273668184876442, -0.03192894160747528, 0.010856227949261665, -0.0902617797255516, -0.02085946686565876, -0.0029442673549056053, 0.014840076677501202, 0.042455606162548065, 0.03117288462817669, 0.06754124909639359, -0.060562245547771454, -0.02014218084514141, 0.0446656234562397, -0.04451053589582443, 0.016933778300881386, -0.041176121681928635, 0.033945098519325256, -0.012232642620801926, -0.02394185960292816, 0.0044806175865232944, -0.026539601385593414, -0.007996775209903717, -0.07638131827116013, -0.009087244980037212, -0.029525063931941986, -0.001023829565383494, 0.011292415671050549, -0.036600999534130096, 0.020801309496164322, -0.0664943978190422, -0.0016853809356689453, -0.06695966422557831, -0.027024254202842712, -0.026345739141106606, -0.009605823084712029, 0.010555743239820004, 0.008684982545673847, 0.02498871088027954, 0.06664948910474777, 0.026675304397940636, -0.01486915536224842, -0.01439419575035572, -0.004165593069046736, -0.03088209219276905, 0.008074319921433926, 0.021790001541376114, -0.03107595257461071, 0.017544440925121307, 0.041369982063770294, 0.08747018128633499, -0.018969319760799408, 0.01142811868339777, 0.0030581606552004814, -0.029389360919594765, -0.016177719458937645, 0.03958646208047867, -0.018843309953808784, -0.010672059841454029, -0.03667854145169258, -0.012484662234783173, 0.0055444310419261456, -0.01677868887782097, -0.04404526948928833, -0.02551213651895523, 0.08925370126962662, -0.0016902275383472443, -0.004584817681461573, -0.012145405635237694, -0.00988207571208477, 0.04908566176891327, -0.004279486369341612, 0.0190080925822258, 0.005786757450550795, 0.042882099747657776, 0.02403879165649414, -0.018329577520489693, -0.00898062065243721, -0.08087889850139618, -0.030707616358995438, -0.015169640071690083, -0.014539591036736965, 0.034468524158000946, 0.06998389959335327, 0.013386117294430733, -0.02584169991314411, 0.015906313434243202, -0.009179328568279743, -0.03853961080312729, 0.03997418284416199, -0.006693058647215366, 0.010478198528289795, 0.04427790269255638, -0.04253315180540085, -0.01776738092303276, 0.029486291110515594, 0.008941848762333393, -0.025686610490083694, 0.007100167218595743, -0.03464299812912941, -0.019967705011367798, -0.026287581771612167, -0.026675304397940636, 0.020471744239330292, -0.008093705400824547, -0.003552506910637021, 0.00681906845420599, 0.01877545937895775, -0.021945089101791382, -0.044588081538677216, -0.056762564927339554, 0.01587723381817341, 0.04947338253259659, 0.011001624166965485, 0.008854610845446587, 0.003971731755882502, 0.05397096276283264, 0.028865935280919075, 0.00468174833804369, -0.03536028787493706, -0.0884007140994072, 0.017844924703240395, 0.019318269565701485, -0.009310184977948666, -0.0394507572054863, 0.04924074932932854, -0.0027988713700324297, -0.039373211562633514, -0.011796454899013042, 0.0063344151712954044, -0.029660766944289207, 0.03745398670434952, 0.07184496521949768, -0.02626819536089897, -0.06091119349002838, 0.012193870730698109, 0.007783527951687574, 0.03881101682782173, -0.008951541967689991, 0.00926656648516655, 0.02409694902598858, -0.01862036995589733, 0.013822305016219616, -0.0072794887237250805, 0.02442651428282261, 0.03130858764052391, -0.122597835958004, -0.03890794515609741, 0.01486915536224842, 0.02213895134627819, 0.021402278915047646, 0.028478212654590607, 0.027063025161623955, -0.03574800863862038, -0.050481460988521576, 0.005418421234935522, -0.015886927023530006, 0.014103403314948082, -0.006838454399257898, 0.04102103412151337, 0.020743150264024734, 0.07816484570503235, 0.002677708165720105, 0.04342491179704666, -0.069402314722538, -0.013434582389891148, 0.01601293683052063, -0.028924094513058662, 0.013880463317036629, -0.05451377481222153, -0.004291602876037359, -0.0007384900818578899, -0.0031453983392566442, 0.01226172223687172, 0.04028436169028282, 0.015983857214450836, 0.002216076012700796, 0.030397439375519753, -0.030591299757361412, 0.055521853268146515, -0.008331186138093472, -0.02233281172811985, 0.03272377327084541, 0.001656301785260439, -0.04261069744825363, -0.01005170401185751, 0.00790953729301691, -0.03316965326666832, 0.0027285965625196695, -0.02147982269525528, -0.011486276984214783, -0.039179351180791855, -0.04714704677462578, 0.02917611412703991, -0.03568984940648079, 0.00046102621126919985, 0.013725373893976212, 0.009077551774680614, -0.020840080454945564, -0.06378033757209778, 0.015760917216539383, 0.018639756366610527, 0.008786759339272976, -0.010943465866148472, -0.04342491179704666, -0.016226183623075485, 0.04451053589582443, -0.01005170401185751, -0.011350573971867561, 0.06916968524456024, -0.026636531576514244, 0.02413572184741497, 0.02907918207347393, 0.021964475512504578, -0.029621994122862816, -0.03293702006340027, -0.008428116329014301, 0.03464299812912941, -0.0094991996884346, 0.01619710400700569, -0.008345725014805794, -0.0617641843855381, 0.021848158910870552, 0.0211502593010664, 0.009300491772592068, -0.015576749108731747, 6.48980712867342e-05, -0.00834087934345007, -0.04524720832705498, -0.06804528832435608, 0.04400649666786194, -0.014549284242093563, 0.010546050034463406, -0.003290794091299176, 0.019589675590395927, 0.020549289882183075, -0.022487901151180267, -0.054281141608953476, 0.009610669687390327, 0.041408754885196686, -0.01709855906665325, 0.034003257751464844, -0.03415834531188011, 0.012659137137234211, -0.01239742524921894, 0.03316965326666832, 0.03125042840838432, -0.004565431736409664, 0.03398387134075165, 0.04699195921421051, -0.005171247757971287, 0.018300499767065048, -0.016749609261751175, 0.009964467026293278, 0.011757683008909225, -0.024077562615275383, -0.00798708200454712, -0.024348968639969826, 0.02272053435444832, -0.0019046864472329617, -0.03388693928718567, -0.025066254660487175, -0.0026050100568681955, 0.0028715692460536957, 0.036949947476387024, -0.04579002037644386, -0.0008214869303628802, -0.0010813821572810411, -0.007822300307452679, 0.03026173636317253, -0.007720523048192263, 0.021886931732296944, -0.013105018064379692, 0.03107595257461071, -0.04299841821193695, -0.012523435056209564, 0.016691450029611588, 0.08677227795124054, 0.02475607767701149, -0.012436197139322758, -0.017747994512319565, -0.021790001541376114, -0.18083374202251434, -0.01629403606057167, 0.006033930461853743, -0.02737320400774479, 0.0023166416212916374, -0.006852994207292795, -0.037473373115062714, -0.015702757984399796, -0.030106646940112114, 0.05373832955956459, -0.03225850686430931, -0.0565299317240715, -0.015789996832609177, -0.05691765248775482, 0.008321492932736874, -0.012368345633149147, 0.01620679721236229, 0.010516971349716187, 0.03320842608809471, -0.02845882624387741, -0.033673692494630814, -0.028594529256224632, 0.021828772500157356, 0.030436210334300995, 0.013996779918670654, -0.0036954793613404036, 0.044122811406850815, 0.08491121232509613, -0.021886931732296944, -0.03696933388710022, 0.018872389569878578, -0.00030033342773094773, -0.012513741850852966, 0.019657528027892113, 0.027237500995397568, 0.0012304128613322973, -0.00013131069135852158, 0.019657528027892113, -0.003891763975843787, -0.014287571422755718, 0.01920195296406746, 0.012552513740956783, 0.0019713263027369976, 0.05137322098016739, 0.00568013358861208, 0.010468505322933197, 0.041214894503355026, -0.007546047680079937, 0.013085632584989071, -0.04257192462682724, 0.012533127330243587, 0.0058352225460112095, 0.05160585790872574, -0.061415232717990875, -0.03349921852350235, 0.047340910881757736, -0.010633287951350212, 0.04299841821193695, -0.012368345633149147, -0.027121184393763542, -0.039935410022735596, -0.017903083935379982, 0.026016175746917725, 0.001974961254745722, -0.013386117294430733, -0.03958646208047867, 0.028613915666937828, -0.014481432735919952, 0.01605170965194702, -0.03078516200184822, 0.03981909528374672, -0.025647839531302452, -0.017893390730023384, -0.0005621975287795067, 0.002621972933411598, 0.012455583550035954, 0.046643007546663284, -0.025008097290992737, 0.0014939430402591825, -0.07987082004547119, 0.004919228609651327, 0.016991935670375824, 0.03303395211696625, 0.029117954894900322, -0.017079172655940056, 0.0027964480686932802, -0.004323105327785015, 0.01809694431722164, 0.033150266855955124, 0.22674007713794708, -0.05835222825407982, -0.0221001785248518, -0.006867533549666405, 0.0289822518825531, -0.008171250112354755, 0.031153498217463493, 0.01910502277314663, 0.02822619304060936, -0.03169630840420723, 0.07192251086235046, 0.011602593585848808, 0.002801294671371579, -0.013008087873458862, -0.008045240305364132, -0.011990316212177277, -0.023864315822720528, 0.009877229109406471, 0.051489539444446564, 0.01668175868690014, 0.023030713200569153, -0.03501133620738983, 0.02023911103606224, 0.03512765094637871, 0.015004858374595642, -0.01614863984286785, 0.011961237527430058, 0.01872699335217476, 0.010565436445176601, 0.06676580011844635, 0.003285947721451521, 0.005180940963327885, -0.00790953729301691, 0.014297264628112316, -0.008180943317711353, -0.02789662964642048, 0.014558977447450161, -0.008873997256159782, -0.007667211350053549, 0.011011317372322083, -0.023767385631799698, -0.0227980799973011, -0.011011317372322083, 0.04129244014620781, 0.025686610490083694, -0.002631666138768196, 0.0073861125856637955, -0.025958016514778137, -0.015315036289393902, -0.04105980694293976, -0.006993543356657028, -0.021305348724126816, -0.012610672041773796, 0.029156727716326714, 0.0178158450871706, -0.05098550021648407, 0.015547669492661953, 0.027121184393763542, -0.014820690266788006, 0.03179324045777321, 0.05587080121040344, 0.00023142182908486575, 0.012077554129064083, 0.01396770030260086, 0.0028473366983234882, -0.008176096715033054, -0.007017775904387236, -0.0055444310419261456, 0.0025444284547120333, 0.008151864632964134, 0.009479813277721405, -0.009751219302415848, -0.05412605032324791, -0.028497599065303802, 0.028516985476017, 0.03809373080730438, 0.010546050034463406, 0.0010189830791205168, 0.005738291889429092, 0.001665994874201715, -0.05691765248775482, 0.010546050034463406, 0.007739908993244171, -0.0008299683104269207, -0.03216157481074333, -0.0216155257076025, -0.07339585572481155, 0.05715028569102287, -0.06858810037374496, -0.0641292929649353, -0.026772234588861465, -0.01819387450814247, -0.015004858374595642, -0.03088209219276905, 0.02964138053357601, -0.02305009961128235, 0.029777083545923233, -0.036135729402303696, -0.01796124130487442, 0.006823915056884289, 0.013308572582900524, -0.006344108376652002, -0.01102101057767868, 0.014927313663065434, 0.01304685976356268, -0.04439421743154526, -0.0014890964375808835, 0.026442669332027435, 0.0016163178952410817, -0.01304685976356268, -0.05199357867240906, 0.009184175170958042, 0.0011025856947526336, -0.0001491065340815112, 0.022487901151180267, 0.033382900059223175, -0.02403879165649414, -0.013996779918670654, 0.02717934362590313, 0.033150266855955124, -0.040943488478660583, -0.05253639072179794, -0.04528598114848137, 0.023592909798026085, -0.022914396598935127, 0.0027940247673541307, -0.0016684180591255426, -0.008757680654525757, -0.02436835505068302, 0.015460432507097721, 0.03130858764052391, -0.02518257312476635, 0.00935865007340908, -0.014103403314948082, 0.009557357989251614, 0.029021024703979492, -0.023224573582410812, 0.05168339982628822, -0.035321515053510666, -0.018378043547272682, -0.01942489482462406, -0.00791438389569521, 0.001665994874201715, -0.019802924245595932, 0.01465590763837099, 0.016187410801649094, 0.022274654358625412, 0.019017785787582397, -0.027916016057133675, -0.030203577131032944, -0.012077554129064083, 0.029350588098168373, 0.0011498393723741174, -0.0565299317240715, -0.02783847041428089, -0.010487891733646393, -0.026442669332027435, 0.01771891489624977, -0.01577061042189598, -0.035147037357091904, 0.026016175746917725, -0.0004767774371430278, 0.03733767196536064, 0.05094672739505768, 0.007739908993244171, 0.01567368023097515, -0.015528284013271332, -0.015053323470056057, -0.002689824439585209, -0.02969953790307045, 0.03691117465496063, -0.012901464477181435, -0.036232661455869675, 0.00195315177552402, 0.004693864844739437, -0.0067851427011191845, -0.06579649448394775, 0.02547336369752884, -0.02812926284968853, -0.019492745399475098, 0.011583208106458187, -0.0365816131234169, 0.0294669046998024, 0.013231027871370316, -0.027625223621726036, 0.02052990347146988, 0.03125042840838432, -0.015247184783220291, -0.014714066870510578, -0.025124413892626762, -0.04191279411315918, 0.08607438206672668, -0.0037633308675140142, -0.013201949186623096, 0.03663976863026619, -0.042261745780706406, 0.004618743434548378, 0.046449147164821625, 0.011544435285031796, -0.024116335436701775, 0.011389346793293953, -0.03549598902463913, 0.02816803567111492, -0.06304366886615753, 0.03997418284416199, 0.008554126136004925, 0.012009702622890472, -0.03126981481909752, 0.0027988713700324297, 0.01872699335217476, -0.02518257312476635, -0.03297579288482666, 0.005568663589656353, -0.02679162099957466, 0.014355422928929329, -0.03126981481909752, 0.09088213741779327, 0.017185796052217484, 0.006581588182598352, -0.0417964793741703, -0.023069484159350395, 0.02927304431796074, 0.033382900059223175, -0.029777083545923233, -0.030397439375519753, -0.003882071003317833, 0.054087281227111816, -0.008074319921433926, 0.025958016514778137, 0.019550904631614685, 0.002680131234228611, -0.0173408854752779, -0.06432314962148666, 0.0024196302983909845, 0.023883702233433723, 0.0089079225435853, 0.025589680299162865, 0.016885312274098396, -0.02390308864414692, -0.020316654816269875, 0.0014321497874334455, -0.02171245589852333, -0.009828764013946056, 0.05672379210591316, 0.019890161231160164, 0.05397096276283264, 0.05164462700486183, -0.028439439833164215, 0.03225850686430931, 0.039702776819467545, -0.012290800921618938, 0.005893380846828222, 0.04431667551398277, 0.008452349342405796, 0.011505663394927979, 0.015954777598381042, -0.007357033435255289, 0.017185796052217484, -0.005646207835525274, -0.017457202076911926, -0.028633302077651024, 0.018029093742370605, -0.04218420013785362, -0.011583208106458187, -0.06327629834413528, 0.030494369566440582, 0.017806153744459152, -0.049163203686475754, -0.010255258530378342, -0.06575772166252136, -0.024504058063030243, 0.00031563028460368514, -0.031851399689912796, -0.11011317372322083, 0.06905336678028107, -0.0029588069301098585, -0.047495998442173004, -0.005001619458198547, 0.005054931156337261, 0.03320842608809471, -0.04885302856564522, 0.027237500995397568, -0.018029093742370605, 0.03915996477007866, -0.05017128214240074, -0.011059782467782497, 0.01673022285103798, -0.024213265627622604, 0.005549277178943157, -0.037512145936489105, 0.0022548483684659004, -0.004168016370385885, -0.022352198138833046, 0.03503072261810303, -0.02085946686565876, 0.01326010748744011, 0.00041680163121782243, 0.025686610490083694, -0.03487563133239746, -0.021770615130662918, -0.01508240308612585, 0.025919245555996895, -0.02675284817814827, 0.006600974593311548, -0.007710829842835665, -0.015218105167150497, 0.010226178914308548, -0.04831021651625633, 0.03506949543952942, 0.010536356829106808, 0.006411959882825613, 0.015693064779043198, -0.019366735592484474, 0.05459132045507431, 0.005476579535752535, 0.006135707721114159, 0.05009374022483826, 0.013502433896064758, -0.0033828781452029943, 0.03254929929971695, 0.002602586755529046, 0.026016175746917725, -0.015799690037965775, 0.02318580076098442, 0.009630056098103523, -0.03173508122563362, -0.008229408413171768, -0.012688216753304005, -0.022739920765161514, -0.006155093666166067, 0.006940231658518314, -0.020646220073103905, 0.002355413744226098, -0.007749602198600769, 0.008781912736594677, -0.017476588487625122, 0.012203563936054707, -0.03729889914393425, 0.03386755660176277, 0.01042973343282938, 0.005781910847872496, 0.017476588487625122, 0.026636531576514244, -0.02993217296898365, 0.02403879165649414, -0.023670455440878868, 0.023321503773331642, 0.011689831502735615, -0.006305336020886898, -0.0008838860085234046, 0.04063330963253975, 0.03929566964507103, -0.0070274691097438335, -0.041369982063770294, 0.008723754435777664, -0.005180940963327885, -0.06723107397556305, -0.002379646524786949, 0.05858486145734787, -0.03886917233467102, 0.0017350579146295786, 0.051101818680763245, -0.012882078066468239, 0.02646205574274063, 0.02940874733030796, -0.027644610032439232, 0.02969953790307045, -0.02832312323153019, -0.013667215593159199, 0.007347340229898691, 0.015411966480314732, 0.015809383243322372, 0.02537643350660801, -0.021266575902700424, -0.03402264416217804, 0.019987091422080994, -0.004560585133731365, -0.0423005186021328, 0.04404526948928833, -0.0002183967735618353, -0.004214058164507151, -0.02921488508582115, -0.013037166558206081, -0.06160909682512283, -0.008214869536459446, 0.016429739072918892, -0.04326982423663139, -0.021169645711779594, -0.019017785787582397, 0.021460436284542084, -0.03685301914811134, 0.004381263628602028, -0.024058178067207336, 0.03357676416635513, -0.12717296183109283, -0.005151861812919378, 0.020394200459122658, 0.005607435945421457, -0.038655925542116165, 0.011447505094110966, 0.036135729402303696, -0.04745722562074661, -0.035903096199035645, -0.029137341305613518, -0.018067864701151848, 0.016177719458937645, 0.009542818181216717, -0.05633607134222984, 0.027877243235707283, 0.03144428879022598, -0.02842005528509617, 0.0014515358489006758, 0.01090469304472208, 0.051954805850982666, -0.0019168028375133872, -0.0127076031640172, 0.027877243235707283, -0.015809383243322372, -0.009189021773636341, -0.02652021497488022, 0.0105751296505332, -0.033189039677381516, -0.017660757526755333, -0.014297264628112316, 0.0375315323472023, 0.007618745788931847, 0.017079172655940056, 0.023069484159350395, -0.012765761464834213, 0.018378043547272682, 0.012649444863200188, -0.026384511962532997, -0.022701147943735123, 0.006489504128694534, -0.00044830405386164784, 0.026675304397940636, -0.018746379762887955, 0.003911150153726339, 0.013793225400149822, 0.02380615845322609, 0.020646220073103905, -0.005413574632257223, -0.050016194581985474, -0.022604217752814293, 0.01465590763837099, 0.027353817597031593, -0.017185796052217484, -0.010226178914308548, 0.027198728173971176, 0.0002812502207234502, -0.01095315907150507, -0.007231023628264666, 0.009770605713129044, 0.020704377442598343, 0.02289501018822193, -0.02275930717587471, -0.05311797186732292, -0.030009716749191284, -0.041214894503355026, 0.021537981927394867, 0.031153498217463493, 0.023069484159350395, 0.05335060879588127, 0.022080792114138603, -0.007642978336662054, 0.03952830284833908, 0.010071090422570705, -0.015993550419807434, -0.0020682569593191147, -0.0035306974314153194, 0.014830383472144604, -0.004747176542878151, -0.007536354940384626, -0.03125042840838432, 0.00766236474737525, -0.002731019863858819, 0.026907937601208687, 0.03355737775564194, 0.059748027473688126, -0.0036930562928318977, -0.0021579177118837833, -0.012523435056209564, -0.05478518083691597, -0.04970601573586464, -0.01961875520646572, -0.02318580076098442, -0.01363813690841198, 0.046643007546663284, -0.0879354476928711, 0.009281105361878872, -0.020646220073103905, -0.006164786871522665, -0.020704377442598343, 0.03349921852350235, 0.005607435945421457, -0.01976415142416954, -0.004575124941766262, 0.0346817709505558, 0.010109862312674522, -0.012096939608454704, 0.06692089140415192, -0.02014218084514141, 0.044355448335409164, -0.012930543161928654, 0.00819548312574625, -0.00552504463121295, 0.03491440415382385, 0.04865916445851326, -0.01924072578549385, 0.0005143380258232355, -0.007449117489159107, -0.004529082681983709, 0.004582394380122423, 0.02547336369752884, 0.036426521837711334, 0.010546050034463406, -0.00774475559592247, -0.023689839988946915, 0.02969953790307045, 0.04067208245396614, -0.012785146944224834, 0.000586430192925036, 0.004938614554703236, -0.02964138053357601, -0.005084010306745768, -0.001306139980442822, -0.022313425317406654, -0.029156727716326714, 0.04485948756337166, -0.01615833304822445, -0.03464299812912941, 0.036659155040979385, -0.024911167100071907, -0.010749604552984238, 0.0032180962152779102, 0.017660757526755333, 0.0011946697486564517, 0.0014551708009094, 0.02485300786793232, -0.014268185943365097, -0.013318265788257122, -0.009848149493336678, -0.0631987601518631, -0.013192255981266499, -0.029660766944289207, 0.003891763975843787, -0.003353798994794488, 0.04423912987112999, -0.015789996832609177, -0.010313416831195354, -0.015033937059342861, 0.02999033033847809, 0.037512145936489105, 0.013463662005960941, 0.03154122084379196, -0.0015387734165415168, -0.01705009490251541, 0.006760910153388977, -0.05160585790872574, -0.05734414979815483, 0.006707597989588976, -0.01990954764187336, -0.001372779719531536, 0.005229406524449587, 0.011815841309726238, 0.012843305245041847, -0.015218105167150497, 0.013483047485351562, 0.0022548483684659004, -0.022061405703425407, -0.0153247294947505, -0.007114706560969353, 0.018319884315133095, -0.0337318517267704, -0.003281101118773222, 0.028904708102345467, 0.020084021613001823, 0.017495974898338318, 0.014035551808774471, -0.005946693010628223, -0.015644600614905357, -0.002035542856901884, 0.01938612200319767, 0.014956393279135227, 0.030300509184598923, -0.00158845039550215, 0.003312603570520878, -0.034798089414834976, 0.015450739301741123, 0.04187402129173279, 0.0370662659406662, 0.034759316593408585, -0.02082069404423237, 0.03568984940648079, -0.07013899087905884, 0.00812763161957264, -0.058701176196336746, -0.021867545321583748, -0.005762524902820587, -0.00960097648203373, 0.009736679494380951, -0.0009396210662089288, 0.003055737353861332, -0.03192894160747528, 0.00460905022919178, 0.01877545937895775, 0.051954805850982666, -0.006319875828921795, 0.03359615057706833, -0.033945098519325256, 0.003666400210931897, 0.01696285605430603, -0.03245236724615097, 0.02200324833393097, -0.012077554129064083, -0.0024656723253428936, -0.04889179766178131, 0.022642990574240685, -0.03578678146004677, -0.026597758755087852, -0.005568663589656353, 0.017311805859208107, -0.000946285086683929, -0.013337652198970318, -0.016759302467107773, 0.0442003570497036, -0.00735218683257699, 0.05373832955956459, 0.02014218084514141, -0.0027722155209630728, 0.06730861216783524, 0.04427790269255638, 0.02675284817814827, 0.0294669046998024, 0.023961246013641357, 0.017951548099517822, 0.013550898991525173, -0.01064298115670681]}}\n", "相似度: 0.7401 内容: Milvus 就像是一个专门存放‘向量’的超级仓库,能在几毫秒内从千万级数据中找出最相似的片段。\n", "{'id': 467404046897263743, 'distance': 0.3801402747631073, 'entity': {'id': 467404046897263743, 'text': 'RAG 技术的本质,就是给大模型配上一个能随时查阅的‘外部外挂大脑’(知识库)。', 'vector': [-0.05341174826025963, -0.009207737632095814, -0.024233471602201462, 0.008344359695911407, -0.08202098309993744, -0.04301195964217186, 0.022859914228320122, 0.07605581730604172, -0.007211174815893173, 0.02550891786813736, -0.05867050960659981, -0.003826337633654475, -0.020289400592446327, 0.02289915829896927, 0.04811374098062515, 0.018199631944298744, 0.040049001574516296, -0.03184690326452255, 0.04960503429174423, -0.024331582710146904, -0.036811329424381256, -0.035045329481363297, -0.02588173933327198, 0.005239139311015606, 0.022447846829891205, 0.050311435014009476, -0.06742203235626221, -0.050821613520383835, 0.0762520432472229, -0.026352673768997192, 0.06530282646417618, -0.055962640792131424, 0.03602644056081772, 0.001861660392023623, -0.05054689943790436, -0.020779956132173538, -0.03435854986310005, -0.014235937967896461, -0.09198907762765884, 0.0006910709198564291, -0.07138572633266449, 0.03475099429488182, 0.02211426943540573, -0.03687019646167755, 0.02974732220172882, -0.06016179919242859, -0.02488100528717041, -0.05560943856835365, -0.005273478105664253, 0.03088541328907013, -0.025194961577653885, -0.001417707186192274, -0.020564112812280655, -0.012293335981667042, -0.024920249357819557, 0.03700755164027214, -0.014549894258379936, -0.03588908538222313, 0.02802056446671486, 0.027294540777802467, -0.018219253048300743, 0.012116735801100731, 0.005020841956138611, 0.01676720753312111, 0.06204553693532944, 0.04552360624074936, 0.010223189368844032, 0.016168728470802307, -0.044189292937517166, -0.05435361713171005, -0.013804248534142971, -0.005548189394176006, -0.06267344951629639, -0.01345104817301035, -0.054589081555604935, 0.02800094336271286, 0.04101049154996872, -0.05443210527300835, -0.015619306825101376, -0.055962640792131424, 0.07385812699794769, -0.021564846858382225, 0.010674500837922096, -0.023860648274421692, -0.06471416354179382, 0.021957291290163994, -0.03951919823884964, 0.045091915875673294, 0.014981583692133427, -0.014461593702435493, -0.01963205449283123, -0.026921719312667847, 0.014245749451220036, -0.04014711081981659, -0.004432174377143383, 0.009099815972149372, -0.037969041615724564, 0.02527344971895218, 0.010645067319273949, 0.04038257896900177, -0.025234205648303032, 0.008800576440989971, -0.03965655714273453, -0.003931807354092598, 0.034456659108400345, -0.020053934305906296, -0.0032621980644762516, 0.007485886104404926, -0.05902371183037758, -0.015423083677887917, 0.04936956614255905, 0.04316893592476845, -0.011802779510617256, 0.032965369522571564, -0.025214584544301033, -0.04717187583446503, -0.018955087289214134, -0.013480481691658497, -0.012803514488041401, 0.006490057334303856, -0.014961961656808853, 0.07091479003429413, 0.04175613448023796, 0.015364217571914196, 0.006347795948386192, -0.06035802140831947, 0.06518509238958359, 0.053058549761772156, 0.013333315029740334, -0.006833446677774191, -0.045562852174043655, 0.06710807234048843, -0.028177542611956596, -0.009193021804094315, -0.034711748361587524, -0.043836094439029694, -0.015707606449723244, -0.033455926924943924, -0.0181211419403553, -0.008830009959638119, 0.03647775202989578, 0.043051205575466156, -0.02289915829896927, -0.013833682052791119, -0.008462092839181423, -0.026293806731700897, 0.02564627304673195, 0.0437183603644371, 0.0019708091858774424, -0.0006248458521440625, -0.004128029569983482, 0.008785859681665897, -0.0058817677199840546, 0.05388268083333969, -0.028825076296925545, 0.032808393239974976, 0.0387931764125824, 0.05816033110022545, 0.012705403380095959, 0.06946274638175964, -0.015315162017941475, -0.054824549704790115, -0.008736804127693176, -0.0017292102565988898, 0.020603356882929802, -0.007417208515107632, 0.013980848714709282, -0.009982816874980927, -0.04850618913769722, -0.02036788873374462, -0.0231150034815073, -0.03137596696615219, 0.033436305820941925, -0.0325336791574955, -0.0036129457876086235, 0.04760356619954109, 0.0538041926920414, 0.020936934277415276, 0.0028256031218916178, -0.06286966800689697, -0.006372323725372553, -0.0004142133111599833, 0.018454721197485924, 0.01611967384815216, -0.02927638776600361, 0.027333786711096764, 0.027353407815098763, 0.03647775202989578, 0.0017390213906764984, -0.013215581886470318, -0.0275103859603405, 0.022035779431462288, 0.016727963462471962, -0.034809861332178116, 0.017297009006142616, -0.022310491651296616, 0.01586458459496498, 0.0463084951043129, 0.003939165733754635, -0.03410346060991287, -0.025293072685599327, 0.023723293095827103, 0.0046946220099925995, 0.05611961707472801, -0.03435854986310005, -0.007794936653226614, -0.03641888499259949, -0.035320039838552475, 0.026097584515810013, -0.030963901430368423, 0.014383104629814625, -0.009973005391657352, 0.08429715782403946, -0.025979850441217422, -0.020662223920226097, 0.018807921558618546, 0.0128133250400424, -0.007402491755783558, 0.0005500360275618732, -0.0487808994948864, -0.0387931764125824, 0.026921719312667847, -0.019416211172938347, 0.047839030623435974, 0.0010798366274684668, -0.030316367745399475, 0.041206713765859604, 0.03559475019574165, -0.007039479911327362, -0.015344594605267048, -0.02599947340786457, 0.031572189182043076, -0.0003136493032798171, -0.041324447840452194, 0.046190761029720306, -0.010458656586706638, -0.06738279014825821, -0.021604090929031372, 0.060554247349500656, -0.00431198813021183, 0.005656111985445023, 0.016060806810855865, -0.03977428749203682, 0.012185413390398026, -0.025430427864193916, 0.018346797674894333, -0.01649249717593193, 0.00431444076821208, -0.06510660797357559, -0.05329401418566704, 0.02013242244720459, -0.018209442496299744, -0.029315633699297905, -0.007142496760934591, 0.01764039695262909, 0.007790030911564827, 0.040578801184892654, 0.02213389053940773, 0.01926904357969761, -0.012538613751530647, 0.014353672042489052, 0.007319096941500902, 0.040186356753110886, 0.0306107010692358, 0.006151573732495308, 0.012646536342799664, -0.04454249516129494, -0.0218788031488657, 0.043090447783470154, -0.005592339672148228, -0.0034363456070423126, -0.009678672067821026, -0.024096116423606873, -0.0021670316345989704, 0.005386305972933769, 0.030198633670806885, -0.025724763050675392, -0.02849149890244007, 0.04803525283932686, 0.04827072098851204, -0.042070090770721436, -0.03341668099164963, 0.02800094336271286, 0.00974244438111782, 0.005268572364002466, -0.007765503134578466, -0.02236935868859291, 0.01948488876223564, -0.025175338611006737, -0.03473137319087982, -0.0462300069630146, 0.00987979955971241, 0.08052968978881836, -0.030846167355775833, -0.01925923302769661, 0.00792738702148199, -0.01786605268716812, -0.18821656703948975, 0.024998739361763, -0.00262692803516984, -0.013097847811877728, -0.01714003086090088, -0.012332580052316189, -0.02737303078174591, -0.0093843387439847, -0.015687983483076096, 0.06200629100203514, 0.01986752264201641, -0.055177751928567886, -0.01889622025191784, -0.07358341664075851, -0.008550392463803291, -0.02401762641966343, -0.034574393182992935, -0.0125091802328825, -0.005906295496970415, -0.017610963433980942, -0.006691185291856527, -0.030002411454916, -4.648785761673935e-05, 0.03810639679431915, -0.025234205648303032, -0.030179010704159737, 0.05074312165379524, 0.01651211827993393, -0.004422363359481096, -0.01802303083240986, -0.028099054470658302, 0.03435854986310005, -0.017934730276465416, 0.03437817096710205, 0.013686515390872955, 0.008123609237372875, -0.0077704088762402534, 0.0005607669590972364, 0.006313457153737545, -0.014412538148462772, -0.028589610010385513, 0.043836094439029694, 0.007324002683162689, 0.05478530749678612, -0.010596011765301228, 0.015011017210781574, 0.05278383567929268, -0.0437968485057354, -0.005793467629700899, 0.006009312346577644, 0.007289663888514042, -0.031317099928855896, 0.03973504528403282, -0.03830261901021004, -0.029727699235081673, -0.0005258148303255439, -0.0512925460934639, 0.006426285021007061, 0.025430427864193916, -0.003779734717682004, -0.02176106907427311, 0.0011368637206032872, 0.01456951629370451, -0.003505023429170251, 0.015913639217615128, 0.00625459011644125, 0.06420398503541946, 0.0013600668171420693, 0.008310019969940186, -0.02488100528717041, 0.03649737313389778, 0.009286226704716682, -0.041559912264347076, 0.028432631865143776, 0.008471904322504997, -0.005631584208458662, -0.0224870927631855, 0.010370356030762196, -0.032435569912195206, -0.05537397414445877, 0.011743913404643536, 0.05329401418566704, 0.03484910726547241, 0.03600681945681572, -0.009330376982688904, -0.018601886928081512, -0.00975225493311882, -0.04167764633893967, 0.04242329299449921, 0.24158906936645508, -0.012165791355073452, -0.020564112812280655, -0.02974732220172882, 0.01852339878678322, -0.006823635194450617, 0.04442476108670235, 0.04615151882171631, -0.01714003086090088, -0.01813095435500145, 0.025096850469708443, 0.02611720748245716, 0.0023350471165031195, 0.0012975209392607212, -0.03698793053627014, 0.02225162461400032, -0.005317628383636475, 0.0002264223003294319, 0.04991899058222771, -0.016090240329504013, 0.017483418807387352, 0.04336515814065933, 0.021976914256811142, 0.030179010704159737, -0.0337502583861351, -0.009639427065849304, 0.006357606966048479, 0.01937696523964405, 0.015334784053266048, 0.05384343862533569, 0.0075938086956739426, -0.024037249386310577, -0.006553829647600651, 0.0020468453876674175, -0.014147638343274593, 0.015393650159239769, 0.005710073281079531, 0.011547690257430077, -0.03696830943226814, 0.006465529557317495, -0.006200629286468029, -0.02701983042061329, -0.0016727963229641318, 0.023527070879936218, -0.028059808537364006, -0.0125091802328825, -0.0027495669201016426, -0.01063525676727295, -0.005229328293353319, -0.019857710227370262, -0.014775549992918968, -0.027176808565855026, -0.02025015652179718, -0.003693887498229742, 0.014510649256408215, -0.04536662995815277, -0.016433630138635635, 0.06856012344360352, 0.014540082775056362, 0.005710073281079531, 0.03241594880819321, 0.009389244019985199, -0.051331792026758194, 0.0004868769319728017, -0.005106688942760229, -0.0026857946068048477, -0.011577123776078224, -0.040088243782520294, 0.03637963905930519, 0.03053221106529236, 0.02364480495452881, 0.04234480485320091, -0.012155979871749878, 0.0019205271964892745, 0.05235214903950691, 0.021545223891735077, 0.005356872454285622, 0.058709755539894104, 0.0033137064892798662, -0.022330114617943764, 0.01293105911463499, -0.012705403380095959, -0.010213377885520458, 0.00402746582403779, 0.010105456225574017, -0.004961974918842316, -0.028903566300868988, 0.04093199968338013, -0.07291626185178757, -0.023428959771990776, -0.011665424332022667, -0.04352213814854622, -0.04791751876473427, 0.010076022706925869, 0.016335519030690193, 0.0037110568955540657, -0.014402727596461773, -0.03598719462752342, -0.0056021506898105145, 0.004648019094020128, 0.02225162461400032, -0.011174867860972881, -0.0006788070313632488, 0.04454249516129494, 0.04952654615044594, -0.006975707598030567, -0.0004439532640390098, 0.01838604360818863, -0.017414741218090057, 0.010703934356570244, 0.00926169939339161, 0.0015011016512289643, 0.02089769020676613, -0.019553566351532936, -0.005670828744769096, -0.018601886928081512, -0.017571719363331795, -0.001169363153167069, 0.024056870490312576, 0.045445118099451065, -0.007495697122067213, -0.02774585410952568, 0.003995579667389393, 0.022565580904483795, 0.002479761140421033, -0.02178069017827511, -0.006804013159126043, 0.0020615621469914913, -0.017032107338309288, 0.028334520757198334, 0.0013171430910006166, -0.011449579149484634, 0.07162119448184967, 0.007265136111527681, 0.019327910616993904, 0.016463063657283783, -0.010988457128405571, 0.026058340445160866, 0.03202350437641144, 0.05227365717291832, 0.006053462158888578, -0.022467469796538353, -0.026470407843589783, -0.030846167355775833, 0.015148372389376163, 9.328230953542516e-05, -0.02911940962076187, 0.02625456266105175, 0.02287953719496727, 0.024920249357819557, -0.014598949812352657, 0.03765508532524109, 0.01827812008559704, -0.06459642946720123, 0.01405933778733015, 0.00024711762671358883, -0.023546693846583366, 0.0324748158454895, 0.013765004463493824, -0.027216052636504173, -0.020053934305906296, -0.023958759382367134, 0.03685057535767555, 0.04136369004845619, -0.0024564596824347973, 0.04089275747537613, 0.035339660942554474, -0.016414007171988487, 0.011312223970890045, -0.06420398503541946, -0.013715948909521103, -0.03451552614569664, -0.04936956614255905, -0.018317364156246185, 0.03584983944892883, -0.020917313173413277, -0.06569527089595795, 0.023703670129179955, 0.003370120422914624, -0.019808655604720116, 0.023664426058530807, -0.00638213474303484, 0.023095380514860153, 0.015707606449723244, -0.02837376482784748, -0.0008063515997491777, 0.026705874130129814, -0.012803514488041401, -0.005925917532294989, -0.04022559896111488, -0.006269306875765324, 0.10352695733308792, -0.014755927957594395, 0.005180272273719311, 0.047721296548843384, -0.022310491651296616, -0.0034731372725218534, 0.010703934356570244, 0.014461593702435493, -0.031434834003448486, -0.0437968485057354, -0.029296010732650757, 0.0181211419403553, 0.0037380375433713198, -0.018572453409433365, 0.015903828665614128, 0.006347795948386192, -0.024037249386310577, -0.026666630059480667, -0.008354170247912407, -0.007951914332807064, -0.03739999607205391, -0.020230533555150032, -0.02552853897213936, -0.002864847658202052, -0.0028673005290329456, -0.030159389600157738, 0.03363252803683281, 0.01626683957874775, -0.05411814898252487, -0.029158655554056168, 0.008977176621556282, -0.009766971692442894, -0.07711541652679443, 0.002702964236959815, 0.001148514449596405, 0.009251887910068035, -0.013666893355548382, 0.043836094439029694, 0.006853068713098764, -0.005925917532294989, -0.03304385766386986, -0.020426755771040916, -0.004763299599289894, -0.0011981832794845104, -0.0168849416077137, -0.004481229931116104, 0.038577333092689514, -0.008780954405665398, -0.02639191783964634, -0.014245749451220036, -0.04356138035655022, -0.012469936162233353, -0.012303147464990616, -0.003860676661133766, 0.023841027170419693, -0.008986988104879856, 0.0010105455294251442, 0.035202305763959885, 0.05737544223666191, -0.014795172028243542, 0.03739999607205391, 0.03424081578850746, -0.004957069642841816, -0.02236935868859291, 0.026980586349964142, 0.014667627401649952, -0.018032843247056007, 0.00665684649720788, 0.003988221287727356, -0.005582528654485941, 0.0045204744674265385, -0.043208181858062744, -0.0337306372821331, -0.04210933670401573, 0.05152801424264908, 0.04842769727110863, 0.006862879730761051, -0.029688455164432526, -0.07723315060138702, -0.007971536368131638, 0.003652190091088414, -0.06891331821680069, -0.022290868684649467, 0.030944278463721275, -0.006215346045792103, -0.01965167745947838, -0.0049153720028698444, -0.00131346401758492, 0.06235949322581291, -0.06432171911001205, -0.006004406604915857, 0.011842024512588978, 0.02452780492603779, -0.023546693846583366, -0.028903566300868988, 0.05662979558110237, 0.024429693818092346, 0.020063744857907295, -0.065028116106987, 0.032828014343976974, 0.015501572750508785, -0.01613929495215416, 0.008923215791583061, -0.005979878827929497, 0.0058817677199840546, 0.012048058211803436, 0.046073030680418015, -0.004380666185170412, -0.017581529915332794, -0.006995330099016428, 0.04352213814854622, -0.027412274852395058, -0.01224428042769432, -0.011930324137210846, 0.029845433309674263, -0.021290134638547897, -0.04210933670401573, -0.004363496787846088, -0.0033186119981110096, -0.00214250385761261, -0.012587669305503368, 0.009914139285683632, 0.030414478853344917, 0.027176808565855026, -0.012715213932096958, 0.03133672475814819, -0.0525091253221035, 0.030198633670806885, -0.012528803199529648, 0.05447135120630264, 0.0031567285768687725, -0.024056870490312576, 0.021545223891735077, 0.022683314979076385, -0.0016127031994983554, -0.05262685939669609, 0.011675234884023666, 0.04936956614255905, -0.00027210533153265715, -0.003821432124823332, 0.010978645645081997, 0.018435098230838776, 0.011783157475292683, 0.02087806724011898, 0.02413536049425602, 0.011645802296698093, -0.015079694800078869, 0.032200101763010025, 0.007407397031784058, -0.02026977762579918, -0.02223200350999832, 0.06938425451517105, -0.032808393239974976, -0.03999013453722, -0.009457921609282494, 0.02125089056789875, 0.013853304088115692, 0.008050025440752506, 0.002935978351160884, -0.014961961656808853, 0.03400534763932228, -0.04328666999936104, -0.058081842958927155, 0.0187686774879694, -0.04273724928498268, -0.032455191016197205, -0.023330848664045334, 0.07095403224229813, 0.024782894179224968, -0.019475078210234642, 0.03924448788166046, 0.0269020963460207, -0.006357606966048479, 0.04152067005634308, 0.04328666999936104, 0.027667364105582237, 0.00041176052764058113, 0.019936200231313705, 0.026607763022184372, -0.0021964649204164743, 0.017453987151384354, -0.008903593756258488, -0.04473871737718582, 0.006490057334303856, 0.03616379573941231, -0.0269020963460207, 0.02227124758064747, 0.011694857850670815, -0.028197165578603745, -0.0004801317991223186, -0.019092444330453873, -0.006087801419198513, -0.014657816849648952, 0.008942837826907635, -0.029688455164432526, -0.020956557244062424, -0.04725036397576332, -0.019200365990400314, -0.020171666517853737, -0.04171689227223396, -0.0065636406652629375, -0.03386799246072769, 0.008143231272697449, -0.13107658922672272, 0.008952649310231209, -0.005273478105664253, 0.011086568236351013, 0.017699263989925385, 0.002558249980211258, 0.02839338779449463, -0.010645067319273949, 0.026176074519753456, -0.06553829461336136, -0.014078959822654724, 0.029825810343027115, 0.003664454212412238, -0.03426043689250946, -0.008094175718724728, -0.01802303083240986, -0.061692334711551666, 0.0005218290607444942, 0.019965633749961853, -0.023605559021234512, -0.01577628403902054, 0.012587669305503368, 0.044581737369298935, 0.013706137426197529, 0.0037135097663849592, 0.014157448895275593, -0.015727229416370392, -0.018945276737213135, -0.024076493456959724, -0.00400293804705143, 0.0017181728035211563, -0.03302423655986786, 0.0005803891690447927, 0.05729695409536362, -0.011233734898269176, -0.007834181189537048, 0.012725025415420532, -0.02264406904578209, -0.031945012509822845, -0.014098582789301872, -0.05929842218756676, 0.03949957713484764, -0.00875642616301775, 0.007103252224624157, -0.029668834060430527, 0.0487416535615921, 0.04921258985996246, -0.004527832847088575, -0.0042825546115636826, -0.01382387150079012, 0.009320566430687904, 0.037969041615724564, -0.05286232754588127, -0.014677438884973526, 0.029982788488268852, -0.01874905452132225, -0.05192045867443085, -0.007750786375254393, -0.007270041387528181, 0.04948730021715164, -0.011184679344296455, -0.027314163744449615, -0.010360544547438622, -0.011233734898269176, -0.01702229678630829, -0.0007646543090231717, 0.0025974945165216923, -0.018032843247056007, 0.006735335104167461, 0.02448856085538864, -0.0038238847628235817, -0.01702229678630829, -0.014598949812352657, -0.025096850469708443, 0.016796641051769257, 0.016688719391822815, 0.01786605268716812, 0.03329894691705704, -0.02639191783964634, -0.05172423645853996, 0.017905298620462418, -0.0206229779869318, -0.027569252997636795, 0.020956557244062424, 0.03696830943226814, -0.0004684810701292008, -0.0006714486517012119, 0.034574393182992935, -0.029060544446110725, -0.026568518951535225, -0.034947216510772705, 0.018346797674894333, 0.0011319582117721438, 0.02739265374839306, -0.050075966864824295, 0.02313462644815445, -0.011292601935565472, 0.015531006269156933, 0.015177805908024311, 0.03037523478269577, -0.002874658675864339, 0.0071277800016105175, 0.009143966250121593, 0.010031872428953648, -0.037713952362537384, 0.027471141889691353, 0.004552360624074936, 0.00944320484995842, 0.025037983432412148, -0.014029904268682003, -0.011439768597483635, 0.016924185678362846, 0.014265371486544609, 0.03435854986310005, -0.044974185526371, -0.009511882439255714, 0.05710073187947273, -0.027098318561911583, -0.02764774300158024, -0.01723814196884632, -0.018415475264191628, -0.0003148757095914334, 0.012224658392369747, -0.003855770919471979, -0.018572453409433365, 0.014912905171513557, 0.04324742779135704, -0.008000969886779785, -0.0037257736548781395, 0.00038416674942709506, -0.0005135509418323636, -0.08233493566513062, -0.017169464379549026, 0.022349735721945763, 0.0636938065290451, 0.017552098259329796, 0.014638193883001804, 0.04811374098062515, 0.0011699763126671314, -0.009904327802360058, 0.04104973375797272, -0.03074805624783039, 0.00875642616301775, 0.020328644663095474, -0.014049527235329151, -0.014422349631786346, 0.01345104817301035, -0.0009921496966853738, -0.014471405185759068, -0.026293806731700897, 0.03347554802894592, 0.019533943384885788, 0.027333786711096764, 0.025960229337215424, -0.0274907648563385, 0.010831478983163834, 0.01973997801542282, 0.013833682052791119, -0.012283524498343468, 0.05474606156349182, 0.008516053669154644, -0.024213848635554314, 0.003406912088394165, -0.00837379228323698, 0.0039465236477553844, -0.028471875935792923, -0.002695605857297778, -0.013264637440443039, 0.01400047168135643, 0.024056870490312576, 0.021192023530602455, 0.03896977752447128, -0.027942076325416565, 0.027451518923044205, 0.005724789574742317, -0.006043651141226292, 0.007986253127455711, 0.010752989910542965, 0.08335529267787933, -0.00046265573473647237, -0.007289663888514042, -0.01375519298017025, 0.020053934305906296, -0.007206269074231386, -0.022859914228320122, -0.005965162068605423, -0.021486356854438782, 0.05109632387757301, -0.011626179330050945, 0.01965167745947838, -0.0225067138671875, -0.027216052636504173, 0.024782894179224968, -0.040421824902296066, 0.014991394244134426, 0.0001583576377015561, 0.002099580131471157, 0.005052728112787008, -0.007064007688313723, -0.019337721168994904, -0.019779222086071968, -0.009202832356095314, 0.0009001704747788608, -0.02301689237356186, -0.03139559179544449, -0.04615151882171631, -0.053450994193553925, -0.04980125650763512, -0.03153294697403908, 0.028059808537364006, -0.004522927105426788, 0.007461358327418566, -0.047054141759872437, 0.02564627304673195, -0.0016212878981605172, -0.024194227531552315, 0.030277123674750328, 0.0033112536184489727, -0.019779222086071968, 0.016953619197010994, 0.010022060945630074, 0.031081635504961014, -0.020152045413851738, -0.030571456998586655, -0.01961243338882923, -0.003934259992092848, 0.021937668323516846, 0.024194227531552315, -0.01094921212643385, 0.006441001780331135, 0.0046382080763578415, -0.013941604644060135, -0.005111594684422016, 0.05737544223666191, 0.05906295403838158, -0.019063010811805725, 0.02923714369535446, 0.05078236758708954, -0.01042922306805849, -0.022781426087021828, 0.03435854986310005, 0.032317835837602615, 0.05976935476064682, -0.008403225801885128]}}\n", "相似度: 0.3801 内容: RAG 技术的本质,就是给大模型配上一个能随时查阅的‘外部外挂大脑’(知识库)。\n" ] } ], "source": [ "# 加载集合到内存(检索前必须执行)\n", "if client.has_collection(collection_name):\n", " client.load_collection(collection_name)\n", "\n", " # 将查询文本转为向量\n", " query_vector = embedding_model.embed_query(\"Milvus是什么?\")\n", "\n", " # 执行向量检索\n", " res = client.search(\n", " collection_name=collection_name,\n", " data=[query_vector], # 查询向量(支持批量)\n", " anns_field=\"vector\", # 在哪个向量字段上搜索\n", " limit=2, # 返回最相似的 Top-K 条\n", " output_fields=[\"id\", \"text\", \"vector\"] # 需要返回哪些字段\n", " )\n", "\n", " # 打印结果\n", " for hit in res[0]:\n", " print(f\"相似度: {hit['distance']:.4f} 内容: {hit['entity']['text']}\")\n", "else:\n", " print(f\"集合 '{collection_name}' 不存在,请先创建\")" ] }, { "cell_type": "code", "execution_count": 8, "id": "ab0972da", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:272: PyMilvusDeprecationWarning: `connections.list_connections` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " for con in connections.list_connections():\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:273: PyMilvusDeprecationWarning: `connections.get_connection_addr` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " addr = connections.get_connection_addr(con[0])\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:287: PyMilvusDeprecationWarning: `connections.connect` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " connections.connect(alias=alias, **connection_args)\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:213: PyMilvusDeprecationWarning: `utility.has_collection` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " if utility.has_collection(self.collection_name, using=self.alias):\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:401: PyMilvusDeprecationWarning: `Collection` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " self.col = Collection(\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:430: PyMilvusDeprecationWarning: `Collection.indexes` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " for x in self.col.indexes:\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:450: PyMilvusDeprecationWarning: `Collection.create_index` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " self.col.create_index(\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:432: PyMilvusDeprecationWarning: `Index.to_dict` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " return x.to_dict()\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:506: PyMilvusDeprecationWarning: `utility.load_state` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " and utility.load_state(self.collection_name, using=self.alias)\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:509: PyMilvusDeprecationWarning: `Collection.load` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " self.col.load(\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:629: PyMilvusDeprecationWarning: `Collection.insert` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " res = self.col.insert(insert_list, timeout=timeout, **kwargs)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "已创建集合,包含 4243 个文档切片\n" ] } ], "source": [ "# langchain_community要使用0.4.1版本\n", "from langchain_community.vectorstores import Milvus\n", "from langchain_community.document_loaders import PyMuPDFLoader\n", "from langchain_text_splitters import RecursiveCharacterTextSplitter\n", "\n", "# 第一步:加载文档(以 PDF 为例)\n", "loader = PyMuPDFLoader(\"car_info.pdf\")\n", "docs = loader.load()\n", "\n", "# 第二步:切片\n", "# chunk_size: 每个切片的最大字符数\n", "# chunk_overlap: 相邻切片的重叠字符数,防止上下文断裂\n", "text_splitter = RecursiveCharacterTextSplitter(\n", " # 分隔符优先级:段落 → 换行 → 句号 → 空格 → 硬切\n", " separators=[\"\\n\\n\", \"\\n\", \"。\", \"!\", \"?\", \" \", \"\"],\n", " \n", " # 每个块最大 50 字符\n", " chunk_size=50,\n", " \n", " # 相邻块重叠 10 字符(chunk_size 的 20%)\n", " chunk_overlap=10,\n", " \n", " # 长度计算函数\n", " length_function=len\n", ")\n", "split_docs = text_splitter.split_documents(docs)\n", "\n", "# 过滤空文档\n", "valid_docs = [doc for doc in split_docs if doc.page_content and doc.page_content.strip()]\n", "\n", "# 第三步:存入 Milvus(LangChain 会自动处理 Embedding 转换)\n", "vectorstore = Milvus.from_documents(\n", " documents=valid_docs,\n", " embedding=embedding_model,\n", " connection_args={\"uri\": \"http://localhost:19530\"},\n", " collection_name=\"car_info_collection\"\n", ")\n", "print(f\"已创建集合,包含 {len(valid_docs)} 个文档切片\")" ] }, { "cell_type": "code", "execution_count": 34, "id": "d9ddb565", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "内容: 说明!\n", "□当车速在0 – 40km/h的范围内,且车辆在陡坡上低速下坡行驶\n", "时,HDC才会激活。\n", "来源: {'producer': 'PDFlib+PDI 9.0.6 (C++/Win64)', 'creator': 'PTC Arbortext Publishing Engine', 'creationdate': '2023-06-16T15:35:59+08:00', 'source': 'car_info.pdf', 'file_path': 'car_info.pdf', 'total_pages': 354, 'format': 'PDF 1.7', 'title': '', 'author': '', 'subject': '', 'keywords': '', 'moddate': '2023-06-16T17:41:45+08:00', 'trapped': '', 'modDate': \"D:20230616174145+08'00'\", 'creationDate': \"D:20230616153559+08'00'\", 'page': 160, 'pk': 467404046897265824}\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:784: PyMilvusDeprecationWarning: `Collection.search` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " res = self.col.search(\n" ] } ], "source": [ "# 创建检索器,k=1 表示返回最相似的 1 条\n", "retriever = vectorstore.as_retriever(search_kwargs={\"k\": 1})\n", "\n", "# 执行检索\n", "query = \"在多少速度范围内,HDC才会激活?\"\n", "relevant_docs = retriever.invoke(query)\n", "\n", "for doc in relevant_docs:\n", " print(f\"内容: {doc.page_content}\")\n", " print(f\"来源: {doc.metadata}\")" ] }, { "cell_type": "code", "execution_count": null, "id": "25949916", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:784: PyMilvusDeprecationWarning: `Collection.search` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " res = self.col.search(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "content='HDC(陡坡缓降控制)功能在车速 **0–40 km/h** 范围内激活,且需满足车辆在陡坡上低速下坡行驶的条件。 \\n当车速超过 40 km/h(例如在 40–60 km/h 或更高车速)时,HDC 将**无法激活**。 \\n\\n如需进一步了解 HDC 的使用方法或相关限制,请随时告知!' additional_kwargs={} response_metadata={'model_name': 'qwen-plus', 'finish_reason': 'stop', 'request_id': '503b8c78-a032-968a-868c-f99a45264e8c', 'token_usage': {'input_tokens': 288, 'output_tokens': 97, 'total_tokens': 385, 'prompt_tokens_details': {'cached_tokens': 0}}} id='lc_run--019f25dc-8717-7a10-aade-de54490f86a9-0' tool_calls=[] invalid_tool_calls=[]\n" ] } ], "source": [ "from langchain_core.tools.retriever import create_retriever_tool\n", "from langchain_community.chat_models import ChatTongyi\n", "from langchain.agents import create_agent\n", "\n", "# 初始化大模型\n", "llm = ChatTongyi(model=\"qwen-plus\", api_key=api_key)\n", "\n", "# 将向量存储转为检索器\n", "retriever = vectorstore.as_retriever(search_kwargs={\"k\": 2})\n", "\n", "# 把检索器封装为工具\n", "# name: 工具名称,Agent 用它来引用这个工具\n", "# description: 工具描述,Agent 根据描述决定何时使用——写得好不好直接影响 Agent 的决策质量\n", "retriever_tool = create_retriever_tool(\n", " retriever,\n", " name=\"product_info_retriever\",\n", " description=\"当用户询问产品相关信息时使用此工具,包括保修政策、技术参数、使用方法等。\",\n", ")\n", "\n", "# 创建 Agent,传入工具列表\n", "tools = [retriever_tool]\n", "agent = create_agent(llm, tools)\n", "\n", "# Agent 会根据问题自动判断是否需要调用检索工具\n", "query = \"在多少速度范围内,HDC才会激活?\"\n", "res = agent.invoke({\"messages\": [(\"human\", query)]})\n", "print(res['messages'][-1])" ] }, { "cell_type": "code", "execution_count": 35, "id": "996a26bd", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "共切分为 369 个语义块\n", "第一个块: 欢迎\n", "感谢您选择了具有优良安全性、舒适性、动力性和经济性的Lynk & Co领克汽车。\n", "首次使用前请仔细、完整地阅读本手册内容,将有助于您更好地了解和使用车辆。\n", "本手册中的所有资料均为出版时的最新资料...\n" ] } ], "source": [ "#安装依赖:uv pip install langchain_experimental==0.4.1 -i https://mirrors.aliyun.com/pypi/simple\n", "from langchain_experimental.text_splitter import SemanticChunker\n", "from langchain_community.document_loaders import PyMuPDFLoader\n", "\n", "# 创建语义分块器\n", "# breakpoint_threshold_type=\"percentile\" 表示用百分位数法确定切分阈值\n", "# breakpoint_threshold_amount=95 表示只有相似度排名后 5% 的位置才会被切开\n", "text_splitter = SemanticChunker(\n", " embeddings=embedding_model,\n", " breakpoint_threshold_type=\"percentile\",\n", " breakpoint_threshold_amount=90 # 值越大,切出来的块越少(越粗)\n", ")\n", "\n", "loader = PyMuPDFLoader(\"car_info.pdf\")\n", "docs = text_splitter.split_documents(loader.load())\n", "\n", "print(f\"共切分为 {len(docs)} 个语义块\")\n", "print(f\"第一个块: {docs[0].page_content[:100]}...\")" ] }, { "cell_type": "code", "execution_count": 36, "id": "83ab3d8c", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:272: PyMilvusDeprecationWarning: `connections.list_connections` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " for con in connections.list_connections():\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:273: PyMilvusDeprecationWarning: `connections.get_connection_addr` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " addr = connections.get_connection_addr(con[0])\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:213: PyMilvusDeprecationWarning: `utility.has_collection` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " if utility.has_collection(self.collection_name, using=self.alias):\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:214: PyMilvusDeprecationWarning: `Collection` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " self.col = Collection(\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:430: PyMilvusDeprecationWarning: `Collection.indexes` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " for x in self.col.indexes:\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:432: PyMilvusDeprecationWarning: `Index.to_dict` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " return x.to_dict()\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:506: PyMilvusDeprecationWarning: `utility.load_state` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " and utility.load_state(self.collection_name, using=self.alias)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "混合检索返回 20 条结果\n", "说明!\n", "□当车速在0 – 40km/h的范围内,且车辆在陡坡上低速下坡行驶\n", "时,HDC才会激活。\n" ] } ], "source": [ "#安装依赖:uv pip install rank_bm25 -i https://mirrors.aliyun.com/pypi/simple\n", "from langchain_community.retrievers import BM25Retriever\n", "from langchain_community.vectorstores import Milvus\n", "from langchain_classic.retrievers import EnsembleRetriever\n", "\n", "# ---- 创建 BM25 检索器 ----\n", "# BM25 不需要向量,直接基于文本的关键词匹配\n", "bm25_retriever = BM25Retriever.from_documents(valid_docs)\n", "bm25_retriever.k = 10 # 返回 Top-10\n", "\n", "# ---- 创建向量检索器 ----\n", "vectorstore = Milvus(\n", " embedding_function=embedding_model,\n", " connection_args={\"uri\": \"http://localhost:19530\"},\n", " collection_name=\"car_info_collection\"\n", ")\n", "vector_retriever = vectorstore.as_retriever(search_kwargs={\"k\": 10})\n", "\n", "# ---- 创建混合检索器 ----\n", "# weights 控制各检索器的权重,总和建议为 1\n", "# 向量检索权重更高(0.6),因为语义理解通常更重要\n", "ensemble_retriever = EnsembleRetriever(\n", " retrievers=[bm25_retriever, vector_retriever],\n", " weights=[0.4, 0.6],\n", " normalize_scores=True # 将不同检索器的分数归一化到 [0,1],避免偏差\n", ")\n", "\n", "# 执行混合检索\n", "results = ensemble_retriever.invoke(\"在多少速度范围内,HDC才会激活?\")\n", "print(f\"混合检索返回 {len(results)} 条结果\")\n", "print(results[0].page_content)" ] }, { "cell_type": "code", "execution_count": 37, "id": "c77c616c", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:784: PyMilvusDeprecationWarning: `Collection.search` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " res = self.col.search(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "多查询检索返回 30 条结果\n", "说明!\n", "□当车速在0 – 40km/h的范围内,且车辆在陡坡上低速下坡行驶\n", "时,HDC才会激活。\n" ] } ], "source": [ "from langchain_core.prompts import PromptTemplate\n", "from langchain_community.chat_models import ChatTongyi\n", "from langchain_classic.retrievers.multi_query import MultiQueryRetriever\n", "\n", "# 初始化大模型\n", "llm = ChatTongyi(model=\"qwen-plus\", api_key=api_key)\n", "\n", "# 自定义改写提示词(可选,不写则用默认的)\n", "CUSTOM_PROMPT = PromptTemplate(\n", " input_variables=[\"question\"],\n", " template=\"\"\"你是一个专业的问题改写助手。请为下面的问题生成 4 个不同的改写版本,\n", "每个版本应该:\n", "- 从不同角度表达相同的意图\n", "- 使用不同的关键词和表达方式\n", "- 保持问题的核心含义\n", "\n", "每个问题单独一行,不要编号。\n", "\n", "原始问题: {question}\n", "\n", "改写后的问题:\"\"\"\n", ")\n", "\n", "# 创建多查询检索器\n", "# 底层检索器用的是上面的混合检索器,这样每个改写问题都会走混合检索\n", "multi_query_retriever = MultiQueryRetriever.from_llm(\n", " retriever=ensemble_retriever,\n", " llm=llm,\n", " prompt=CUSTOM_PROMPT\n", ")\n", "\n", "# 执行检索\n", "# 假设生成了 4 个改写问题,每个检索 10 条,去重后可能得到 20多 条结果\n", "results = multi_query_retriever.invoke(\"在多少速度范围内,HDC才会激活?\")\n", "print(f\"多查询检索返回 {len(results)} 条结果\")\n", "print(results[0].page_content)" ] }, { "cell_type": "code", "execution_count": 17, "id": "331e94a2", "metadata": {}, "outputs": [], "source": [ "class MultiRetrieverSystem:\n", " \"\"\"\n", " 多路召回检索系统\n", " 支持 BM25、向量检索、混合检索、多查询检索四种模式\n", " \"\"\"\n", "\n", " def __init__(self, documents, embedding_model, llm):\n", " self.documents = documents\n", " self.embedding_model = embedding_model\n", " self.llm = llm\n", " self.setup_retrievers()\n", "\n", " def setup_retrievers(self):\n", " \"\"\"初始化所有检索器\"\"\"\n", " # BM25 检索器\n", " self.bm25 = BM25Retriever.from_documents(self.documents)\n", " self.bm25.k = 10\n", "\n", " # 向量检索器\n", " self.vectorstore = Milvus(\n", " embedding_function=embedding_model,\n", " connection_args={\"uri\": \"http://localhost:19530\"},\n", " collection_name=\"car_info_collection\"\n", " )\n", " self.vector = self.vectorstore.as_retriever(search_kwargs={\"k\": 10})\n", "\n", " # 混合检索器\n", " self.ensemble = EnsembleRetriever(\n", " retrievers=[self.bm25, self.vector], # 待融合的基础检索器列表\n", " weights=[0.4, 0.6], # BM25权重0.4,向量检索权重0.6 总和建议为1,向量检索权重更高\n", " normalize_scores=True # 是否将不同检索器的分数归一化到[0,1](避免因分数范围差异导致融合偏差)\n", " )\n", "\n", " # 多查询检索器\n", " self.multi_query = MultiQueryRetriever.from_llm(\n", " retriever=self.ensemble,\n", " llm=self.llm,\n", " prompt=CUSTOM_PROMPT\n", " )\n", "\n", " def search(self, query, mode=\"ensemble\"):\n", " \"\"\"\n", " 执行检索\n", " mode: \"bm25\" | \"vector\" | \"ensemble\" | \"multi_query\"\n", " \"\"\"\n", " retriever_map = {\n", " \"bm25\": self.bm25,\n", " \"vector\": self.vector,\n", " \"ensemble\": self.ensemble,\n", " \"multi_query\": self.multi_query,\n", " }\n", " if mode not in retriever_map:\n", " raise ValueError(f\"不支持的检索模式: {mode},可选: {list(retriever_map.keys())}\")\n", " return retriever_map[mode].invoke(query)" ] }, { "cell_type": "code", "execution_count": 38, "id": "7c53f42a", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:272: PyMilvusDeprecationWarning: `connections.list_connections` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " for con in connections.list_connections():\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:273: PyMilvusDeprecationWarning: `connections.get_connection_addr` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " addr = connections.get_connection_addr(con[0])\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:213: PyMilvusDeprecationWarning: `utility.has_collection` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " if utility.has_collection(self.collection_name, using=self.alias):\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:214: PyMilvusDeprecationWarning: `Collection` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " self.col = Collection(\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:430: PyMilvusDeprecationWarning: `Collection.indexes` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " for x in self.col.indexes:\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:432: PyMilvusDeprecationWarning: `Index.to_dict` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " return x.to_dict()\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:506: PyMilvusDeprecationWarning: `utility.load_state` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " and utility.load_state(self.collection_name, using=self.alias)\n", "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:784: PyMilvusDeprecationWarning: `Collection.search` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " res = self.col.search(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "BM25: 10 条 | 向量: 10 条\n", "混合: 20 条 | 多查询: 28 条\n" ] } ], "source": [ "# 初始化系统\n", "rag_system = MultiRetrieverSystem(valid_docs, embedding_model, llm)\n", "\n", "# 对比不同检索策略的效果\n", "query = \"在多少速度范围内,HDC才会激活?\"\n", "\n", "bm25_results = rag_system.search(query, \"bm25\")\n", "vector_results = rag_system.search(query, \"vector\")\n", "ensemble_results = rag_system.search(query, \"ensemble\")\n", "multi_results = rag_system.search(query, \"multi_query\")\n", "\n", "print(f\"BM25: {len(bm25_results)} 条 | 向量: {len(vector_results)} 条\")\n", "print(f\"混合: {len(ensemble_results)} 条 | 多查询: {len(multi_results)} 条\")" ] }, { "cell_type": "code", "execution_count": 20, "id": "e48b942a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "原始问题: 这个东西怎么用啊\n", "重写结果: 该产品的使用方法\n" ] } ], "source": [ "from langchain_core.prompts import PromptTemplate\n", "from langchain_core.output_parsers import StrOutputParser\n", "from langchain_community.chat_models import ChatTongyi\n", "\n", "llm = ChatTongyi(model=\"qwen-plus\", api_key=api_key)\n", "\n", "# 查询重写 Prompt\n", "rewrite_prompt = PromptTemplate(\n", " input_variables=[\"query\"],\n", " template=\"\"\"你是一个查询优化助手。请将用户的口语化问题改写为更适合信息检索的精确查询。\n", "\n", "改写要求:\n", "1. 补充隐含的上下文信息\n", "2. 将口语化表达转为专业表述\n", "3. 消除歧义,明确查询意图\n", "4. 保持原意不变,不要添加原问题未提及的内容\n", "5. 直接输出改写后的查询,不要解释\n", "\n", "用户问题: {query}\n", "\n", "改写后的查询:\"\"\"\n", ")\n", "\n", "# 构建重写链\n", "rewrite_chain = rewrite_prompt | llm | StrOutputParser()\n", "\n", "# 测试\n", "original_query = \"这个东西怎么用啊\"\n", "rewritten = rewrite_chain.invoke({\"query\": original_query})\n", "print(f\"原始问题: {original_query}\")\n", "print(f\"重写结果: {rewritten}\")\n", "# 输出示例: \"该产品的安装配置和使用操作方法\"" ] }, { "cell_type": "code", "execution_count": 21, "id": "014df026", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "原始问题: 在多少速度范围内,HDC才会激活?\n", "重写后: HDC(陡坡缓降控制)系统激活的车速范围\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:784: PyMilvusDeprecationWarning: `Collection.search` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " res = self.col.search(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "根据上下文,HDC(陡坡缓降系统)在**车速为0 – 40 km/h**的范围内才会激活。 \n", "文中明确说明:“当车速在0 – 40 km/h的范围内,且车辆在陡坡上低速下坡行驶时,HDC才会激活。” \n", "\n", "注意:该功能还需满足“车辆在陡坡上低速下坡行驶”的条件,仅速度满足范围并不足以保证激活,但速度是必要前提。\n" ] } ], "source": [ "class RAGWithQueryRewriting:\n", " \"\"\"集成查询重写的 RAG 系统\"\"\"\n", "\n", " def __init__(self, retriever, llm, rewrite_chain):\n", " self.retriever = retriever\n", " self.llm = llm\n", " self.rewrite_chain = rewrite_chain\n", "\n", " def invoke(self, question):\n", " # 第一步:重写查询\n", " rewritten_query = self.rewrite_chain.invoke({\"query\": question})\n", " print(f\"原始问题: {question}\")\n", " print(f\"重写后: {rewritten_query}\")\n", "\n", " # 第二步:用重写后的查询进行检索\n", " docs = self.retriever.invoke(rewritten_query)\n", "\n", " # 第三步:用原始问题 + 检索结果生成答案\n", " context = \"\\n\\n\".join([doc.page_content for doc in docs])\n", " answer_prompt = f\"\"\"基于以下上下文回答用户问题。如果上下文中没有相关信息,请说明。\n", "\n", "上下文:{context}\n", "\n", "用户问题:{question}\n", "答案:\"\"\"\n", " answer = self.llm.invoke(answer_prompt).content\n", "\n", " return {\n", " \"original_query\": question,\n", " \"rewritten_query\": rewritten_query,\n", " \"retrieved_docs\": docs,\n", " \"answer\": answer\n", " }\n", "\n", "# 使用示例\n", "rag = RAGWithQueryRewriting(\n", " retriever=ensemble_retriever,\n", " llm=llm,\n", " rewrite_chain=rewrite_chain\n", ")\n", "result = rag.invoke(\"在多少速度范围内,HDC才会激活?\")\n", "print(result[\"answer\"])" ] }, { "cell_type": "code", "execution_count": 22, "id": "36166757", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "原始问题: 产品 A 和产品 B 的保修政策和价格有什么区别?\n", "分解结果:\n", " 1. 产品A的保修政策具体内容是什么?\n", " 2. 产品B的保修政策具体内容是什么?\n", " 3. 产品A的当前市场价格是多少?\n", " 4. 产品B的当前市场价格是多少?\n" ] } ], "source": [ "from langchain_core.prompts import PromptTemplate\n", "from langchain_core.output_parsers import StrOutputParser\n", "from langchain_community.chat_models import ChatTongyi\n", "import json\n", "\n", "llm = ChatTongyi(model=\"qwen-plus\", api_key=api_key)\n", "\n", "# 查询分解 Prompt\n", "decompose_prompt = PromptTemplate(\n", " input_variables=[\"question\"],\n", " template=\"\"\"你是一个问题分解助手。请将用户的复杂问题分解为 2-4 个独立的子问题,\n", "每个子问题应该能独立检索和回答。\n", "\n", "要求:\n", "1. 子问题之间互不依赖,可以并行检索\n", "2. 子问题覆盖原始问题的所有方面\n", "3. 每个子问题简洁明确\n", "4. 以 JSON 数组格式输出\n", "\n", "用户问题: {question}\n", "\n", "输出格式示例: [\"子问题1\", \"子问题2\", \"子问题3\"]\n", "\n", "子问题列表:\"\"\"\n", ")\n", "\n", "decompose_chain = decompose_prompt | llm | StrOutputParser()\n", "\n", "\n", "def decompose_query(question: str) -> list[str]:\n", " \"\"\"将复杂问题分解为子问题\"\"\"\n", " result = decompose_chain.invoke({\"question\": question})\n", " # 解析 JSON 数组\n", " try:\n", " sub_queries = json.loads(result.strip())\n", " return sub_queries\n", " except json.JSONDecodeError:\n", " # 兜底:按行分割\n", " return [line.strip() for line in result.strip().split(\"\\n\") if line.strip()]\n", "\n", "\n", "# 测试\n", "question = \"产品 A 和产品 B 的保修政策和价格有什么区别?\"\n", "sub_queries = decompose_query(question)\n", "print(f\"原始问题: {question}\")\n", "print(f\"分解结果:\")\n", "for i, sq in enumerate(sub_queries, 1):\n", " print(f\" {i}. {sq}\")\n", "# 输出示例:\n", "# 1. 产品 A 的保修政策是什么?\n", "# 2. 产品 B 的保修政策是什么?\n", "# 3. 产品 A 和产品 B 的价格分别是多少?" ] }, { "cell_type": "code", "execution_count": 23, "id": "072a607a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "分解为 4 个子问题\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:784: PyMilvusDeprecationWarning: `Collection.search` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " res = self.col.search(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "合并后共 32 个文档片段\n", "根据提供的上下文信息,**陡坡缓降系统(HDC)仅在车速为 0 – 40 km/h 的范围内才会激活**。\n", "\n", "具体说明如下(全部源自上下文):\n", "\n", "✅ **激活条件明确限定**: \n", "> “当车速在 **0 – 40 km/h 的范围内**,且车辆在**陡坡上低速下坡行驶**时,HDC才会激活。”\n", "\n", "❌ **超出该范围则无法激活或自动退出**: \n", "> “当车速在 **40–60 km/h 范围内无法激活 HDC 功能**”; \n", "> “车速超过 **60 km/h 时,HDC 自动退出**”; \n", "> 同时,系统说明中未提及高于40 km/h可激活——40 km/h 是**上限阈值**(含边界),即**≤40 km/h 是激活前提之一**。\n", "\n", "⚠️ 补充关键前提(缺一不可): \n", "- 车辆必须处于**下坡工况**(非平路或上坡); \n", "- 坡度需达到系统识别的“陡坡”程度(虽未量化具体坡度值,但文中指出:“当坡度过大时,HDC可能无法保持匀速”,反向印证其设计适用于一定范围内的陡坡); \n", "- HDC 功能需**已手动开启**(通过中央显示屏→车辆设置→其他→开启HDC); \n", "- 系统正常工作,无故障报警。\n", "\n", "📌 总结: \n", "HDC 的**有效激活速度区间为 0 km/h 至 40 km/h(含端点)**,且必须同时满足**下坡、陡坡、功能已启用**等条件。低于0 km/h(即停车)不适用;高于40 km/h(即使仍在下坡)既不能激活,若已激活也会在超速后退出。\n", "\n", "答案:**0 – 40 km/h**。\n" ] } ], "source": [ "from concurrent.futures import ThreadPoolExecutor\n", "#使用 ThreadPoolExecutor 创建线程池,并行执行检索\n", "#每个子问题独立检索,互不干扰\n", "#按内容哈希值去重(避免重复文档)\n", "\n", "def parallel_retrieve_and_merge(sub_queries, retriever, k_per_query=5):\n", " \"\"\"\n", " 对每个子问题并行检索,然后合并去重\n", " \"\"\"\n", " all_docs = []\n", " seen_contents = set()\n", "\n", " def retrieve_one(query):\n", " return retriever.invoke(query)\n", "\n", " # 创建线程池,线程数等于子问题数量\n", " with ThreadPoolExecutor(max_workers=len(sub_queries)) as executor:\n", " #提交所有检索任务\n", " futures = [executor.submit(retrieve_one, q) for q in sub_queries]\n", " ## 收集结果\n", " for future in futures:\n", " docs = future.result()\n", " for doc in docs:\n", " # 按内容去重\n", " content_hash = hash(doc.page_content)\n", " if content_hash not in seen_contents:\n", " seen_contents.add(content_hash)\n", " all_docs.append(doc)\n", "\n", " return all_docs\n", "\n", "\n", "# 完整的分解-检索-生成流程\n", "class RAGWithDecomposition:\n", " \"\"\"集成查询分解的 RAG 系统\"\"\"\n", "\n", " def __init__(self, retriever, llm):\n", " self.retriever = retriever\n", " self.llm = llm\n", "\n", " def invoke(self, question):\n", " # 第一步:分解问题\n", " sub_queries = decompose_query(question)\n", " print(f\"分解为 {len(sub_queries)} 个子问题\")\n", "\n", " # 第二步:并行检索并合并\n", " all_docs = parallel_retrieve_and_merge(sub_queries, self.retriever)\n", " print(f\"合并后共 {len(all_docs)} 个文档片段\")\n", "\n", " # 第三步:用所有上下文生成综合答案\n", " context = \"\\n\\n\".join([doc.page_content for doc in all_docs])\n", " answer_prompt = f\"\"\"基于以下上下文,全面回答用户的问题。\n", "请综合所有相关信息,给出完整、有条理的答案。\n", "\n", "上下文:{context}\n", "\n", "用户问题:{question}\n", "答案:\"\"\"\n", " answer = self.llm.invoke(answer_prompt).content\n", "\n", " return {\n", " \"question\": question,\n", " \"sub_queries\": sub_queries,\n", " \"doc_count\": len(all_docs),\n", " \"answer\": answer\n", " }\n", "\n", "# 使用示例\n", "rag_decomp = RAGWithDecomposition(retriever=ensemble_retriever, llm=llm)\n", "result = rag_decomp.invoke(\"在多少速度范围内,HDC才会激活?\")\n", "print(result[\"answer\"])" ] }, { "cell_type": "code", "execution_count": 24, "id": "dcf29581", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "问题: 怎么退货?\n", "需要澄清: True\n", "澄清反问: 请问您要退的是哪款商品?是在哪个平台或门店购买的?订单号或购买时间方便我们为您快速核实吗?\n", "默认假设: 用户近期在本平台下单购买了某件商品,且该商品仍在退货有效期内(如7天无理由退货),需依据具体订单信息提供退货流程\n", "\n", "问题: iPhone 16 Pro 的保修期是多久?\n", "需要澄清: True\n", "澄清反问: 请问您指的是官方 Apple 保修期(即标准有限保修),还是您已购买的 AppleCare+ 服务计划?另外,该设备是否为全新国行正品、购买渠道及激活时间是否已知?这些会影响保修起始日和覆盖范围。\n", "默认假设: 假设用户询问的是中国大陆地区全新国行 iPhone 16 Pro 的 Apple 官方标准有限保修期(自购买凭证日期起 1 年)\n", "\n", "问题: 这个多少钱?\n", "需要澄清: True\n", "澄清反问: 请问您指的是哪款商品或服务?能否提供名称、型号、图片或相关描述?\n", "默认假设: 用户正在咨询当前对话上下文中最近提及的某个商品或服务的价格\n" ] } ], "source": [ "from langchain_core.prompts import PromptTemplate\n", "from langchain_core.output_parsers import StrOutputParser\n", "from langchain_community.chat_models import ChatTongyi\n", "import json\n", "\n", "llm = ChatTongyi(model=\"qwen-plus\", api_key=api_key)\n", "\n", "# 查询澄清 Prompt\n", "clarify_prompt = PromptTemplate(\n", " input_variables=[\"query\"],\n", " template=\"\"\"你是一个智能客服助手。请判断用户的提问是否包含足够的信息来进行准确检索和回答。\n", "\n", "判断标准:\n", "1. 问题是否有明确的主语(指代的对象是否清晰)\n", "2. 问题是否包含必要的上下文(时间、地点、产品型号等)\n", "3. 问题是否存在歧义(可能有多种理解方式)\n", "\n", "请以 JSON 格式返回:\n", "- 如果问题清晰:{{\"need_clarify\": false, \"reason\": \"问题清晰的原因\"}}\n", "- 如果需要澄清:{{\"need_clarify\": true, \"clarification\": \"向用户提出的澄清问题\", \"assumption\": \"如果必须回答时的合理假设\"}}\n", "\n", "用户问题: {query}\n", "\n", "结果:\"\"\"\n", ")\n", "\n", "clarify_chain = clarify_prompt | llm | StrOutputParser()\n", "\n", "\n", "def check_and_clarify(query: str) -> dict:\n", " \"\"\"检查是否需要澄清,返回判断结果\"\"\"\n", " result = clarify_chain.invoke({\"query\": query})\n", " try:\n", " return json.loads(result.strip())\n", " except json.JSONDecodeError:\n", " # 兜底:假设不需要澄清\n", " return {\"need_clarify\": False, \"reason\": \"解析失败,默认直接回答\"}\n", "\n", "\n", "# 测试\n", "test_queries = [\n", " \"怎么退货?\",\n", " \"iPhone 16 Pro 的保修期是多久?\",\n", " \"这个多少钱?\",\n", "]\n", "\n", "for q in test_queries:\n", " result = check_and_clarify(q)\n", " print(f\"\\n问题: {q}\")\n", " print(f\"需要澄清: {result['need_clarify']}\")\n", " if result['need_clarify']:\n", " print(f\"澄清反问: {result['clarification']}\")\n", " print(f\"默认假设: {result.get('assumption', '无')}\")" ] }, { "cell_type": "code", "execution_count": 25, "id": "f87d0fb9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🤖: 请问您指的是哪款车型或具体系统版本的HDC(陡坡缓降控制)功能?不同品牌(如路虎、丰田、长城等)及不同车型(如发现运动版、普拉多、哈弗H9等)的HDC激活速度范围可能不同。\n", "[自动澄清] 假设用户意图为: 假设为2020款路虎发现运动版(Discovery Sport)搭载的第二代HDC系统,其典型激活速度范围为车速低于40 km/h且坡度大于10%时自动启用。\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:784: PyMilvusDeprecationWarning: `Collection.search` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " res = self.col.search(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "根据您提供的上下文,该文档中明确说明:\n", "\n", "> □当车速在0 – 40 km/h的范围内,且车辆在陡坡上低速下坡行驶时,HDC才会激活。 \n", "> □当车速在40–60 km/h范围内无法激活HDC功能,车速超过60 km/h时,HDC自动退出。 \n", "> ■当坡度过大时,HDC可能无法使车辆保持匀速地驶下陡坡…… \n", "\n", "但**上下文中未提及任何关于“坡度阈值(如10%)”的具体数值要求**(例如“坡度大于10%才启用”),也**未指明该系统为“第二代HDC”或特指2020款路虎发现运动版**。所有HDC相关描述均为通用功能说明,未绑定具体车型年份或代际。\n", "\n", "此外,文档中仅强调两个必要条件:\n", "- 车速在 **0–40 km/h**(含)范围内;\n", "- 车辆处于**陡坡下坡工况**(“陡坡”为定性描述,非定量定义)。\n", "\n", "⚠️ 注意:用户补充的“坡度大于10%时自动启用”属于外部技术资料信息,**不在所提供上下文中**,因此不能从本上下文推导或验证该数值。上下文仅支持“低速+陡坡下坡”这一定性触发条件,未给出坡度百分比、角度等量化标准。\n", "\n", "✅ 正确结论(严格基于给定上下文): \n", "HDC的典型激活条件是——**车速介于0至40 km/h之间,且车辆正在陡坡上低速下坡行驶**;超出此速度范围(≥40 km/h)即无法激活,>60 km/h时强制退出。\n", "\n", "❌ 不能确认(因上下文未提供): \n", "- 具体坡度阈值(如10%); \n", "- 是否为第二代系统; \n", "- 是否专属于2020款Discovery Sport(文档未提车型、年款或代际)。\n", "\n", "如需确认10%坡度门槛,应查阅该车型官方《车主手册》或路虎技术公告,而非本上下文。\n" ] } ], "source": [ "class RAGWithClarification:\n", " \"\"\"集成查询澄清的 RAG 系统(支持多轮对话)\"\"\"\n", "\n", " def __init__(self, retriever, llm):\n", " self.retriever = retriever\n", " self.llm = llm\n", " self.clarify_chain = clarify_chain\n", "\n", " def invoke(self, question, auto_clarify=False):\n", " \"\"\"\n", " auto_clarify=True: 需要澄清时直接用假设继续(适合 API 调用)\n", " auto_clarify=False: 需要澄清时返回澄清问题(适合交互式对话)\n", " \"\"\"\n", " # 第一步:检查是否需要澄清\n", " clarify_result = check_and_clarify(question)\n", "\n", " if clarify_result[\"need_clarify\"]:\n", " if auto_clarify:\n", " # 自动模式:用假设重新表述问题\n", " question = clarify_result.get(\"assumption\", question)\n", " print(f\"[自动澄清] 假设用户意图为: {question}\")\n", " else:\n", " # 交互模式:返回澄清问题,等待用户补充\n", " return {\n", " \"status\": \"need_clarify\",\n", " \"clarification\": clarify_result[\"clarification\"],\n", " \"original_question\": question\n", " }\n", "\n", " # 第二步:正常检索 + 生成\n", " docs = self.retriever.invoke(question)\n", " context = \"\\n\\n\".join([doc.page_content for doc in docs])\n", "\n", " answer_prompt = f\"\"\"基于以下上下文回答用户问题。\n", "\n", "上下文:{context}\n", "\n", "用户问题:{question}\n", "答案:\"\"\"\n", " answer = self.llm.invoke(answer_prompt).content\n", "\n", " return {\n", " \"status\": \"answered\",\n", " \"question\": question,\n", " \"answer\": answer\n", " }\n", "\n", "# 使用示例\n", "rag_clarify = RAGWithClarification(retriever=ensemble_retriever, llm=llm)\n", "\n", "# 交互模式\n", "result = rag_clarify.invoke(\"在多少速度范围内,HDC才会激活?\", auto_clarify=False)\n", "if result[\"status\"] == \"need_clarify\":\n", " print(f\"🤖: {result['clarification']}\") # \"请问您是在哪个渠道购买的?\"\n", "\n", "# 自动模式(API 场景)\n", "result = rag_clarify.invoke(\"在多少速度范围内,HDC才会激活?\", auto_clarify=True)\n", "print(result[\"answer\"]) " ] }, { "cell_type": "code", "execution_count": null, "id": "1ea9aab2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "假设性文档: 根据《XX智能家电产品保修政策(2024年修订版)》第3.1条,本系列产品实行“整机三年、核心部件五年”双重保修机制。具体而言:主机、外壳、控制面板等整机部件享有36个月(自发票开具日起算)免费维修或...\n", "\n", "原始问题: 产品保修期是多久?\n", "\n", "检索到 3 个文档:\n", " 1. 24个月\n", "空调\n", "空调滤芯(a)\n", "12个月...\n", " 2. 72个月\n", "正时皮带惰轮\n", "100,000公里/\n", "72个月\n", "更换冷却液\n", "48个月\n", "动力传动系\n", "统...\n", " 3. 自动变速器滤清器\n", "80,000公里/48\n", "个月\n", "制动器\n", "制动液(a)\n", "24个月\n", "空调...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:784: PyMilvusDeprecationWarning: `Collection.search` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " res = self.col.search(\n" ] } ], "source": [ "from langchain_core.prompts import PromptTemplate\n", "from langchain_core.output_parsers import StrOutputParser\n", "from langchain_community.chat_models import ChatTongyi\n", "\n", "llm = ChatTongyi(model=\"qwen-plus\", api_key=api_key)\n", "\n", "# HyDE Prompt:生成假设性文档\n", "hyde_prompt = PromptTemplate(\n", " input_variables=[\"question\"],\n", " template=\"\"\"请根据以下问题,写一段可能包含答案的文档片段。\n", "要求:\n", "1. 像真实文档一样专业、详细\n", "2. 包含具体的数据、步骤或事实\n", "3. 长度在 100-200 字之间\n", "4. 即使你不确定答案,也要根据问题合理推测,写出一段\"看起来像真的\"文档\n", "\n", "问题: {question}\n", "\n", "假设性文档:\"\"\"\n", ")\n", "\n", "hyde_chain = hyde_prompt | llm | StrOutputParser()\n", "\n", "\n", "def hyde_search(question: str, vectorstore, k=5):\n", " \"\"\"\n", " HyDE 检索流程:\n", " 1. 生成假设性文档\n", " 2. 对假设性文档做 Embedding\n", " 3. 用假设性文档的向量去检索\n", " \"\"\"\n", " # 第一步:生成假设性文档\n", " hypothetical_doc = hyde_chain.invoke({\"question\": question})\n", " print(f\"假设性文档: {hypothetical_doc[:100]}...\")\n", "\n", " # 第二步 + 第三步:用假设性文档的向量检索\n", " # LangChain 的 similarity_search 会自动对文本做 Embedding\n", " results = vectorstore.similarity_search(\n", " query=hypothetical_doc, # 用假设性文档而非原始问题\n", " k=k\n", " )\n", "\n", " return {\n", " \"original_question\": question,\n", " \"hypothetical_doc\": hypothetical_doc,\n", " \"retrieved_docs\": results\n", " }\n", "\n", "# 测试\n", "result = hyde_search(\n", " question=\"产品保修期是多久?\",\n", " vectorstore=vectorstore,\n", " k=3\n", ")\n", "\n", "print(f\"\\n原始问题: {result['original_question']}\")\n", "print(f\"\\n检索到 {len(result['retrieved_docs'])} 个文档:\")\n", "for i, doc in enumerate(result['retrieved_docs'], 1):\n", " print(f\" {i}. {doc.page_content[:80]}...\")" ] }, { "cell_type": "code", "execution_count": 27, "id": "7e116428", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "相关性分数: 0.9629\n", "内容: 说明!\n", "□当车速在0 – 40km/h的范围内,且车辆在陡坡上低速下坡行驶\n", "时,HDC才会激活。\n", "---\n", "相关性分数: 0.9477\n", "内容: □当车速在40-60 km/h范围内无法激活HDC功能,车速超过60 km/\n", "---\n" ] } ], "source": [ "import dashscope\n", "from http import HTTPStatus\n", "\n", "docs = list()\n", "for result in multi_results:\n", " docs.append(result.page_content)\n", "\n", "\n", "resp = dashscope.TextReRank.call(\n", " model=\"qwen3-rerank\",# 通义的重排模型\n", " api_key=api_key,\n", " query=\"在多少速度范围内,HDC才会激活?\",\n", " documents=docs,\n", " top_n=2, #精排后只保留 Top-2\n", " return_documents=True,\n", " )\n", "reRankdoc=list()\n", "if resp.status_code == HTTPStatus.OK and len(resp['output']['results'])>0:\n", " for reRankoutput in resp['output']['results']:\n", " reRankdoc.append(reRankoutput['document']['text'])\n", " print(f\"相关性分数: {reRankoutput['relevance_score']:.4f}\")\n", " print(f\"内容: {reRankoutput['document']['text']}\")\n", " print(\"---\")\n", "else:\n", " print(resp)\n", "\n" ] }, { "cell_type": "code", "execution_count": 28, "id": "8e1ed1ae", "metadata": {}, "outputs": [], "source": [ "from langchain_core.prompts import ChatPromptTemplate\n", "\n", "# 构建 Prompt 模板\n", "prompt = ChatPromptTemplate.from_template(\"\"\"\n", "你是一个专业的知识库助手。请根据以下检索到的上下文回答用户问题。\n", "\n", "**规则:**\n", "- 只基于提供的上下文回答,不要编造\n", "- 如果上下文中没有相关信息,直接说「根据现有资料,我找不到这个问题的答案」\n", "- 回答要简洁直接,引用原文时用引号\n", "\n", "**检索到的上下文:**\n", "{context}\n", "\n", "**用户问题:**\n", "{question}\n", "\"\"\")" ] }, { "cell_type": "code", "execution_count": 29, "id": "dab00451", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "HDC在车速0–40 km/h范围内才会激活。原文明确指出:“当车速在0 – 40km/h的范围内,且车辆在陡坡上低速下坡行驶时,HDC才会激活。”\n" ] } ], "source": [ "from langchain_community.chat_models import ChatTongyi\n", "from langchain_core.output_parsers import StrOutputParser\n", "\n", "# 初始化大模型(这里用通义千问,也可以换成 DeepSeek)\n", "llm = ChatTongyi(\n", " model=\"qwen-plus\", # 模型名称\n", " dashscope_api_key=api_key # 替换为你的真实 Key\n", ")\n", "\n", "# 拼装上下文\n", "context_text = \"\\n\\n---\\n\\n\".join([doc for doc in reRankdoc])\n", "\n", "# 构建 Chain 并调用\n", "chain = prompt | llm | StrOutputParser()\n", "\n", "response = chain.invoke({\n", " \"context\": context_text,\n", " \"question\": query\n", "})\n", "\n", "print(response)" ] }, { "cell_type": "code", "execution_count": null, "id": "03e8eb5d", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/var/folders/1r/_xp9zgm56dqbl9ytglx51ccw0000gn/T/ipykernel_42266/2818475440.py:3: DeprecationWarning: Importing faithfulness from 'ragas.metrics' is deprecated and will be removed in v1.0. Please use 'ragas.metrics.collections' instead. Example: from ragas.metrics.collections import faithfulness\n", " from ragas.metrics import (\n", "/var/folders/1r/_xp9zgm56dqbl9ytglx51ccw0000gn/T/ipykernel_42266/2818475440.py:3: DeprecationWarning: Importing answer_relevancy from 'ragas.metrics' is deprecated and will be removed in v1.0. Please use 'ragas.metrics.collections' instead. Example: from ragas.metrics.collections import answer_relevancy\n", " from ragas.metrics import (\n", "/var/folders/1r/_xp9zgm56dqbl9ytglx51ccw0000gn/T/ipykernel_42266/2818475440.py:3: DeprecationWarning: Importing context_precision from 'ragas.metrics' is deprecated and will be removed in v1.0. Please use 'ragas.metrics.collections' instead. Example: from ragas.metrics.collections import context_precision\n", " from ragas.metrics import (\n", "/var/folders/1r/_xp9zgm56dqbl9ytglx51ccw0000gn/T/ipykernel_42266/2818475440.py:3: DeprecationWarning: Importing context_recall from 'ragas.metrics' is deprecated and will be removed in v1.0. Please use 'ragas.metrics.collections' instead. Example: from ragas.metrics.collections import context_recall\n", " from ragas.metrics import (\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "开始生成评估数据...\n", "处理第 1/4 个问题: 车顶行李架最大载荷是多少?\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:784: PyMilvusDeprecationWarning: `Collection.search` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " res = self.col.search(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "处理第 2/4 个问题: 自适应巡航系统的工作速度范围是多少?\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:784: PyMilvusDeprecationWarning: `Collection.search` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " res = self.col.search(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "处理第 3/4 个问题: 车辆推荐的轮胎胎压是多少(空载前轮)?\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:784: PyMilvusDeprecationWarning: `Collection.search` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " res = self.col.search(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "处理第 4/4 个问题: 保养周期是多少公里或多长时间?\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/leon/workspace/ai-agent/04_rag_optimize/.venv/lib/python3.11/site-packages/langchain_community/vectorstores/milvus.py:784: PyMilvusDeprecationWarning: `Collection.search` is an ORM-style PyMilvus API and will be removed in PyMilvus 3.1. Use `MilvusClient` instead.\n", " res = self.col.search(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "开始评估...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Evaluating: 100%|██████████| 16/16 [08:43<00:00, 32.72s/it]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "评估结果: {'faithfulness': 0.7292, 'answer_relevancy': 0.6050, 'context_precision': 0.7083, 'context_recall': 0.7500}\n" ] } ], "source": [ "#安装依赖: uv pip install ragas\n", "from ragas import evaluate, RunConfig\n", "from ragas.metrics import (\n", " faithfulness,\n", " answer_relevancy,\n", " context_precision,\n", " context_recall\n", ")\n", "from datasets import Dataset\n", "from langchain_community.chat_models import ChatTongyi\n", "\n", "llm = ChatTongyi(model=\"qwen-plus\", api_key=api_key)\n", "\n", "# ---- 准备测试数据 ----\n", "test_questions = [\n", " {\n", " \"question\": \"车顶行李架最大载荷是多少?\",\n", " \"ground_truth\": \"车顶行李架最大载荷为70kg\"\n", " },\n", " {\n", " \"question\": \"自适应巡航系统的工作速度范围是多少?\",\n", " \"ground_truth\": \"自适应巡航系统(ACC)可以在0-150km/h范围内工作\"\n", " },\n", " {\n", " \"question\": \"车辆推荐的轮胎胎压是多少(空载前轮)?\",\n", " \"ground_truth\": \"空载时前轮推荐胎压为230 kPa\"\n", " },\n", " {\n", " \"question\": \"保养周期是多少公里或多长时间?\",\n", " \"ground_truth\": \"保养周期为15,000公里或12个月(以先到者为准)\"\n", " }\n", "]\n", "\n", "# ---- 构建评估数据集 ----\n", "evaluation_data = {\n", " \"question\": [],\n", " \"answer\": [],\n", " \"contexts\": [],\n", " \"ground_truth\": []\n", "}\n", "\n", "print(\"开始生成评估数据...\")\n", "for i, item in enumerate(test_questions, 1):\n", " question = item[\"question\"]\n", " ground_truth = item[\"ground_truth\"]\n", " \n", " print(f\"处理第 {i}/{len(test_questions)} 个问题: {question}\")\n", "\n", " # 1. 检索相关文档\n", " retrieved_docs = rag_system.search(question, \"multi_query\")\n", " contexts = [doc.page_content for doc in retrieved_docs]\n", "\n", " # 2. 用大模型生成答案\n", " context_text = \"\\n\\n\".join(contexts)\n", " prompt = f\"\"\"基于以下上下文回答问题。如果没有相关信息,请说\"无法从提供的信息中回答\"。\n", "\n", " 上下文:{context_text}\n", "\n", " 问题:{question}\n", " 答案:\"\"\"\n", " answer = llm.invoke(prompt).content\n", "\n", " # 3. 保存评估数据\n", " evaluation_data[\"question\"].append(question)\n", " evaluation_data[\"answer\"].append(answer)\n", " evaluation_data[\"contexts\"].append(contexts)\n", " evaluation_data[\"ground_truth\"].append(ground_truth)\n", "\n", "# ---- 执行评估 ----\n", "dataset = Dataset.from_dict(evaluation_data)\n", "\n", "# 配置评估运行参数\n", "run_config = RunConfig(\n", " timeout=600, # 单次操作超时时间(秒)\n", " max_workers=1, # 并发数,本地模型建议设为1\n", " max_retries=10, # 最大重试次数\n", " max_wait=120, # 重试间隔上限(秒)\n", ")\n", "\n", "# 定义要使用的评估指标\n", "metrics = [\n", " faithfulness, # 忠实度:答案是否基于上下文\n", " answer_relevancy, # 答案相关性:答案是否与问题相关\n", " context_precision, # 上下文精确度:检索到的上下文是否相关\n", " context_recall # 上下文召回率:是否检索到所有必要信息\n", "]\n", "\n", "print(\"\\n开始评估...\")\n", "result = evaluate(\n", " dataset,\n", " metrics=metrics,\n", " embeddings=embedding_model,\n", " llm=llm,\n", " run_config=run_config\n", ")\n", "\n", "# ---- 输出评估结果 ----\n", "print(\"评估结果:\",result)" ] } ], "metadata": { "kernelspec": { "display_name": "04_rag_optimize (3.11.x)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.undefined" } }, "nbformat": 4, "nbformat_minor": 5 }