石家庄知名网站建设海东商城网站建设
石家庄知名网站建设,海东商城网站建设,建站报告2000字,制作灯笼的步骤及图片温馨提示#xff1a;LangChain更新速度飞快#xff0c;很多库的位置一直再变动#xff0c;因此导包的时候需要结合自己的版本。 引言
检索增强生成#xff08;Retrieval-Augmented Generation, RAG#xff09;解决了 AI 开发中的一个核心难题#xff1a;让大语言模型能够…温馨提示LangChain更新速度飞快很多库的位置一直再变动因此导包的时候需要结合自己的版本。引言检索增强生成Retrieval-Augmented Generation, RAG解决了 AI 开发中的一个核心难题让大语言模型能够访问并利用其训练数据之外的特定信息。借助 LangChain 1.0构建 RAG 流水线变得更加简洁高效、功能强大。本指南将带你从零开始搭建一套 RAG 系统——它能从你的文档中检索相关信息并以此为基础生成准确且上下文相关的回答。LangChain 1.0 引入了更清晰的 API 设计和更优的性能表现使得 RAG 的实现速度更快、稳定性更高。什么是 RAG为什么它如此重要RAG 将搜索能力与生成式 AI 相结合整个流程包含三个关键步骤索引Indexing将文档转换为向量嵌入vector embeddings并存入向量数据库检索Retrieval根据用户查询找出最相关的信息片段生成Generation结合检索到的上下文与模型自身能力生成最终回答RAG 的价值体现在以下几点为语言模型提供最新信息通过基于事实数据生成答案显著减少“幻觉”hallucinations无需对模型进行完整微调即可集成私有数据生成更准确、更贴合场景的 AI 回答环境配置首先安装 LangChain 1.0 及其必要依赖# 安装核心包pip install langchain1.0.0langchain-community chromadb openai tiktoken# 安装文档加载所需工具pip install unstructured pdf2image pillow pytesseract基础项目结构建议按如下结构组织你的项目rag-project/ ├── data/ # 存放你的文档文件 ├── index.py # 向量数据库创建逻辑 ├── retrieve.py # 检索功能实现 ├── generate.py # 带上下文的生成逻辑 └── main.py # 主应用入口构建你的第一个 RAG 流水线1. 加载并预处理文档首先我们将文档加载进来并切分为便于处理的文本块chunks# document_loader.pyfromlangchain_community.document_loadersimportDirectoryLoaderfromlangchain_text_splittersimportRecursiveCharacterTextSplitterdefload_documents(directory_path):# 从指定目录加载文档loaderDirectoryLoader(directory_path)documentsloader.load()# 将文档切分为文本块text_splitterRecursiveCharacterTextSplitter(chunk_size1000,# 每块最多 1000 个字符chunk_overlap200# 相邻块重叠 200 个字符保持上下文连贯)chunkstext_splitter.split_documents(documents)print(f成功加载{len(documents)}份文档共切分为{len(chunks)}个文本块)returnchunks2. 创建向量嵌入接下来将这些文本块转换为向量嵌入并存入向量数据库# index.pyimportosfromlangchain_community.embeddingsimportOpenAIEmbeddingsfromlangchain_community.vectorstoresimportChromadefcreate_vector_db(chunks,persist_directory./chroma_db):# 初始化嵌入模型使用 OpenAIembeddingsOpenAIEmbeddings()# 创建并向磁盘持久化向量数据库vectordbChroma.from_documents(documentschunks,embeddingembeddings,persist_directorypersist_directory)# 显式持久化确保数据写入磁盘vectordb.persist()print(f向量数据库已创建共包含{len(chunks)}个文本块)returnvectordb3. 配置检索器Retriever现在我们从已保存的向量数据库中加载数据并创建一个检索器# retrieve.pyfromlangchain_community.vectorstoresimportChromafromlangchain_community.embeddingsimportOpenAIEmbeddingsdefsetup_retriever(persist_directory./chroma_db):# 加载已持久化的向量数据库embeddingsOpenAIEmbeddings()vectordbChroma(persist_directorypersist_directory,embedding_functionembeddings)# 创建检索器使用相似度搜索返回最相关的 4 个结果retrievervectordb.as_retriever(search_typesimilarity,search_kwargs{k:4})returnretriever4. 构建 RAG 链RAG Chain最后我们将检索器、提示模板和大语言模型串联成一条完整的 RAG 链# generate.pyfromlangchain_community.chat_modelsimportChatOpenAIfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.runnableimportRunnablePassthroughfromlangchain_core.output_parserimportStrOutputParserdefcreate_rag_chain(retriever):# 初始化大语言模型LLMllmChatOpenAI(model_namegpt-3.5-turbo)# 定义提示模板仅基于提供的上下文回答问题template请仅根据以下上下文回答问题 {context} 问题{question} promptChatPromptTemplate.from_template(template)# 构建 RAG 链输入 → 检索上下文 原始问题 → 提示 → LLM → 字符串输出rag_chain({context:retriever,question:RunnablePassthrough()}|prompt|llm|StrOutputParser())returnrag_chain5. 整合所有组件将上述模块组合起来形成完整的应用# main.pyimportosfromdocument_loaderimportload_documentsfromindeximportcreate_vector_dbfromretrieveimportsetup_retrieverfromgenerateimportcreate_rag_chain# 设置 OpenAI API 密钥os.environ[OPENAI_API_KEY]your-api-keydefmain():# 1. 加载并处理文档chunksload_documents(./data)# 2. 创建向量数据库create_vector_db(chunks)# 3. 初始化检索器retrieversetup_retriever()# 4. 构建 RAG 链rag_chaincreate_rag_chain(retriever)# 5. 测试提问questionRAG 系统的主要优势有哪些answerrag_chain.invoke(question)print(f问题{question})print(f回答{answer})if__name____main__:main()高级 RAG 技巧提升检索质量通过更精细的参数调整获得更好的检索结果# 使用 MMR最大边际相关性提升多样性与相关性的平衡retrievervectordb.as_retriever(search_typemmr,# Maximum Marginal Relevancesearch_kwargs{k:6,# 最终返回 6 个结果fetch_k:10,# 先从数据库取 10 个候选lambda_mult:0.5,# 控制多样性 vs 相关性0完全多样1完全相关filter:{source:trusted_document.pdf}# 仅检索来自特定文件的片段})上下文预处理在送入 LLM 之前对检索到的文档进行格式化defformat_docs(docs):# 将多个文档内容用双换行符拼接return\n\n.join(doc.page_contentfordocindocs)# 在 RAG 链中加入格式化步骤rag_chain({context:retriever|format_docs,question:RunnablePassthrough()}|prompt|llm|StrOutputParser())评估与反馈引入评估机制量化 RAG 系统的表现fromlangchain.evaluation.qaimportQAEvalChain# 定义评估用例examples[{question:什么是 RAG,answer:RAG 是 Retrieval-Augmented Generation检索增强生成的缩写……},# 可添加更多样例]# 初始化评估器evaluatorQAEvalChain.from_llm(llmChatOpenAI())# 获取模型预测结果predictions{ex[question]:rag_chain.invoke(ex[question])forexinexamples}# 执行评估eval_resultevaluator.evaluate(examples,predictions)print(评估结果,eval_result)RAG 实际运行过程可视化当系统处理如下查询时内部发生了什么用户提问“RAG 中的向量嵌入是如何工作的”查询被转换为向量[0.023, -0.129, 0.47, …]检索到的相关文档片段“向量嵌入将文本转换为数值向量……”“语义搜索通过计算嵌入之间的相似度来查找相关内容……”生成的回答“在 RAG 中向量嵌入将文本转化为能捕捉语义含义的数值表示。系统通过余弦相似度等方法比较查询向量与文档向量的相似性从而找到相关上下文并在此基础上生成回答。”常见 RAG 挑战与解决方案挑战解决方案检索质量低改用 MMR最大边际相关性替代简单相似度搜索上下文长度受限优化分块策略chunking strategy查询与文档语义不匹配引入 LLM 对原始查询进行重写query rewriting检索速度慢调优向量数据库参数如索引类型、维度压缩出现幻觉增加来源验证步骤要求模型引用具体文档性能优化建议要获得更佳的 RAG 表现可尝试以下策略分块策略实验不同的 chunk_size 和 chunk_overlap 组合嵌入模型对比 OpenAI、BERT、Sentence Transformers 等不同嵌入模型的效果检索方法采用混合搜索Hybrid Search结合关键词匹配与向量相似度提示工程在提示词中明确要求模型引用来源或说明依据向量数据库调优根据实际场景选择合适的索引结构如 HNSW、IVF结语使用 LangChain 1.0 构建 RAG 流水线能够让你的 AI 系统基于真实、相关的文档生成更准确、更可信的回答。这种方法有效弥补了传统大语言模型无法获取最新或私有信息的短板。得益于 LangChain 1.0 的模块化设计你可以轻松定制 RAG 系统的每一个环节——从文档加载、向量索引、检索策略到最终生成。建议从本文的基础实现起步再根据具体业务需求逐步扩展和优化。参考文献https://langchain-tutorials.com/lessons/rag-applications/lesson-11https://www.geeksforgeeks.org/artificial-intelligence/rag-with-langchain/https://markaicode.com/building-rag-pipelines-langchain/https://docs.langchain.com/oss/python/langchain/rag