Morpheus LLM 代理管道
所有环境都需要额外的 Conda 包,可以使用 conda/environments/all_cuda-125_arch-x86_64.yaml
或 conda/environments/examples_cuda-125_arch-x86_64.yaml
环境变量文件安装。有关更多信息,请参阅安装依赖项部分。
环境 |
支持 |
注释 |
---|---|---|
Conda | ✔ | |
Morpheus Docker 容器 | ✔ | |
Morpheus 发布容器 | ✔ | |
Dev 容器 | ✔ |
目的
Morpheus LLM 代理管道旨在将大型语言模型 (LLM) 代理无缝集成到 Morpheus 框架中。此实施侧重于使用 ReAct 代理类型高效执行多个 LLM 查询,该代理类型专为多功能任务处理而定制。LangChain 库的使用简化了流程,最大限度地减少了对额外系统迁移的需求。
在 Morpheus LLM 代理环境中,这些代理充当用户和 LLM 服务之间的中介。它们的主要作用是执行工具和管理多个 LLM 查询,从而增强 LLM 在解决复杂任务方面的能力。代理利用各种工具,例如互联网搜索、VDB 检索器、计算器等,来协助解决查询,从而实现任务的无缝执行和各种查询的高效处理。
LLM 服务
此管道支持与我们的 LLMService 接口兼容的各种 LLM 服务,包括 OpenAI、NeMo 或使用 llama-cpp-python 的本地执行。在本示例中,我们将重点介绍使用 OpenAI,选择 OpenAI 是因为它与 ReAct 代理架构兼容。
代理类型
该管道支持不同的代理类型,每种代理类型都会影响与 LLM 交互的模式。对于本示例,我们将使用 ReAct 代理类型,这是一种流行且可靠的选择。
代理工具
根据手头的问题,可以为 LLM 代理提供各种工具,例如互联网搜索、VDB 检索器、计算器、维基百科等。在本示例中,我们将使用互联网搜索工具和 llm-math 工具,允许 LLM 代理执行 Google 搜索并解决数学方程式。
LLM 库
该管道利用 LangChain 库运行 LLM 代理,使其可以直接在 Morpheus 管道中执行。这种方法减少了将现有系统迁移到 Morpheus 的开销,并消除了复制 llama-index 和 Haystack 等流行的 LLM 库所完成的工作的需求。
InMemorySourceStage:管理 DataFrame 中的 LLM 查询。
KafkaSourceStage:从 Kafka 主题中消费 LLM 查询。
DeserializationStage:将 MessageMeta 对象转换为 LLMEngine 所需的 ControlMessages。
LLMEngineStage:包含核心 LLMEngine 功能。
ExtracterNode
从 DataFrame 中提取问题。LangChainAgentNode
为所有提供的输入运行 LangChain 代理执行器。此节点将利用代理运行接口异步运行代理。最后,使用
SimpleTaskHandler
将响应合并回 ControlMessage。
InMemorySinkStage:存储结果。
先决条件
设置环境变量
在运行项目之前,请确保设置了所需的环境变量。按照以下步骤获取并设置 OpenAI 和 SerpApi 的 API 密钥。
OpenAI API 密钥
访问 OpenAI 并创建一个帐户。导航到您的帐户设置以获取您的 OpenAI API 密钥。复制密钥并使用以下命令将其设置为环境变量
export OPENAI_API_KEY="<YOUR_OPENAI_API_KEY>"
SerpApi API 密钥
转到 SerpApi 注册并创建一个帐户。注册后,获取您的 SerpApi API 密钥。使用以下命令将 API 密钥设置为环境变量
export SERPAPI_API_KEY="<YOUR_SERPAPI_API_KEY>"
安装依赖项
安装所需的依赖项。
conda env update --solver=libmamba \
-n ${CONDA_DEFAULT_ENV} \
--file ./conda/environments/examples_cuda-125_arch-x86_64.yaml
运行 Morpheus 管道
每个 LLM 示例管道的顶级入口点是 examples/llm/main.py
。此脚本接受一组选项和一个要运行的管道。基线选项如下,并且为了本文档的目的,我们假设管道选项为 agents
运行示例(简单管道)
此示例演示了 Morpheus 管道的基本实施,展示了执行 LLM 查询和管理生成的响应的过程。它在管道中使用 InMemorySourceStage、DeserializationStage、ExtracterNode、LangChainAgentNode、SimpleTaskHandler 和 InMemorySinkStage 等不同阶段来处理查询处理和响应管理的各个方面。
利用 InMemorySourceStage 和 DeserializationStage 等阶段来消费和批处理 LLM 查询。
包含一个 ExtracterNode 用于提取问题,以及一个 LangChainAgentNode 用于执行 LangChain 代理执行器。
SimpleTaskHandler 用于管理 LLM 生成的响应。
使用 InMemorySinkStage 在管道中存储和管理结果。
要使用默认选项运行示例,请使用以下命令
python examples/llm/main.py --log_level=info agents simple
简单管道的可用选项如下
选项
--use_cpu_only
描述:仅在 CPU 模式下运行
默认:
False
--num_threads INTEGER RANGE
描述:要使用的内部管道线程数。
默认:
12
--pipeline_batch_size INTEGER RANGE
描述:管道的内部批处理大小。可以远大于模型批处理大小。也用于 Kafka 消费者。
默认:
1024
--model_max_batch_size INTEGER RANGE
描述:模型要使用的最大批处理大小。
默认:
64
--model_name TEXT
描述:要在 OpenAI 中使用的模型名称。
默认:
gpt-3.5-turbo-instruct
--repeat_count INTEGER RANGE
描述:重复输入查询的次数。用于测试性能非常有用。
默认:
1
--help
描述:显示带有选项和命令详细信息的帮助消息。
运行示例(Kafka 管道)
Morpheus LLM 代理中的 Kafka 示例演示了流式实施,利用 Kafka 消息来促进 LLM 查询的近实时处理。此示例与简单示例类似,但使用 KafkaSourceStage 从 Kafka 主题流式传输和检索消息
首先,要运行 Kafka 示例,您需要创建一个 Kafka 集群,使持久性管道能够接受 LLM 代理的查询。您可以使用以下指南创建 Kafka 集群:快速启动 Kafka 集群指南
Kafka 集群运行后,创建 Kafka 主题以生成管道的输入。
# Set the bootstrap server variable
export BOOTSTRAP_SERVER=$(broker-list.sh)
# Create the input and output topics
kafka-topics.sh --bootstrap-server ${BOOTSTRAP_SERVER} --create --topic input
# Update the partitions
kafka-topics.sh --bootstrap-server ${BOOTSTRAP_SERVER} --alter --topic input --partitions 3
现在可以使用以下命令和下面列出的选项运行 Kafka 示例
python examples/llm/main.py agents kafka [OPTIONS]
选项
--num_threads INTEGER RANGE
描述:要使用的内部管道线程数。
默认:
12
--pipeline_batch_size INTEGER RANGE
描述:管道的内部批处理大小。可以远大于模型批处理大小。也用于 Kafka 消费者。
默认:
1024
--model_max_batch_size INTEGER RANGE
描述:模型要使用的最大批处理大小。
默认:
64
--model_name TEXT
描述:要在 OpenAI 中使用的模型名称。
默认:
gpt-3.5-turbo-instruct
--bootstrap_servers TEXT
描述:要连接的 Kafka 引导服务器,如果未定义,客户端将尝试从环境中推断引导服务器。
默认:
auto
--topic TEXT
描述:要侦听输入消息的 Kafka 主题。
默认:
input
--help
描述:显示带有选项和命令详细信息的帮助消息。
管道运行后,我们需要使用 Kafka 主题将消息发送到管道。在单独的终端中,运行以下命令
kafka-console-producer.sh --bootstrap-server ${BOOTSTRAP_SERVER} --topic input
这将打开一个提示,允许将任何 JSON 粘贴到终端中。JSON 应格式化如下
{"question": "<Your question here>"}
例如
{"question": "Who is Leo DiCaprio's girlfriend? What is her current age raised to the 0.43 power?"}
{"question": "What is the height of the tallest mountain in feet divided by 2.23? Do not round your answer"}
{"question": "Who is the current leader of Japan? What is the largest prime number that is smaller that their age? Just say the number."}