txtai 是一个用于语义搜索、LLM编排和语言模型工作流的一站式嵌入式数据库。
有许多文章、笔记本和示例介绍了如何使用txtai进行向量搜索和/或检索增强生成(RAG)。较少为人所知的是,txtai内置了一个工作流组件。
工作流是一种简单而强大的构建,它接受一个可调用对象并返回元素。工作流能够高效地处理管道数据。工作流本质上是流式的,并且以批处理的方式处理数据。这使得能够高效地处理大量数据。
本文将演示如何使用txtai构建一个语音到语音(S2S)的工作流。
注意:由于使用了输入和输出音频设备,此过程应在本地机器上运行。
安装依赖项安装 txtai
及所有依赖项。
pip install txtai[pipeline-audio] autoawq
进入全屏模式 退出全屏模式
定义S2S RAG工作流下一个部分定义了语音到语音(S2S)RAG工作流。该工作流的目标是近乎实时地响应用户请求。
txtai 支持使用 Python 和 YAML 定义工作流。我们将介绍这两种方法。
下面的S2S工作流从麦克风管道开始,该管道流式传输并处理输入音频。麦克风管道内置了语音活动检测(VAD)。当检测到语音时,管道返回捕获的音频数据。接下来,将语音转录为文本,然后传递给RAG管道提示。最后,将RAG结果通过文本到语音(TTS)管道处理,并流式传输到输出音频设备。
import logging
from txtai import Embeddings, RAG
from txtai.pipeline import AudioStream, Microphone, TextToSpeech, Transcription
from txtai.workflow import Workflow, StreamTask, Task
# 启用DEBUG日志
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
# 麦克风
microphone = Microphone()
# 语音转文字
transcribe = Transcription("distil-whisper/distil-large-v3")
# 嵌入数据库
embeddings = Embeddings()
embeddings.load(provider="huggingface-hub", container="neuml/txtai-wikipedia")
# 定义提示模板
template = """
使用以下上下文回答以下问题。仅包括具体讨论的信息。回答问题时不要解释你是如何找到答案的。
问题: {question}
上下文: {context}"""
# 创建RAG管道
rag = RAG(
embeddings,
"hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4",
system="你是一个友好的助手。你回答用户的问题。",
template=template,
context=10
)
# 文本转语音
tts = TextToSpeech("neuml/vctk-vits-onnx")
# 音频流
audiostream = AudioStream()
# 定义语音到语音的工作流
workflow = Workflow(tasks=[
Task(action=microphone),
Task(action=transcribe, unpack=False),
StreamTask(action=lambda x: rag(x, maxlength=4096, stream=True), batch=True),
StreamTask(action=lambda x: tts(x, stream=True, speaker=15), batch=True),
StreamTask(action=audiostream, batch=True)
])
while True:
print("等待输入...")
list(workflow([None]))
进入全屏模式 退出全屏模式
鉴于输入和输出都是音频,如果你是作为一篇文章来阅读这番内容的话,你可能需要发挥一下想象力。
查看此视频,看看实际工作流!以下示例将运行:
- 告诉我关于罗马帝国的事情
- 解释一下超光速旅行是如何工作的
- 写一首关于维京人的短诗
- 用法语告诉我关于罗马帝国的事情
txtai 工作流的一个关键特性是它们可以使用 YAML 来定义。这使得在低代码或无代码环境中构建工作流成为可能。这些 YAML 工作流可以被“容器化”并运行。
让我们在下面定义相同的流程。
# 麦克风
microphone:
# 基于语音的转录
transcription:
path: distil-whisper/distil-large-v3
# 嵌入数据库
cloud:
provider: huggingface-hub
container: neuml/txtai-wikipedia
embeddings:
# 信息检索与生成(RAG)
rag:
path: "hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4"
system: 你是一个友好的助手。你需要回答用户的问题。
template: |
使用以下上下文回答以下问题。只包括具体讨论过的信息。不要解释你是如何找到答案的。
问题: {question}
上下文: {context}
context: 10
# 文本转语音
texttospeech:
path: neuml/vctk-vits-onnx
# 音频流
audiostream:
# 从语音到语音的聊天工作流
workflow:
s2s:
tasks:
- microphone
- action: transcription
unpack: False
- task: stream
action: rag
args:
maxlength: 4096
stream: True
batch: True
- task: stream
action: texttospeech
args:
stream: True
speaker: 15
batch: True
- task: stream
action: audiostream
batch: True
进入全屏模式 退出全屏模式
从 txtai 导入 Application
app = Application("s2s.yml")
while True:
print("等待输入...")
list(app.workflow("s2s", [None]))
进入全屏模式 退出全屏模式
再一次,同样的想法,只是用不同的方式实现。在视频演示中,提出了以下查询。
- 作为一名爱国者队的球迷,你猜我最喜欢的四分卫是谁?
- 我个子高且跑得快,你觉得最适合我的足球位置是什么?
- 我跑得慢,你觉得最适合我的足球位置是什么?
使用 YAML 工作流,可以在代码之外,例如通过网页界面,完全定义流程。也许有一天我们会在 txtai.cloud 看到这样的功能 😀
结束语本文展示了如何使用txtai构建一个语音到语音(S2S)的工作流。虽然该工作流使用了一个现成的嵌入式数据库,但也可以轻松地用自定义的嵌入式数据库替换。从那里,我们就可以使用自己的数据进行S2S了!
共同学习,写下你的评论
评论加载中...
作者其他优质文章