|
想做高分RAG!我们之前已经拆开过,深入去讲过用知识图谱增强RAG如何制备大尺寸的WSe2,在实验室制备中应该注意哪些方面的调整?'从笔记本中的信息可以看出,制备大尺寸WSe2的方法有多种,包括冷壁CVD、卤化物辅助的大气压生长法、金属有机化学气相沉积(MOCVD)以及扩散控制的外延生长等。这些方法各有优缺点,且在实验室制备中需要注意不同的调整。\n\n1. 冷壁CVD显示出成功,说明在温度控制和反应气体流量方面可能需要精确调节。\n2. 卤化物辅助的大气压生长法成功生产了大尺寸的WSe2,可能需要注意卤化物的选择和浓度。\n3. MOCVD展示了高度可扩展性,可能需要在金属有机物的选择和反应条件上进行优化。\n4. 扩散控制的外延生长在蓝宝石上实现了大面积WSe2单层的合并,说明基底材料的选择和表面处理可能是关键因素。\n\n此外,笔记中提到对WSe2合成的生长机制的全面理解仍然缺失,表明在实验室制备中需要对生长过程进行深入研究和优化' Agent能根据任务,自主去探索知识图谱,或任何数据库! 然后找到能支撑解决问题的,直接数据! 不存在模糊相似!更不存在胡编乱造!  由于上下文长度+幻觉的限制,我们不能一次给LLM做太多任务一个个的清晰明确,小任务!以工作流的方式,让Agent完成!a.长文本的标书撰写,每个智能体负责一部分,最后合成高质量标书b.做医疗领域MAS,每一个节点是一个tool,合成上游Agent做健康管理c.让他做电脑配置清单的推荐,智能体共享记忆解决兼容性问题本身这个系列,是langgraph动手做时实践的材料雄哥把他放到前面来,大家知道他价值,学基础时,更有目标感!① Agent+graphRAG的100%准确率如何来的?有什么价值?③把PDF做成Agent探索的知识图谱范式!元素+连接文本块④接入KG做Agent的工作流,让智能体畅顺地探索数据!整个内容,以实操为主,每个人都能收到结果,然后再返到前面学基础!RAG及Agent框架:langchain+langgraph大模型:OpenAI API(本地模型也可,之前做过本地方案)本系列所有实践数据+代码,均以上传至会员盘,通过知识星球即可获取现在,我们正在为会员交付【五大项目】,你一定要识别下方二维码,加入学习,或联系一意,为你赋能 我们除了把节点提取出来,还会把数据源中的节点相关的信息抽取出来传统文本分块中,有大量无关或不相干的数据,给大模型总结时,会成为干扰智能体会找到根数据,找到的就是相关的,除非你的top_k=1,否则你的文本块大概率会超出长度,截断了,大模型处理自然会差手把手做高阶RAG!最牛五大知识检索!RAG性能直线提升!44/45现在,我们可以根据任务,给智能体安排一种或多种查询策略 在开始前,需要你本地有AI环境,如果你未有AI基础环境,在这里第四天!0基础微调大模型+知识库,部署在微信!手把手安装AI必备环境!4/45不同的系统,安装的方法不同的,你可以在neo4j官网启动后,你需要打开7474端口,就可以进入管理界面!一定要记住这个账密,后面我们需要连接他,构建知识图谱!condacreate-nagentpython=3.10 pipinstall-rrequirements.txt 我们用到的是会员提供的数据(这份数就有8000多个节点)你也可以换成任何自己的pdf数据,放到文件夹下就行jupyter使用,是一行行的执行代码,交互式的!这里,默认开放的端口是7687,账密就是刚刚设置这个# 连接你本地的neo4jos.environ["NEO4J_URI"] ="bolt://localhost:7687"os.environ["NEO4J_USERNAME"] ="neo4j"os.environ["NEO4J_PASSWORD"] ="password"
graph = Neo4jGraph(refresh_schema=False)
graph.query("CREATE CONSTRAINT IF NOT EXISTS FOR (c:Chunk) REQUIRE c.id IS UNIQUE")graph.query("CREATE CONSTRAINT IF NOT EXISTS FOR (c:AtomicFact) REQUIRE c.id IS UNIQUE")graph.query("CREATE CONSTRAINT IF NOT EXISTS FOR (c:KeyElement) REQUIRE c.id IS UNIQUE")graph.query("CREATE CONSTRAINT IF NOT EXISTS FOR (d ocument) REQUIRE d.id IS UNIQUE") 这里,我们使用pdf文件,放在E盘中,不管你放在哪里,直接把下方的文件路径,改为你自己的文件路径!# 定义 PyPDFDirectoryLoader 实例loader = PyPDFDirectoryLoader( path="E:\\neo4j000\\data", glob="**/[!.]*.pdf", silent_errors=False, load_hidden=False, recursive=False, extract_images=False, password=None, mode="page", headers=None, extraction_mode="plain", # extraction_kwargs=None,)
# 加载 PDF 文件documents = loader.load()
# 打印加载的文档fordocindocuments: print(doc) 这个提示词,你可以根据自己的数据来写,但是你要明白,他背后的原理是什么,才能写出来,如果你不太懂,跟着雄哥的模板来写就行因为会员提供的源数据是英文,所以我们写一个英文提示词# 定义提取知识图谱的关键元素和原子事实construction_system ="""You are now an intelligent assistant tasked with meticulously extracting both key elements andatomic facts from a long text.1. Key Elements: The essential nouns (e.g., characters, times, events, places, numbers), verbs (e.g.,actions), and adjectives (e.g., states, feelings) that are pivotal to the text’s narrative.2. Atomic Facts: The smallest, indivisible facts, presented as concise sentences. These includepropositions, theories, existences, concepts, and implicit elements like logic, causality, eventsequences, interpersonal relationships, timelines, etc.Requirements:#####1. Ensure that all identified key elements are reflected within the corresponding atomic facts.2. You should extract key elements and atomic facts comprehensively, especially those that areimportant and potentially query-worthy and do not leave out details.3. Whenever applicable, replace pronouns with their specific noun counterparts (e.g., change I, He,She to actual names).4. Ensure that the key elements and atomic facts you extract are presented in the same language asthe original text (e.g., English or Chinese)."""
construction_human ="""Use the given format to extract information from thefollowing input: {input}"""
construction_prompt = ChatPromptTemplate.from_messages( [ ( "system", construction_system, ), ( "human", ( "Use the given format to extract information from the " "following input: {input}" ), ), ])
你现在是一个智能助手,负责从长文本中细致地提取关键元素和原子事实关键元素:对文本叙述至关重要的核心名词(例如人物、时间、事件、地点、数字)、动词(例如动作)和形容词(例如状态、情感)原子事实:最小的、不可分割的事实,以简洁的句子形式呈现。这些包括命题、理论、存在、概念以及隐含的逻辑、因果关系、事件顺序、人际关系、时间线等元素要求:确保所有识别出的关键元素都反映在相应的原子事实中你应该全面提取关键元素和原子事实,特别是那些重要且可能被查询的内容,不要遗漏细节只要适用,用具体的名词替换代词(例如将“我”、“他”、“她”替换为实际名字)确保你提取的关键元素和原子事实与原文使用相同语言(例如英语或中文) #2k的chunk_sizeasyncdefprocess_document(text,document_name,chunk_size=2000,chunk_overlap=200):start=datetime.now()print(f"Startedextractionat:{start}")text_splitter=TokenTextSplitter(chunk_size=chunk_size,chunk_overlap=chunk_overlap)texts=text_splitter.split_text(text)print(f"Totaltextchunks:{len(texts)}")tasks=[asyncio.create_task(construction_chain.ainvoke({"input":chunk_text}))forindex,chunk_textinenumerate(texts)]results=awaitasyncio.gather(*tasks)print(f"FinishedLLMextractionafter:{datetime.now()-start}")docs=[el.dict()forelinresults]forindex,docinenumerate(docs):doc['chunk_id']=encode_md5(texts[index])doc['chunk_text']=texts[index]doc['index']=indexforafindoc["atomic_facts"]:af["id"]=encode_md5(af["atomic_fact"])#导入块/原子事实/关键元素graph.query(import_query,params={"data":docs,"document_name":document_name})#在块之间创建下一个关系graph.query("""MATCH(c:Chunk)<-[:HAS_CHUNK]-(d ocument)WHEREd.id=$document_nameWITHcORDERBYc.indexWITHcollect(c)ASnodesUNWINDrange(0,size(nodes)-2)ASindexWITHnodes[index]ASstart,nodes[index+1]ASendMERGE(start)-[:NEXT]->(end)""",params={"document_name":document_name})print(f"Finishedimportat:{datetime.now()-start}")awaitprocess_document(text,"wse2",chunk_size=2000,chunk_overlap=100) 可以看到,围绕一个节点,提取了很多围绕他的节点和事实文本 |