检索增强生成 (RAG) 管道
所有环境都需要额外的 Conda 软件包,这些软件包可以使用 conda/environments/all_cuda-125_arch-x86_64.yaml
或 conda/environments/examples_cuda-125_arch-x86_64.yaml
环境变量文件安装。此示例还需要先前运行 VDB 上传 管道。
环境 |
支持 |
注释 |
---|---|---|
Conda | ✔ | |
Morpheus Docker 容器 | ✔ | 需要在主机上启动 Milvus |
Morpheus 发布容器 | ✔ | 需要在主机上启动 Milvus |
开发容器 | ✘ |
目的
本示例的目的是说明用户如何构建检索增强生成管道,将信息源和 LLM 服务集成到 Morpheus 管道中。此示例基于之前的 Completion 管道 示例构建,增加了使用来自知识库的上下文信息增强 LLM 查询的能力。附加此上下文有助于通过提供额外的背景上下文和事实信息来改进 LLM 的响应,LLM 可以从中提取信息以进行响应。
源文档
为了使此管道正常运行,向量数据库必须已经填充了可以检索的信息。
填充数据库的示例在 VDB 上传 中进行了说明
本示例假设管道已经运行完成。
向量数据库服务
任何向量数据库都可用于存储生成的嵌入和相应的元数据。
如果需要,更新示例以使用 Chroma 或 FAISS 将非常简单。
对于本示例,我们将使用 Milvus,因为它是 VDB 上传 管道中使用的默认 VDB。
实现和设计决策
实现细节
为了满足检索增强生成 (RAG) 机制的独特需求,采用了以下步骤
嵌入检索: 在 LLM 可以完成之前,从向量数据库中检索相关上下文。此上下文以嵌入的形式存在,这些嵌入表示与查询密切相关的信息片段。
上下文增强: 然后将检索到的上下文附加到用户的查询中,用必要的背景丰富它,以帮助 LLM 生成更明智的完成。
LLM 查询执行: 然后将增强的查询发送到 LLM,LLM 根据原始查询和附加上下文的组合生成响应。
设计决策背后的原理
使用 Milvus 作为 VDB: Milvus 提供可扩展且高效的向量搜索功能,使其成为实时嵌入检索的自然选择。
灵活的 LLM 集成: LLM 作为独立组件集成到管道中,这允许轻松更换模型,并确保管道可以轻松扩展以支持多个 LLM。
独立的 Morpheus 管道
独立的 Morpheus 管道使用以下组件构建
一个
InMemorySourceStage
来保存 DataFrame 中的 LLM 查询。我们在
source_df
中提供一组固定的问题,然后由LLMEngineStage
处理
一个
DeserializationStage
,用于根据LLMEngine
的需要将MessageMeta
对象转换为ControlMessage
对象。新功能已添加到
DeserializeStage
以支持ControlMessage
,并为每条消息添加默认任务。
然后,
LLMEngineStage
包装核心LLMEngine
功能。一个
ExtracterNode
从 DataFrame 中提取问题。一个
RAGNode
执行检索,并使用提供的模板将上下文添加到查询中,并执行 LLM。最后,使用
SimpleTaskHandler
将响应放回ControlMessage
中。
管道以
InMemorySink
阶段结束,以存储结果。
注意: 为了使其正常运行,VDB 上传管道必须已事先运行。
在运行管道之前,我们需要获取以下服务的服务 API 密钥
获取 OpenAI API 或 NGC API 密钥
NGC
按照此处的说明进行操作
在本文档的其余部分,我们将您的 NGC API 密钥称为
${NGC_API_KEY}
。
OpenAI
按照此处的说明获取 OpenAI API 密钥。
在本文档的其余部分,我们将您的 OpenAI API 密钥称为
${OPENAI_API_KEY}
。
在运行管道之前,我们需要确保以下服务正在运行
Milvus 服务
按照此处的说明安装并运行 Milvus 服务。
运行 Morpheus 管道
每个 LLM 示例管道的顶级入口点是 examples/llm/main.py
。此脚本接受一组选项和一个要运行的管道。基线选项如下,并且为了本文档的目的,我们将假设管道选项为 rag
运行示例(独立管道)
使用 NGC NeMo LLM
export NGC_API_KEY=[YOUR_KEY_HERE]
python examples/llm/main.py rag pipeline
使用 OpenAI LLM 模型
export OPENAI_API_KEY=[YOUR_KEY_HERE]
python examples/llm/main.py rag pipeline --llm_service=OpenAI --model_name=gpt-3.5-turbo