2026/2/6 9:26:58
网站建设
项目流程
在省建设厅网站怎样报建,中国建设银行网站企业登陆,zencart网站模板下载,windows网站建设教程视频教程大家好#xff0c;上次分享了怎么用LangChain配合图数据库Neo4j构建知识图谱应用#xff0c;想必大家对这块内容已经有了基本的了解。这次我就接着带大家使用LangChain和Neo4j实现一个真实的图RAG管道#xff0c;然后我还会采用最简单的方式#xff0c;也就是LangChain中一…大家好上次分享了怎么用LangChain配合图数据库Neo4j构建知识图谱应用想必大家对这块内容已经有了基本的了解。这次我就接着带大家使用LangChain和Neo4j实现一个真实的图RAG管道然后我还会采用最简单的方式也就是LangChain中一个简单的用来评估模型答案准确性的类QAEvalChain对图RAG结果的准确性进行简单的评估简单的模拟真实开发场景。1.构建知识图谱在之前的分享中我随便在网上摘抄了一段非常简单的文本来呈现知识图谱的构建流程这样做的目的主要是为了研究学习让大家看清楚整个流程。在实际的工作中引入的数据源可不会这么简单为了更贴近真实场景这次我会使用一份关于滑雪的PDF文件来构建知识图谱整个构建过程依次包含PDF文本提取、文本分块、图文档生成与保存四个阶段。1.1 引入包import os from dotenv import load_dotenv from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.document_loaders import PyPDFLoader from langchain_experimental.graph_transformers import LLMGraphTransformer from langchain_neo4j import Neo4jGraph from langchain_openai import ChatOpenAI1.2 获取Neo4j实例连接凭证load_dotenv() URI os.getenv(NEO4J_URI) USER os.getenv(NEO4J_USER) PASS os.getenv(NEO4J_PASS)1.3 提取PDF文本对于PDF文件这里使用的是LangChain自带的用来导入PDF文件并从中提取文本的工具PyPDFLoader。 通过调用PyPDFLoader的load()方法会返回一个Document列表列表中每个Document对应PDF中的一页列表的大小对应PDF的页数。“TipLangChain中的Document是用来表示文档内容片段的类 作用主要是传递文档的内容和元数据。pdf_path data/skiing.pdf loader PyPDFLoader(pdf_path) # pages是一个Document列表 pages loader.load()为了规避大语言模型上下文窗口的限制需将原文本切分成更小的块分块这里我们采用最为常用的递归切分。“Tip递归切分演练场text_splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap50 ) chunks text_splitter.split_documents(pages)1.5 生成图文档llm ChatOpenAI(modelgpt-5-nano, temperature0) llm_transformer LLMGraphTransformer(llmllm) # graph_documents是包含节点与关系的图文档 graph_documents llm_transformer.convert_to_graph_documents(chunks) print(fNodes:{graph_documents[0].nodes}) print(fRelationships:{graph_documents[0].relationships})1.6 保存图文档graph Neo4jGraph(urlURI, usernameUSER, passwordPASS) graph.add_graph_documents( graph_documents, # 图谱中要包含引用的源 include_source True )1.7 完整代码import os from dotenv import load_dotenv from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.document_loaders import PyPDFLoader from langchain_experimental.graph_transformers import LLMGraphTransformer from langchain_neo4j import Neo4jGraph from langchain_openai import ChatOpenAI load_dotenv() URI os.getenv(NEO4J_URI) USER os.getenv(NEO4J_USER) PASS os.getenv(NEO4J_PASS) pdf_path data/skiing.pdf loader PyPDFLoader(pdf_path) pages loader.load() text_splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap50 ) chunks text_splitter.split_documents(pages) llm ChatOpenAI(modelgpt-5-nano, temperature0) llm_transformer LLMGraphTransformer(llmllm) graph_documents llm_transformer.convert_to_graph_documents(chunks) print(fNodes:{graph_documents[0].nodes}) print(fRelationships:{graph_documents[0].relationships}) graph Neo4jGraph(urlURI, usernameUSER, passwordPASS) graph.add_graph_documents( graph_documents, include_source True )执行结果如下图所示2.设置检索之前我们简单分享了使用GraphCypherQAChain基于Neo4j数据库进行问答的简单流程这是图RAG应用最基础的功能。在真实的使用场景中大家可能会发现大语言模型与图配合得并不理想——无法生成正确的Cypher查询语句。什么原因这是因为大语言模型理解语言但未必理解数据库模式。在人工智能领域有句名言**“垃圾进垃圾出”这既可以指输入数据的质量**也可以指提示的有效性我们这里主要讨论后者——提示的有效性目的是创建出最佳提示让模型理解图的模式(Schema)。模式指的是数据的组织方式。在SQL中模式中包含了表、表中的列以及表与表之间的关系。对于图而言模式描述的是节点之间的关联关系。要获取图的模式有两种方式在Neo4j浏览器中执行CALL db.schema.visualization在使用LangChain进行图RAG编码时让LangChain告知模式。graph Neo4jGraph(urlURI, usernameUSER, passwordPASS) # 查看图的模式 print(graph.schema)# 启用模式增强让框架从Neo4j中提取更详细的模式 enhanced_graph Neo4jGraph(urlURI, usernameUSER, passwordPASS, enhanced_schemaTrue) # 查看图的模式 print(enhanced_graph.schema)关于这个schemaGraphCypherQAChain内部会在查询时自动提取和传递无需手动提取和传递这是LangChain框架封装的便捷功能目的是确保大语言模型始终能获取到最新的schema生成更准确的Cypher查询。如果我们还想更进一步我们可以把正确示例包含在提示中也就是few-shot prompt这会让生成的Cypher更加准确。接下来我们就以这个为例看看具体的代码。2.1 引入包import os from dotenv import load_dotenv from langchain_neo4j import Neo4jGraph,GraphCypherQAChain from langchain_openai import ChatOpenAI from langchain.prompts import PromptTemplate2.2 获取Neo4j实例连接凭证load_dotenv() URI os.getenv(NEO4J_URI) USER os.getenv(NEO4J_USER) PASS os.getenv(NEO4J_PASS)2.3 创建数据库问答链llm ChatOpenAI(modelgpt-5-nano, temperature0) graph Neo4jGraph(urlURI, usernameUSER, passwordPASS, enhanced_schemaTrue) CYPHER_GENERATION_TEMPLATE You are an expert Neo4j Developer translating user questions into Cypher to answer questions about skiing. Convert the users question based on the schema. When you are presented with query properties such as ids like alpine touring, be sure to convert the first letter to capital case, such as Alpine Touring before you run the Cypher query. For example, if I were to ask Tell me about telemark skiing, you should create a Cypher query that finds all nodes with the id Telemark Skiing and then find all nodes connected to those nodes and use those to forumulate your answer, like this: MATCH (a {id: Telemark Skiing})-[r]-(b) RETURN a, r, b Schema:{schema} Question: {question} cypher_generation_prompt PromptTemplate( template CYPHER_GENERATION_TEMPLATE, input_variables [schema, question] ) cypher_chain GraphCypherQAChain.from_llm( llm llm, graph enhanced_graph, prompt cypher_generation_prompt, verbose True, allow_dangerous_requests True )2.4 查询图数据库cypher_chain.invoke({query: Tell me about freestyle?})2.5 完整代码import os from dotenv import load_dotenv from langchain_neo4j import Neo4jGraph,GraphCypherQAChain from langchain_openai import ChatOpenAI from langchain.prompts import PromptTemplate load_dotenv() URI os.getenv(NEO4J_URI) USER os.getenv(NEO4J_USER) PASS os.getenv(NEO4J_PASS) llm ChatOpenAI(modelgpt-5-nano, temperature0) graph Neo4jGraph(urlURI, usernameUSER, passwordPASS, enhanced_schemaTrue) CYPHER_GENERATION_TEMPLATE You are an expert Neo4j Developer translating user questions into Cypher to answer questions about skiing. Convert the users question based on the schema. When you are presented with query properties such as ids like alpine touring, be sure to convert the first letter to capital case, such as Alpine Touring before you run the Cypher query. For example, if I were to ask Tell me about telemark skiing, you should create a Cypher query that finds all nodes with the id Telemark Skiing and then find all nodes connected to those nodes and use those to forumulate your answer, like this: MATCH (a {id: Telemark Skiing})-[r]-(b) RETURN a, r, b Schema:{schema} Question: {question} cypher_generation_prompt PromptTemplate( template CYPHER_GENERATION_TEMPLATE, input_variables [schema, question] ) cypher_chain GraphCypherQAChain.from_llm( llm llm, graph enhanced_graph, prompt cypher_generation_prompt, verbose True, allow_dangerous_requests True ) cypher_chain.invoke({query: Tell me about freestyle?})3.评估图RAG管道对于采用大语言模型构建的任何应用都必须在构建完成后制定测试和评估计划评估其是否满足上生产环境的条件这一步至关重要。即使对其进行了细微的调整最好的做法也是对其再次进行评估否则如何确认修改的有效性。截止目前我们已经构建了知识图谱设置了检索功能接下来我们要做的就是判断这个系统是否真的有效。我们的目标很简单——确保答案既相关又准确。准确性指的是模型是否正确回答了用户问题准确性最简单的评估方式是通过给模型提供一系列已标注答案的问题让模型生成自己的答案然后将模型的输出与预期答案进行对比评分。理想情况下我们应当准备大量评估问题不过这样做既有挑战性也非常耗时所以我们就让模型来代劳。补充一下目前市面上有许多评估人工智能应用性能的工具包其中包含LangChain中的LangSmith但我们这里主要使用的是LangChain中一个简单的类QAEvalChain它可以用来评估模型生成的答案是否匹配参考答案我们具体来看看怎么做。3.1 引入包import os from dotenv import load_dotenv from langchain.evaluation.qa.eval_chain import QAEvalChain from langchain_neo4j import Neo4jGraph,GraphCypherQAChain from langchain_openai import ChatOpenAI3.2 获取Neo4j实例凭证load_dotenv() URI os.getenv(NEO4J_URI) USER os.getenv(NEO4J_USER) PASS os.getenv(NEO4J_PASS)3.3 构造测试集需要注意这里为了演示我只构造了少量测试集对于测试集来说最佳的做法是尽可能构造大规模、包含多样化查询问题的测试集。examples [ {query: What sports is the International Ski And Snowboard Federation responsible for?, answer: Alpine Skiing, Freestyle Skiing, Snowboarding, Nordic Combined, Ski Jumping, Cross-Country Skiing}, {query: What activity are ski poles not used in?, answer: Ski jumping}, {query: Who do athletes get help from?, answer: Coaches, Peer Mentors, and Sports Psychologists}, ]3.4 创建数据库问答链graph Neo4jGraph(urlURI, usernameUSER, passwordPASS, enhanced_schemaTrue) llm ChatOpenAI(modelgpt-5-nano, temperature0) chain GraphCypherQAChain.from_llm( graphgraph, llmllm, verboseTrue, allow_dangerous_requestsTrue, )3.5 执行并保存模型答案predictions [] for ex in examples: response chain.invoke({query: ex[query]}) predictions.append({result: response[result].strip()})3.6 使用模型进行评估eval_chain QAEvalChain.from_llm(llm) results eval_chain.evaluate(examples, predictions)3.7 构造打印评估结果correct 0 for i, res in enumerate(results): print(fQuery: {examples[i][query]}) print(fPrediction from graph: {predictions[i][result]}) print(fGold answer: {examples[i][answer]}) print(fGrade: {res[results]}) print(---) if res[results] CORRECT: correct 1 accuracy correct / len(examples) print(fGraph QA Accuracy: {accuracy:.2f})3.8 完整代码import os from dotenv import load_dotenv from langchain.evaluation.qa.eval_chain import QAEvalChain from langchain_neo4j import Neo4jGraph,GraphCypherQAChain from langchain_openai import ChatOpenAI load_dotenv() URI os.getenv(NEO4J_URI) USER os.getenv(NEO4J_USER) PASS os.getenv(NEO4J_PASS) examples [ {query: What sports is the International Ski And Snowboard Federation responsible for?, answer: Alpine Skiing, Freestyle Skiing, Snowboarding, Nordic Combined, Ski Jumping, Cross-Country Skiing}, {query: What activity are ski poles not used in?, answer: Ski jumping}, {query: Who do athletes get help from?, answer: Coaches, Peer Mentors, and Sports Psychologists}, ] graph Neo4jGraph(urlURI, usernameUSER, passwordPASS, enhanced_schemaTrue) llm ChatOpenAI(modelgpt-5-nano, temperature0) chain GraphCypherQAChain.from_llm( graphgraph, llmllm, verboseTrue, allow_dangerous_requestsTrue, ) predictions [] for ex in examples: response chain.invoke({query: ex[query]}) predictions.append({result: response[result].strip()}) eval_chain QAEvalChain.from_llm(llm) results eval_chain.evaluate(examples, predictions) correct 0 for i, res in enumerate(results): print(fQuery: {examples[i][query]}) print(fPrediction from graph: {predictions[i][result]}) print(fGold answer: {examples[i][answer]}) print(fGrade: {res[results]}) print(---) if res[results] CORRECT: correct 1 accuracy correct / len(examples) print(fGraph QA Accuracy: {accuracy:.2f})由于模型生成答案的随机性可能每次结果都不一样所以应当运行多次这其实也是需要大量测试问题的原因目的是为了更好的理解评分分布。我们采用的这种方法仅评估基础准确率是否符合预期要知道还有很多其它指标用来对图RAG进行评估比如实用性、相关性甚至图的可追溯性。4.总结这次分享我们完整走了一遍图RAG管道的构建流程从用PDF构建滑雪领域知识图谱到优化提示词提升检索准确性再到用QAEvalChain评估系统性能。希望通过这个案例能让大家对图RAG真实构建过程有一定的了解对大家有点帮助。普通人如何抓住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扫描下方二维码即可加上后会一个个给大家发