prompt engineering(提示工程): 从上文提到的LLM的本质来说, 只要提供充足明确的上下文和精心设计的指令(Prompt),就可以让模子规避掉环境问题,并且这是few-shot以致是zero-shot的(只需要很少的数据,以致是不需要数据)。一般提示工程不是一次性让模子输出全部结果,而是通过 chain of thought 的方法,一步一步引导模子进行推理,终极输出正确答案
Learn to extract entities from the following medical answers: <一个构建的示例>
Learn to extract entities from the following medical questions: <一个构建的示例>
复制代码
完整Prompt Engineering在附录中
这一步可以根据自己的任务替换Prompt,因为作者重要是在医学问答数据集上进行测试,因此提供的Prompt都是与医学相关的 证据子图探索: 根据实体辨认提取的关键实体 V q V_{q} Vq,通过两种方式天生 连接关键实体的子图:
基于路径的探索: 选择 N q 0 N_{q}^0 Nq0中的一个节点作为起始节点 n 1 n_1 n1。将别的节点放置在候选节点集中 N c a n d N_{cand} Ncand。从 n 1 n_{}1 n1最多探索 k k k个跃点以找到下一个节点 n 2 n_2 n2,其中 n 2 ∈ N c a n d n_2\in N_{cand} n2∈Ncand。如果在 k k k个跃点内乐成到达 n 2 n_2 n2,则将开始节点更新为 n 2 n_2 n2并从 N c a n d N_{cand} Ncand中删除 n 2 n_2 n2。如果在 k k k 个跃点中找不到 n 2 n_{}2 n2,则将迄今为止获得的路径段连接起来并存储在 G q p a t G_{q}^{pat} Gqpat中。然后从 N c a n d N_cand Ncand中选择另一个节点 n 1 ′ n_1′ n1′作为新的开始节点,并从 N c a n d N_{cand} Ncand中删除 n 1 n_1 n1和 n 2 n_2 n2。(b) 检查 N c a n d N_{cand} Ncand是否为空。如果不为空,则迭代步骤1以查找路径的下一段。如果为空,则连接所有段以构建一组子图,并将它们放入 G q p a t G^{pat}_{q} Gqpat中。
基于一阶邻居的探索: 基于邻居的探索通过将Nq中的每个节点 n n n扩展到其邻居1-hop,将三元组 ( n , e , n ′ ) (n,e,n′) (n,e,n′)添加到 G q n e i G_{q}^{nei} Gqnei,从而增加相关知识
有大概会出现的环境是,证据子图探索提取了太多的子图,会导致LLM无法精确辨认一些关键的子图,从而导致模子答复牛头不搭马嘴。因此需要对子图进行裁剪,详细方式为聚类: 对所有提取到的子图进行聚类,然后把取一部分作为终极天生的结果。
证据图聚合
要天生终极的附加知识子图输入,从 最少 k k k 个 基于路径的子图和基于一阶邻居的子图 中提取三元组, 比方 ( F a t i g u e , N a u s e a ) − i s S y m p o t o m O f − L i v e r P r o b l e m (Fatigue,Nausea)-isSympotomOf-LiverProblem (Fatigue,Nausea)−isSympotomOf−LiverProblem ,然后将他们构成一个序列 P 1 , P 2 , ⋯ P n , N 1 , N 2 , ⋯ N n P_{1},P_{2},\cdots P_{n},N_{1},N_{2},\cdots N_{n} P1,P2,⋯Pn,N1,N2,⋯Nn ,然后使用 提示词工程 让LLM把这些序列转换成 自然语言。
There are some knowledge graph path. They follow entity-> relationship->entity format. \n\n {Path} \n\n Use the knowledge graph information. Try to convert them to natural language, respectively. Use single quotation marks for entity name and relation name. And name them as Path-based Evidence 1, Path-based Evidence 2,...\n\n
复制代码
这里有两个地方需要注意:
为什么要转换成自然语言: 个人理解: 因为LLM实际上训练的数据是自然语言,RAG,Prompt Engineering和chain of thought都是希望更好的提取LLM中已经存储的知识,因此自然语言更加符合LLM的训练数据的结构。 作者给出的表明: 它将子图简化为一种简便同等的格式,以捕捉基本信息。(b) 它利用LLM的自然语言理解和天生能力来同一语义相似的实体并解决潜伏的歧义。
会不会面临和Graph RAG一样的窘境: 实际上序列 P , N P,N P,N里面已经包含了图的结构信息,基于游走的 P P P 序列包含了路径的远距离图结构,而基于邻居 N N N则是直接表现包含了一阶子图的局部图结构信息。二者相互结合,可以综合增强LLM对于图结构的理解
LLM头脑导图推理
为了天生头脑导图,作者采用几个Prompt 来 引导模子天生:
系统指令,通用的AI Prompt,一般是指定AI扮演的角色,比方: You are an excellent AI doctor, and you can diagnose diseases and recommend medications based on the symptoms in the conversation