及时的模板和任务链
#showdev #python #machinelearning #nlp

本文是txtai的教程系列的一部分,txtai是AI驱动的语义搜索平台。

txtai执行机器学习工作流程以转换数据并构建AI驱动的语义搜索应用程序。

TXTAI长期以来一直支持工作流程。工作流程将机器学习模型的输入和输出连接在一起,以创建强大的转换和处理功能。

最近对“模型提示”引起了人们的兴趣,这是构建任务的自然语言描述并将其传递给大型语言模型(LLM)的过程。 TXTAI最近改善了对任务模板的支持,该模板从一组参数中构建字符串输出。

本文演示了如何使用TXTAI工作流程应用及时模板并将这些任务链接在一起。

安装依赖项

安装txtai和所有依赖项。

# Install txtai
pip install txtai[api]

及时的工作流程

首先,我们将考虑使用一系列模型提示来构建工作流程。此工作流使用语句和目标语言创建有条件的翻译。另一个任务读取输出文本并检测语言。

此工作流使用序列管道。序列管道将拥抱的面序列加载到推理的序列模型中,在这种情况下为FLAN-T5。序列管道采取提示为输入并输出模型推断结果。

重要的是要注意,管道只是一个可可的功能。它可以轻松地用对外部API的调用来代替。

from txtai.pipeline import Sequences
from txtai.workflow import Workflow, TemplateTask

# Create sequences pipeline
sequences = Sequences("google/flan-t5-large")

# Define workflow or chaining of tasks together.
workflow = Workflow([
    TemplateTask(
        template="Translate '{statement}' to {language} if it's English",
        action=sequences
    ),
    TemplateTask(
        template="What language is the following text? {text}",
        action=sequences
    )
])

inputs = [
    {"statement": "Hello, how are you", "language": "French"},
    {"statement": "Hallo, wie geht's dir", "language": "French"}
]

print(list(workflow(inputs)))
['French', 'German']

让我们回顾一下这里发生了什么。第一个工作流程任务有条件地将文本转换为语言,如果是英语。

第一个语句是Hello, how are you,具有法语的目标语言。因此,该声明被翻译成法语。

第二个陈述是德语,所以它没有转换为法语。

下一步询问模型是什么语言,它正确打印了FrenchGerman

YAML及时工作流程

可以使用YAML配置创建上面的相同工作流程。

sequences:
  path: google/flan-t5-large

workflow:
  chain:
    tasks:
      - task: template
        template: Translate '{statement}' to {language} if it's English
        action: sequences
      - task: template
        template: What language is the following text? {text}
        action: sequences
from txtai.app import Application

app = Application("workflow.yml")
print(list(app.workflow("chain", inputs)))
['French', 'German']

正如预期的,结果相同!这是您要如何创建工作流程的偏爱问题。 YAML工作流的一个优点是可以轻松地从Workflow文件创建API。

通过API调用及时工作流程

假设您希望通过API调用可用工作流。好消息,TXTAI使用FastApi具有内置的API机制。

# Start an API service
!CONFIG=workflow.yml nohup uvicorn "txtai.api:app" &> api.log &
!sleep 60
import requests

# Run API request
requests.post("http://localhost:8000/workflow", json={"name": "chain", "elements": inputs}).json()
['French', 'German']

就像以前的步骤一样,除了通过API调用。让我们通过卷曲来跑得很好。

curl -s -X POST "http://localhost:8000/workflow" \
     -H "Content-Type: application/json" \
     --data @- << EOF
{
  "name": "chain",
  "elements": [
    {"statement": "Hello, how are you", "language": "French"},
    {"statement": "Hallo, wie geht's dir", "language": "French"}
  ]
}
EOF
["French","German"]

最后一次显示相同的输出。

如果您的主要开发环境不是Python,TXTAI确实具有JavaScriptRustGoJava的API绑定。

有关API的更多信息可用here

会话链

对话搜索是2023年的另一个重点领域。txtchat是用于构建会话搜索应用程序的框架。它严重依赖Txtai。让我们看看一个对话示例。

writable: false
cloud:
  provider: huggingface-hub
  container: neuml/txtai-intro

extractor:
  path: google/flan-t5-large
  output: reference

workflow:
  search:
    tasks:
      - task: extractor
        template: |
          Answer the following question using only the context below. Give a detailed answer.
          Say 'I don't have data on that' when the question can't be answered.
          Question: {text}
          Context: 
        action: extractor
      - task: template
        template: "{answer}\n\nReference: {reference}"
        rules:
          answer: I don't have data on that
app = Application("search.yml")
print(list(app.workflow("search", ["Tell me something about North America"])))
["Canada's last fully intact ice shelf has suddenly collapsed, forming a Manhattan-sized iceberg\n\nReference: 1"]

上面代码所做的第一件事是运行嵌入式搜索以构建对话上下文。然后,该上下文用于构建提示,并针对LLM进行推理。

下一个任务格式化输出,引用最佳匹配记录。在这种情况下,它只是1个ID。但是,如果ID是URL或有逻辑将ID格式化回唯一的参考字符串。

txtchat项目对此有更多的内容,请查看!

包起来

本文介绍了如何通过一系列结果构建及时模板和任务链。 TXTAI长期以来一直有一个强大而有效的工作流框架来将模型连接在一起。这可能是小型且简单的模型和/或大型型号的提示。继续尝试!