RAG - 检索增强生成过程

使用检索增强生成 (RAG) 技术进行查询

此过程 apoc.ml.rag 接收路径列表或向量索引名称、相关属性以及自然语言问题,以创建一个实现检索增强生成 (RAG) 技术的提示词。

有关 RAG 流程的更多信息,请参阅此处

它使用 chat/completions API,该 API 的文档见此处

表 1. 输入参数
名称 (name) description(描述) 强制性 (mandatory)

paths

用于检索和增强提示词的路径列表,也可以是匹配查询或向量索引名称

属性 (attributes)

用于检索和增强提示词的相关属性

question

用户的问题

conf

可选的配置映射,请查看下一节

表 2. 配置映射
名称 (name) description(描述) 强制性 (mandatory)

getLabelTypes

将标签/关系类型名称添加到信息中以增强提示词

否,默认为 true

embeddings

用于搜索存储在节点向量索引(如果为 embeddings: "NODE")或关系向量索引(如果为 embeddings: "REL")中的相似嵌入

否,默认为 "FALSE"

topK

为每个节点(如果为 embeddings: "NODE")或关系(如果为 embeddings: "REL")查找的邻居数量

否,默认为 40

apiKey

OpenAI API 密钥

如果未定义 apoc.openai.key

prompt

用于结合上下文进行增强的基础提示词

否,默认值为

"你是一位客服代理,负责帮助客户回答有关服务的问题。请使用以下上下文来回答末尾的用户问题。在准备答案时,请尽量不要对上下文做任何更改,以提供准确的回复。如果你不知道答案,只需说“抱歉,我不知道”,不要试图编造答案。"

使用 apoc.ml.rag 过程,我们可以减少 AI 幻觉(即虚假或误导性的回答),通过第一个参数为我们的过程提供相关且最新的信息。

例如,通过执行以下过程(使用 gpt-3.5-turbo 模型,最后更新于 2022 年 1 月),会出现幻觉

查询调用
CALL apoc.ml.openai.chat([
    {role:"user", content: "Which athletes won the gold medal in mixed doubles's curling  at the 2022 Winter Olympics?"}
], $apiKey)
表 3. 示例响应

2022 年冬奥会冰壶金牌由瑞典男子队和俄罗斯女子队获得。

因此,我们可以使用 RAG 技术来提供真实的结果。例如,使用给定的数据集(数据摘自此维基百科页面

维基百科数据集
CREATE (mixed2022:Discipline {title:"Mixed doubles's curling", year: 2022})
WITH mixed2022
CREATE (:Athlete {name: 'Stefania Constantini', country: 'Italy', irrelevant: 'asdasd'})-[:HAS_MEDAL {medal: 'Gold', irrelevant2: 'asdasd'}]->(mixed2022)
CREATE (:Athlete {name: 'Amos Mosaner', country: 'Italy', irrelevant: 'qweqwe'})-[:HAS_MEDAL {medal: 'Gold', irrelevant2: 'rwerew'}]->(mixed2022)
CREATE (:Athlete {name: 'Kristin Skaslien', country: 'Norway', irrelevant: 'dfgdfg'})-[:HAS_MEDAL {medal: 'Silver', irrelevant2: 'gdfg'}]->(mixed2022)
CREATE (:Athlete {name: 'Magnus Nedregotten', country: 'Norway', irrelevant: 'xcvxcv'})-[:HAS_MEDAL {medal: 'Silver', irrelevant2: 'asdasd'}]->(mixed2022)
CREATE (:Athlete {name: 'Almida de Val', country: 'Sweden', irrelevant: 'rtyrty'})-[:HAS_MEDAL {medal: 'Bronze', irrelevant2: 'bfbfb'}]->(mixed2022)
CREATE (:Athlete {name: 'Oskar Eriksson', country: 'Sweden', irrelevant: 'qwresdc'})-[:HAS_MEDAL {medal: 'Bronze', irrelevant2: 'juju'}]->(mixed2022)

我们可以执行

查询调用
MATCH path=(:Athlete)-[:HAS_MEDAL]->(Discipline)
WITH collect(path) AS paths
CALL apoc.ml.rag(paths,
  ["name", "country", "medal", "title", "year"],
  "Which athletes won the gold medal in mixed doubles's curling  at the 2022 Winter Olympics?",
  {apiKey: $apiKey}
) YIELD value
RETURN value
表 4. 示例响应

2022 年冬奥会冰壶金牌由意大利的 Stefania Constantini 和 Amos Mosaner 获得。

查询调用
MATCH path=(:Athlete)-[:HAS_MEDAL]->(Discipline)
WITH collect(path) AS paths
CALL apoc.ml.rag(paths,
  ["name", "country", "medal", "title", "year"],
  "Which athletes won the silver medal in mixed doubles's curling  at the 2022 Winter Olympics?",
  {apiKey: $apiKey}
) YIELD value
RETURN value
表 5. 示例响应

2022 年冬奥会冰壶金牌由挪威的 Kristin Skaslien 和 Magnus Nedregotten 获得。

使用自定义模型的查询调用
MATCH path=(:Athlete)-[:HAS_MEDAL]->(Discipline)
WITH collect(path) AS paths
CALL apoc.ml.rag(paths,
  ["name", "country", "medal", "title", "year"],
  "Which athletes won the gold medal in mixed doubles's curling at the 2022 Winter Olympics?",
  {apiKey: $apiKey, model: "gpt-3.5-turbo"}
) YIELD value
RETURN value
表 6. 示例响应

在 2022 年冬奥会上获得混合双人冰壶金牌的运动员是意大利的 Stefania Constantini 和 Amos Mosaner。

我们还可以传递一个返回路径/关系/节点的字符串查询,例如

CALL apoc.ml.rag("MATCH path=(:Athlete)-[:HAS_MEDAL]->(Discipline) WITH collect(path) AS paths",
  ["name", "country", "medal", "title", "year"],
  "Which athletes won the gold medal in mixed doubles's curling  at the 2022 Winter Olympics?",
  {apiKey: $apiKey}
) YIELD value
RETURN value
表 7. 示例响应

2022 年冬奥会冰壶金牌由意大利的 Stefania Constantini 和 Amos Mosaner 获得。

或者,如果我们将有用的信息存储在嵌入节点中,我们可以将向量索引名称作为第一个参数传递。例如,给定此节点向量索引

CREATE VECTOR INDEX `rag-embeddings`
FOR (n:RagEmbedding) ON (n.embedding)
OPTIONS {indexConfig: {
 `vector.dimensions`: 1536,
 `vector.similarity_function`: 'cosine'
}}

以及一些带有 text 属性的 (:RagEmbedding) 节点,我们可以执行

CALL apoc.ml.rag("rag-embeddings",
  ["text"],
  "Which athletes won the gold medal in mixed doubles's curling  at the 2022 Winter Olympics?",
  {apiKey: $apiKey, embeddings: "NODE", topK: 20}
) YIELD value
RETURN value

或者,使用关系向量索引

CREATE VECTOR INDEX `rag-rel-embeddings`
FOR ()-[r:RAG_EMBEDDING]-() ON (r.embedding)
OPTIONS {indexConfig: {
 `vector.dimensions`: 1536,
 `vector.similarity_function`: 'cosine'
}}

以及一些带有 text 属性的 [:RagEmbedding] 关系,我们可以执行

CALL apoc.ml.rag("rag-rel-embeddings",
  ["text"],
  "Which athletes won the gold medal in mixed doubles's curling  at the 2022 Winter Olympics?",
  {apiKey: $apiKey, embeddings: "REL", topK: 20}
) YIELD value
RETURN value
© . This site is unofficial and not affiliated with Neo4j, Inc.