Python API#

在项目中主要使用 guardrails 的方法是

  1. 创建一个 RailsConfig 对象。

  2. 创建一个 LLMRails 实例,它提供了一个与 LLM 交互的接口,并自动应用配置的 guardrails。

  3. 使用 LLMRails.generate(...)LLMRails.generate_async(...) 方法生成 LLM 响应。

基本用法#

from nemoguardrails import LLMRails, RailsConfig

config = RailsConfig.from_path("path/to/config")

app = LLMRails(config)
new_message = app.generate(messages=[{
    "role": "user",
    "content": "Hello! What can you do for me?"
}])

RailsConfig#

RailsConfig 类包含了配置 guardrails 的关键信息:

  • models: rails 配置使用的模型列表。

  • user_messages: 应用于 rails 的用户消息列表。

  • bot_messages: 应用于 rails 的 bot 消息列表。

  • flows: 应用于 rails 的流程列表。

  • instructions: 自然语言指令列表(目前仅支持通用指令)。

  • docs: 包含在知识库中的文档列表。

  • sample_conversation: 在提示词中使用的示例对话。

  • actions_server_url: 要使用的动作服务器。如果指定,动作将通过该动作服务器执行。

消息生成#

要使用 guardrails 配置,可以调用 LLMRails.generateLLMRails.generate_async 方法。

LLMRails.generate 方法接收 promptmessages 数组作为输入。如果提供了 prompt,则 guardrails 在单轮对话中应用。消息的结构如下:

properties:
  role:
    type: "string"
    enum: ["user", "assistant", "context"]
  content:
    oneOf:
      - type: "string"
      - type: "object"

对话历史记录示例如下:

[
  {
    "role": "user",
    "content": "Hello!"
  },
  {
    "role": "assistant",
    "content": "Hello! How can I help you?"
  },
  {
    "role": "user",
    "content": "I want to know if my insurance covers certain expenses."
  }
]

同时设置初始上下文的示例如下:

[
  {
    "role": "context",
    "content": {
      "user_name": "John",
      "access_level": "admin"
    }
  },
  {
    "role": "user",
    "content": "Hello!"
  },
  {
    "role": "assistant",
    "content": "Hello! How can I help you?"
  },
  {
    "role": "user",
    "content": "I want to know if my insurance covers certain expenses."
  }
]

动作#

动作是 Guardrails 工具包的关键组成部分。动作使得在 guardrails 中执行 Python 代码成为可能。

默认动作#

工具包中包含的默认动作如下:

核心动作

  • generate_user_intent: 生成用户所说内容的规范形式。

  • generate_next_step: 生成当前对话流程中的下一步。

  • generate_bot_message: 基于预期的 bot 意图生成 bot 消息。

  • retrieve_relevant_chunks: 从知识库中检索相关的文本块并添加到上下文中。

Guardrail 特定动作

  • self_check_facts: 根据从知识库中提取的相关文本块,检查最后一条 bot 响应的事实性。

  • self_check_input: 检查是否应允许用户输入。

  • self_check_output: 检查是否应允许 bot 响应。

  • self_check_hallucination: 检查最后一条 bot 响应是否是幻觉。

为了方便起见,此工具包还包含了一些 LangChain 工具,它们被封装为动作:

  • apify: Apify 是一个网络爬取和自动化平台,使您能够构建自己的网络爬虫和抓取器。

  • bing_search: Bing Web Search API 的封装。

  • google_search: Langchain 提供的 Google Search API 的封装。

  • searx_search: Searx API 的封装。Google/Bing Search 的替代方案。

  • google_serper: SerpApi Google Search API 的封装。可用于添加来自 Google Search 的回答框和知识图。

  • openweather_query: OpenWeatherMap API 的封装,用于检索天气信息。

  • serp_api_query: SerpAPI API 的封装。它提供对搜索引擎的访问,并帮助回答有关当前事件的问题。

  • wikipedia_query: Wikipedia API 的封装。它使用 MediaWiki API 从 Wikipedia 检索信息。

  • wolfram_alpha_query: Wolfram Alpha API 的封装。可用于回答数学和科学问题。

  • zapier_nla_query: Zapier NLA API 的封装。它提供了对超过 5k 个应用程序和 20k 个动作的访问,以自动化您的工作流程。

将 Chain 作为动作#

您可以使用 LLMRails.register_action 方法将 LangChain chain 注册为动作:

app.register_action(some_chain, name="some_chain")

当一个 chain 作为动作被调用时,动作的参数对应于 chain 的输入键。对于返回值,如果 chain 的输出只有一个键,则返回该值。如果 chain 有多个输出键,则返回包含输出键及其值的字典。更多详细信息请参阅LangChain 集成指南

自定义动作#

您可以使用 action 装饰器或 LLMRails(RailsConfig).register_action(action: callable, name: Optional[str]) 方法将任何 Python 函数注册为自定义动作。

from nemoguardrails.actions import action

@action()
async def some_action():
    # Do some work

    return "some_result"

默认情况下,动作的名称被设置为函数的名称。但是,您可以通过指定不同的名称来更改它。

from nemoguardrails.actions import action

@action(name="some_action_name")
async def some_action():
    # Do some work

    return "some_result"

动作可以接受任意数量的参数。由于动作是从 Colang 流程中调用的,参数类型仅限于 string (字符串)、integer (整数)、float (浮点数)、boolean (布尔值)、list (列表) 和 dictionary (字典)。

特殊参数#

如果动作的签名中包含以下参数,它们将由 NeMo Guardrails 工具包自动提供,它们是特殊参数:

  • events: 迄今为止的事件历史记录;最后一个事件是触发动作本身的事件;

  • context: 可供动作使用的上下文数据;

  • llm: 访问 LLM 实例(来自 LangChain 的 BaseLLM);

  • config: 完整的 RailsConfig 实例。

这些参数仅用于高级用例。

动作参数#

以下是可以在动作中使用的参数:

参数

描述

类型

示例

events

迄今为止的事件历史记录;最后一个事件是触发动作本身的事件。

List[dict]

[     {'type': 'UtteranceUserActionFinished', ...},     {'type': 'StartInternalSystemAction', 'action_name': 'generate_user_intent', ...},      {'type': 'InternalSystemActionFinished', 'action_name': 'generate_user_intent', ...} ]

context

可供动作使用的上下文数据。

dict

{ 'last_user_message': ...,  'last_bot_message': ..., 'retrieved_relevant_chunks': ... }

llm

访问 LLM 实例(来自 LangChain 的 BaseLLM)。

BaseLLM

OpenAI(model="gpt-3.5-turbo-instruct",...)