丰台网站开发,弄一个微信小程序多少钱,ui培训班怎么样,奋进新征程本文深入探讨了RAG#xff08;Retrieval Augmented Generation#xff09;技术的实现细节与优化策略#xff0c;指出在AI应用开发中#xff0c;RAG常被视为黑盒导致问题定位困难。文章从文档分块#xff08;Chunking#xff09;、索引增强#xff08;语义增强与反向HyDE…本文深入探讨了RAGRetrieval Augmented Generation技术的实现细节与优化策略指出在AI应用开发中RAG常被视为黑盒导致问题定位困难。文章从文档分块Chunking、索引增强语义增强与反向HyDE、编码Embedding、混合检索Hybrid Search到重排序Re-Ranking等关键环节进行了详细解析强调需结合具体场景对各模块进行调优以提升召回率与精确率的平衡并倡导从快速使用走向深度优化的实践路径。写在前面随着AI应用开发的普及RAG成了一个家喻户晓的词非常朴实且出镜率极高不过在平时也会经常听到一些声音“RAG效果不好可能需要微调模型”“xxx上的RAG产品不好用召回不精准”“我需要更强大的RAG工具不然这个效果很难提升”等等首先可以肯定光从上述一些话术中不能说明大家对于RAG的实践和结论是有问题的但是当进一步沟通的时候比较多的case中会发现比较那回答出“为什么你觉得RAG不好用”“有实际case吗比如什么样的query召回了什么样的知识”“我们的文档是怎么组织的如何编写的有做一些结构和分块上的处理吗”。日常我们会比较多的把RAG当成一个黑盒输入是我们沉淀的文档输出可能是整个AI应用反馈的最终结果如下图所示这样的方式下我们可能可以收获一定的初期收益但是当要持续优化或者扩展使用场景的时候可能会缺乏评估和应对的方式比较难去定位问题因此也不太能说清楚当下链路的诉求最后所对应的action也可能会偏离比较大。Fig1.RAG链路图-粗粒度版,有缺失下面想稍微深入探索下RAG链路和涉及的一些技术细节希望可以给到实践中的小伙伴一些参考从而可以更好的诊断问题、找到可优化的节点做出更合理的迭代设计。重新介绍下RAGRAG核心的功能就是针对用户Query补充和Query相关的且模型没有的信息同时要在两个维度上做要求1.召回率能够找到最相关的信息2.精确率不相关的信息不要RAG技术以及我们针对实践的设计主要就是锚定这两个维度指标的提升去的同时这两个指标在现实实践中是个权衡需要找到一个相对适合的值追求两者都很高不太现实或者说可能需要付出的代价不足以让我们这么去做。RAG是RetrievalAugmentationGeneration三个词的缩写代表了三个核心的行为Retrieve-检索、Augment-增强以及Generate-生成同时在三个核心动作之外还有一个embedding-编码具体见下图Fig2.RAG链路图-细粒度版下面分别针对笔者觉得可能影响RAG实践中效果的一些技术点图中标有编号的部分做进一步的描述。1. 文档分块-Chunking所谓兵马未动粮草先行要有一个好的检索结果首先要从我们的知识文档的优化开始我们实践中比较重视知识文档的内容沉淀但是在一些文档结构组织段落划分以及一些知识点的内聚性和正交性上会涉及少一点。我们来看下一份文档在语义chunking基础的按照token、字符、语句、段落切分大部分情况下效果都比较局限下是被如何处理的。# 设置本地数据保存目录local_data_dir pathlib.Path(/Users/jiangdanyang/workspaces/python/MarioPython/src/RAG/dataset/ai-arxiv2)# 加载数据集如果本地存在则从本地加载否则下载dataset load_dataset(jamescalam/ai-arxiv2, splittrain, cache_dirstr(local_data_dir)) # 初始化编码器encoder OpenAIEncoder( nametext-embedding-3-small, openai_api_keyos.getenv(AI_API_KEY), openai_base_urlos.getenv(AI_API_BASE_URL)) chunker StatisticalChunker( encoderencoder, min_split_tokens100, max_split_tokens500, plot_chunksTrue, enable_statisticsTrue,) chunks_0 chunker(docs[dataset[content][0]], batch_size500)例子中是针对一篇论文做chunkingchunking会设置min_split_tokens最小chunk的tokens数和max_split_tokens最大chunk的tokens数chunking完之后的统计结果可见下面的图和表Chunking Statistics: - Total Documents: 474 - Total Chunks: 46 - Chunks by Threshold: 41 - Chunks by Max Chunk Size: 4 - Last Chunk: 1 - Minimum Token Size of Chunk: 54 - Maximum Token Size of Chunk: 495 - Similarity Chunk Ratio: 0.89可以先看下统计的结果文字描述简单做下解释整体Documents可以简单理解为句子数本部分设计的document都是该含义474整体切分的文件块chunk46个其中41chunk的切分是基于相似度的阈值可以理解为是按照语义正常划分出来的有4个是因为达到了500tokens数量被切分的还有最后1个chunk是到文章结尾了最大的chunk的token数495个最小的chunk的token数54个因为是lastchunk所以会出现小于min_split_tokens的情况最后SimilarityChunkRatio是统计这次切分的chunk89%的chunk是按照语义切分出来的41/46SimilarityChunkRatio可以比较好的说明当前外部文档的chunking的结果因为试想都是被max_split_tokens卡主划分的chunk后续在语义检索的时候结果也不会太好。实践中需要针对你的文档情况调整split的token大小在chunk的数量和相关性比例上达到一个平衡除了chunk的大小还有两个值需要关注Threshold就是所谓的相似度的下限上面例子中threshold是0.31该值越大chunk内的相关性越好WindowSize是被用于计算的document的数量大小默认是5即每次是选择连续的5个document计算相似度windowsize设置越大上下文切分的相关性越好但是同时chunking过程的计算量和耗时也更高chunk大小相对要大这篇论文《Meta-Chunking: Learning Text Segmentation and Semantic Completion via Logical Perception》也给出了一个基于逻辑和语义的chunking的方法有完整的效果评测可参考除了semantic Chunking之外还有面向多模态数据文档类型的Modality-Specific Chunking可以比较好的区分不同内容类型的文档块并面向文本、表格、代码、图使用不同的chunking策略和Agentic Chunking让能力强的LLM阅读全文判断给出切分策略上述都是工具箱里面的工具实践中需要结合自身的场景、知识现状、成本综合去权衡选择并且面向效果进行调优或者切换更适合的方式。2. 索引增强-Indexing索引增强这里介绍两种类型1.语义增强2.反向HyDE。语义增强语义增强就是将chunk和该chunk所在的文档内容这里是整片论文传给LLM让LLM结合整个文档对这段chunk作个概述然后把这个概述的信息append到chunk的内容中从而增强在后续进行语义检索时的精确性。DOCUMENT_CONTEXT_PROMPT document{doc_content}/document CHUNK_CONTEXT_PROMPT Here is the chunk we want to situate within the whole documentchunk{chunk_content}/chunk Please give a short succinct context to situate this chunk within the overall document for the purposes of improving search retrieval of the chunk.Answer only with the succinct context and nothing else.这里的LLM选择需要能力比较强的大模型最好可以有promptcache功能这样可以大大节省这一部的模型调用开销同时也有一些做法是可以增加前后两个chunk的内容对于整体文档比较长且前后文本关联度比较大的场景会有一些增强的效果。反向HyDEHyDEHypothetical Document Embeddings是正向query检索增强的一种方式即可以针对用户的query生成一些假设的答案或者做query扩写然后通过这些中间内容去做检索召回反向HyDE的意思是针对chunk可以视为answer生成这块chunk可能的question然后针对这些quetion进行索引构建关联到具体的chunk内容反向HyDE相比HyDE的优势是可以离线处理不影响实时调用的rt。Given the following text chunk, generate {n} different questions that this chunk would be a good answer to: Chunk: {chunk} Questions (enumarate the questions with 1.2., etc.):该方法比较适合这类问答型的知识比如一些答疑内容有明确的A和Q的或者可以作为后面hybridsearch中的关键词扩写提升后续混合检索的效果。3. 编码-EmbeddingEmbedding大家应该都很熟悉就是将输入的文本多模态内容转换成向量主要过程包含文字到token的切分然后每个token在词汇表中有对应的id每个tokenid都会对应同等维度不同embedding模型维度不同的向量可以看个简单的例子。first_sentence 直播分享会AI Living第一场second_sentence 直播鲁班小组分享第77期 model SentenceTransformer(/Users/jiangdanyang/workspaces/python/Model/all-MiniLM-L6-v2)tokenized_first_sentence model.tokenize([first_sentence])tokenized_second_sentence model.tokenize([second_sentence])编码之后是当前文本对应的tokens的tokenid列表这里影响编码的原因有这些编码模型的语言问题不同语言会有不同的分词和词汇表比如例子中使用的这个编码模型all-MiniLM-L6-v2在处理中文的文本时候就比较差可以看到返回的id有好些100不可识别的token中文的处理可以找相应的中文embedding模型但是不是所有语言都有对应的编码模型因为语种太多同时如果一些语种对应的数据语料太少不足以训练这样的一个模型。编码模型的词汇表大小例子中的all-MiniLM-L6-v2的词汇表大小是30522有些主流模型的词汇表大小基本都在5w以上有些10w以上词汇表小会导致一些词无法表示只能用一个兜底tokenid来代替会影响后续处理的效果词汇表大能精准标识文本的输入但是间接也会增加文本编码完之后的token大小。编码模型的语义空间不同的编码模型有自己的词汇表以及自己对应的向量语义空间向量语义空间的效果决定于该模型训练基于的数据集目前用于文本编码的模型基本都是现有世界知识的通用语义空间偏日常、大众化的关联如果我们需要在一个特定领域下有一个特殊的语义空间可能就需要找一个使用该领域下的数据训练的embedding模型或者需要自己SFT一个不然预期想要的效果和实际效果可能会有比较大的gap。顺便说下图知识的问题直接拿图片当知识处理过程可能就是OCR的文本提取或者是LLM对于图片的理解描述但是这里的干扰会很大比如中间过程的文本是不是你期望的样子和描述的维度这些都需要把握下不然后续的检索召回肯定也是一团浆糊4. 检索-HybridSearchHyBridSearch混合搜索本质上是结合了Term-based和Semantic-based两种模式的检索特性通过融合两种形式的算法来提升检索的准确性和相关性HybridSearch结合了SparseVector稀疏向量相似度计算----关键词匹配和DenseVector稠密向量相似度计算----语义匹配从而提升检索的效果可见下图Sparse向量主要是通过BM25为代表的算法生成BM25核心就是TF-IDF算法词频-反向文档频率返回是某个query相对每个文档编号的分数值具体算法如下。# Load the chunkscorpus_json json.load(open(/Users/jiangdanyang/workspaces/python/MarioPython/src/RAG/dataset/corpus.json))corpus_text [doc[text] for doc in corpus_json] # optional: create a stemmerenglish_stemmer snowballstemmer.stemmer(english) # Initialize the Tokenizer with the stemmersparse_tokenizer Tokenizer( stemmerenglish_stemmer, lowerTrue, # lowercase the tokens stopwordsenglish,# or pass a list of stopwords splitterr\w,# by default r(?u)\b\w\w\b, can also be a function) # Tokenize the corpuscorpus_sparse_tokens ( sparse_tokenizer .tokenize( corpus_text, update_vocabTrue, # update the vocab as we tokenize return_asids )) # Create the BM25 retriever and attach your corpus_json to itsparse_index bm25s.BM25(corpuscorpus_json)# Now, index the corpus_tokens (the corpus_json is not used yet)sparse_index.index(corpus_sparse_tokens) # Return 10 the most relevant docs according to the querysparse_results, sparse_scores sparse_index.retrieve(query_tokens, k10)Dense向量主要是通过基于Transformer架构的embedding模型来进行编码生成同时针对查询query使用同样的embedding模型进行编码然后再进行向量的相似度比对找出最相似的n个结果。#Dense Index# create the vector database clientqdrant QdrantClient(path/Users/jiangdanyang/workspaces/python/MarioPython/src/RAG/dataset/qdrant_data)# Create the embedding encoderdense_encoder SentenceTransformer(/Users/jiangdanyang/workspaces/python/Model/all-MiniLM-L6-v2) collection_name hybrid_searchqdrant.recreate_collection( collection_namecollection_name, vectors_configmodels.VectorParams( sizedense_encoder.get_sentence_embedding_dimension(), distancemodels.Distance.COSINE ))# vectorize!qdrant.upload_points( collection_namecollection_name, points[ models.PointStruct( ididx, vectordense_encoder.encode(doc[text]).tolist(), payloaddoc ) for idx, doc in enumerate(corpus_json) # data is the variable holding all the enriched texts ]) query_vector dense_encoder.encode(query).tolist()dense_results qdrant.search( collection_namecollection_name, query_vectorquery_vector, limit10)  最后针对上述两种方式找出的chunk做综合筛选这里可以有多种方式比如比较常用的就是先分别对Sparse向量和Dense向量计算出来的topn个结果的分值做归一化然后针对统一个Chunk按照一定的权重比如Sparse向量计算结果权重0.2Dense向量计算结果权重0.8计算一个最终分值最后返回topn个chunk列表给到下个节点 code-snippet__js # Normalize the two types of scores如果当前场景的检索需要兼顾关键词和语义的时候可以考虑混合搜索需要结合文档内容、chunking和关键字词构建等环节相对于关键字词匹配检索混合搜索可以降低查询编写的规范性不一定要有特定的关键词出现以及提升查询的容错性可能会有拼写错误或者不恰当的描述相对于语义相似检索混合搜索可以增加一些领域专有信息的更精准匹配提升检索结果的准确性。5. 重排-ReRanking检索的优点是可以在海量的知识里面快速找到和用户query相关的内容块docs但是检索所返回出来的docs实际上可能部分和用户query关联度并不大这个时候就需要通过re-rank这一步对于检索返回出来的docs做关联度排序最终选取最相关的topk个doc做后续的上下文补充。在RAG链路中ReRanking的常用技术是Cross-Encoder交叉编码器本质一个Bert模型Encode-only的transformer架构计算query和每一个doc相关性返回0~1之间的结果1代表最相关示意图和代码示例如下from sentence_transformers import CrossEncoder cross_encoder CrossEncoder(/Users/jiangdanyang/workspaces/python/Model/jina-reranker-v1-tiny-en)hybrid_search_results {}with open(/Users/jiangdanyang/workspaces/python/MarioPython/src/RAG/dataset/dense_results.json) as f: dense_results json.load(f) for doc in dense_results: hybrid_search_results[doc[id]] doc with open(/Users/jiangdanyang/workspaces/python/MarioPython/src/RAG/dataset/sparse_results.json) as f: sparse_results json.load(f) for doc in sparse_results: hybrid_search_results[doc[id]] doc console.print(hybrid_search_results) # This is the query that we used for the retrieval of the above documentsquery What is context size of Mixtral?pairs [[query, doc[text]] for doc in hybrid_search_results.values()] scores cross_encoder.predict(pairs)最后进行排序选择topk个结果补充到context中然后调用模型拿最后的结果client OpenAI( api_keyos.getenv(AI_API_KEY), base_urlos.getenv(AI_API_BASE_URL))completion client.chat.completions.create( modelqwen_max, messages[ {role: system, content: You are chatbot, an research expert. Your top priority is to help guide users to understand reserach papers.}, {role: user, content: query}, {role: assistant, content: str(search_results)} ])结语AI应用的开发实践进行得非常火热现阶段可能更多的是对已有的一些基建平台、开发编排工具、现成的横向基础产品做整合使用结合使用场景做链路设计。但是随着时间推移还是需要慢慢深入到部分细节往深水区慢慢前行本文讲述的RAG只是AI架构中的一块其他相关的技术在对待方式上也雷同都需要经历快速使用、技术细节了解、使用产品实现了解、应用中的设计实现迭代、面向效果的循环优化快速上手有捷径得益于比较好的基础设施建设成本比较低但是深入追寻效果切实提升效率或幸福感需要更深入的探寻希望对读到这里的小伙伴有帮助。普通人如何抓住AI大模型的风口领取方式在文末为什么要学习大模型目前AI大模型的技术岗位与能力培养随着人工智能技术的迅速发展和应用 大模型作为其中的重要组成部分 正逐渐成为推动人工智能发展的重要引擎 。大模型以其强大的数据处理和模式识别能力 广泛应用于自然语言处理 、计算机视觉 、 智能推荐等领域 为各行各业带来了革命性的改变和机遇 。目前开源人工智能大模型已应用于医疗、政务、法律、汽车、娱乐、金融、互联网、教育、制造业、企业服务等多个场景其中应用于金融、企业服务、制造业和法律领域的大模型在本次调研中占比超过30%。随着AI大模型技术的迅速发展相关岗位的需求也日益增加。大模型产业链催生了一批高薪新职业人工智能大潮已来不加入就可能被淘汰。如果你是技术人尤其是互联网从业者现在就开始学习AI大模型技术真的是给你的人生一个重要建议最后只要你真心想学习AI大模型技术这份精心整理的学习资料我愿意无偿分享给你但是想学技术去乱搞的人别来找我在当前这个人工智能高速发展的时代AI大模型正在深刻改变各行各业。我国对高水平AI人才的需求也日益增长真正懂技术、能落地的人才依旧紧缺。我也希望通过这份资料能够帮助更多有志于AI领域的朋友入门并深入学习。真诚无偿分享vx扫描下方二维码即可加上后会一个个给大家发大模型全套学习资料展示自我们与MoPaaS魔泊云合作以来我们不断打磨课程体系与技术内容在细节上精益求精同时在技术层面也新增了许多前沿且实用的内容力求为大家带来更系统、更实战、更落地的大模型学习体验。希望这份系统、实用的大模型学习路径能够帮助你从零入门进阶到实战真正掌握AI时代的核心技能01教学内容从零到精通完整闭环【基础理论 →RAG开发 → Agent设计 → 模型微调与私有化部署调→热门技术】5大模块内容比传统教材更贴近企业实战大量真实项目案例带你亲自上手搞数据清洗、模型调优这些硬核操作把课本知识变成真本事02适学人群应届毕业生无工作经验但想要系统学习AI大模型技术期待通过实战项目掌握核心技术。零基础转型非技术背景但关注AI应用场景计划通过低代码工具实现“AI行业”跨界。业务赋能突破瓶颈传统开发者Java/前端等学习Transformer架构与LangChain框架向AI全栈工程师转型。vx扫描下方二维码即可本教程比较珍贵仅限大家自行学习不要传播更严禁商用03入门到进阶学习路线图大模型学习路线图整体分为5个大的阶段04视频和书籍PDF合集从0到掌握主流大模型技术视频教程涵盖模型训练、微调、RAG、LangChain、Agent开发等实战方向新手必备的大模型学习PDF书单来了全是硬核知识帮你少走弯路不吹牛真有用05行业报告白皮书合集收集70报告与白皮书了解行业最新动态0690份面试题/经验AI大模型岗位面试经验总结谁学技术不是为了赚$呢找个好的岗位很重要07 deepseek部署包技巧大全由于篇幅有限只展示部分资料并且还在持续更新中…真诚无偿分享vx扫描下方二维码即可加上后会一个个给大家发