中国建设银行网站签名通下载安装做cra需要关注的网站
中国建设银行网站签名通下载安装,做cra需要关注的网站,门户网站开发需求文档,网站群建设 公司检索链的种类
检索链是实现检索增强生成#xff08;RAG#xff09;的核心组件#xff0c;其核心逻辑是#xff1a;先从知识库中检索与用户相关的上下文#xff0c;再将问题和上下文传入大模型生成答案。其主要分类如下#xff1a;链名称核心特点RetrievalQA基础检索问答链…检索链的种类检索链是实现检索增强生成RAG的核心组件其核心逻辑是先从知识库中检索与用户相关的上下文再将问题和上下文传入大模型生成答案。其主要分类如下链名称核心特点RetrievalQA基础检索问答链最通用RetrievalQAWithSourcesChain专门优化「来源追溯」ConversationalRetrievalChain融合对话记忆RetrievalQAWithChainOptions自定义链配置进阶以电商平台商品推荐为例下面自己手搓的代码盗用请标注来源用到的函数fromlangchain_community.document_loadersimport(TextLoader,PyPDFLoader,UnstructuredMarkdownLoader,WebBaseLoader)fromlangchain_classic.schemaimportDocumentfromlangchain_community.vectorstoresimportFAISSfromlangchain_classic.chainsimportRetrievalQAfromlangchain_classic.promptsimportPromptTemplatefromlangchain_community.embeddingsimportDashScopeEmbeddings步骤一我用到的商品文件下图是我的商品pdf步骤二pdf转进行分块我们这里按照自定义字符串进行分割即#defprint_document_splits(splits,num_to_display5):print(f\n 文档分割详情共{len(splits)}个片段:\n*60)fori,docinenumerate(splits[:num_to_display]):print(f\n➡️ 片段{i1}:)print(f 来源:{doc.metadata.get(source,未知)})print(f 页码:{doc.metadata.get(page,未知)})print(f 字符数:{len(doc.page_content)})content_previewdoc.page_content[:200]...iflen(doc.page_content)200elsedoc.page_contentprint(f 内容预览:{content_preview})iflen(splits)num_to_display:print(f\n... 还有{len(splits)-num_to_display}个片段未显示)embeddingsDashScopeEmbeddings(modeltext-embedding-v3,dashscope_api_keysk-8009265c5eddxxxxx9cb9ef3)loaderPyPDFLoader(/wwwxxxx量商品推荐_20251224135554.pdf)documentsloader.load()# 按 # 分割这里是关键full_text\n.join([doc.page_contentfordocindocuments])chunksfull_text.split(#)步骤三创建向量数据库vectorstoreFAISS.from_documents(documentssplits,embeddingembeddings)vectorstore.save_local(./save_knowledgeDB)结果展示——生成好的知识库如果创建成功后下次就不用再创建向量数据库了直接导入加载即可加载代码如下vectorstoreFAISS.load_local(folder_path./save_knowledgeDB,# 你的保存路径embeddingsembeddings,# 需要用相同的embedding模型allow_dangerous_deserializationTrue)步骤四创造检索器由于工作内容检索复杂我打算采用混合检索器的方式那么混合检索器主要分为2种分别为简单检索器和加权融和检索器。混合检索器混合的两种方法通常是向量检索和BM25混合下面我将主要介绍这两种方法方法一简单融合检索器实现defSimple_hunhe_search(query,k):print( 简单混合检索——执行向量检索...)vector_documentvector_retriever.invoke(query)print( 简单混合检索——执行BM25检索...)bm25_documentBM25_retriever.invoke(query)all_docs,seen__content[],set()for_invector_document:content_.page_content[:100]# 取文档前100字符作为唯一标识防止相同文档重复统计ifcontentnotinseen__content:all_docs.append((_,0.6))seen__content.add(content)for_inbm25_document:content_.page_content[:100]ifcontentnotinseen__content:seen__content.add(content)all_docs.append((_,0.4))all_docs.sort(keylambdax:x[1],reverseTrue)result[cforc,_inall_docs[:k]]print( 简单混合检索完成...)returnresult方法一加权融合检索器实现defWeight_hunhe_search(query,vector_weight0.7,bm25_weight0.3,k5):print(f⚖️ 加权融合检索 (向量:{vector_weight}/BM25:{bm25_weight}))vector_documentvector_retriever.invoke(query)bm25_documentBM25_retriever.invoke(query)score_docs{}fori,_inenumerate(vector_document):score(1-i/len(vector_document))*vector_weightifvector_documentelse0content_.page_content[:150]ifcontentnotinscore_docs:score_docs[content]{doc:_,score:score}else:score_docs[content][score]scorefori,_inenumerate(bm25_document):score(1-i/len(bm25_document))*bm25_weightifbm25_documentelse0content_.page_content[:150]ifcontentnotinscore_docs:score_docs[content]{doc:_,score:score}else:score_docs[content][score]score resultsorted(score_docs.values(),keylambdax:x[score],reverseTrue)result[items[doc]foritemsinresult[:k]]returnresult步骤五写好提示词连接chain搭建工作流。我们的目的是先提取用户想买的商品该商品放入检索器检索并输出可能的商品再让一个基础LLMChain完成商品推荐逻辑## 先提取用户的商品名称fromlangchain_classic.chainsimportLLMChain extract_product_nameLLMChain(llmllm,promptPromptTemplate.from_template(你是一个专业提取用户需求的助手能够提取用户{input}里面想要的商品名称。例如我想买花露水 - 花露水,直接输出最终商品名称即可严禁多于废话),output_keyproduct_name,verboseFalse)introduct_productsLLMChain(llmllm,promptPromptTemplate.from_template(请结合用户需求和在知识库中检索出来的商品列表挑选最符合的商品推荐给用户输出格式为\为您推荐xx个商品第一款为xxx第二款为xxx。现在用户需求为{input},商品列表为{product_list}),output_keyanswer,verboseFalse)user_issues[我想买大米,给我推荐食用油,有没有口罩]fori,issueinenumerate(user_issues,1):print(f\n{*60})print(f{-*60})resultextract_product_name.invoke({input:f{issue}})print(result:,result[product_name])products_listWeight_hunhe_search(result[product_name],vector_weight0.7,bm25_weight0.3,k10)resintroduct_products.invoke({input:f{issue},product_list:f{products_list}})print(推荐话术,res[answer])print(f{*60})print(\n✅ 所有需求处理完成)效果展示