RAG - 检索增强生成过程
使用检索增强生成 (RAG) 技术进行查询
此过程 apoc.ml.rag
接受路径列表或向量索引名称、相关属性和一个自然语言问题,以创建实现检索增强生成 (RAG) 技术的提示。
有关 RAG 过程的更多信息,请参阅此处。
它使用 chat/completions
API,该 API 的文档请参阅此处。
名称 | 描述 | 必需 |
---|---|---|
paths |
用于检索和增强提示的路径列表,也可以是匹配查询或向量索引名称 |
是 |
attributes |
用于检索和增强提示的相关属性 |
是 |
question |
用户问题 |
是 |
conf |
一个可选的配置映射,请查看下一节 |
否 |
名称 | 描述 | 必需 |
---|---|---|
getLabelTypes |
将标签/关系类型名称添加到信息中以增强提示 |
否,默认 |
embeddings |
搜索存储在节点向量索引( |
否,默认 |
topK |
为每个节点( |
否,默认 |
apiKey |
OpenAI API 密钥 |
如果未定义 |
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)
值 |
---|
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
值 |
---|
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
值 |
---|
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
值 |
---|
在 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
值 |
---|
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