📘 **TELUS Agriculture & Consumer Goods** 如何通过 **Haystack Agents** 转变促销交易

Gemini 模型集成 Google Vertex AI,用于 Haystack

通过新的 Gemini 集成,为 Haystack 提供多模态组件和函数调用

在本文中,我们将向您介绍 Haystack 的新 Google Vertex AI 集成。虽然此集成为 Haystack 生态系统引入了几个新组件(欢迎探索完整的集成仓库!),但我们想先重点介绍两个组件:VertexAIGeminiGeneratorVertexAIGeminiChatGenerator,使用 gemini-progemini-1.5-flash 模型。

💚 您可以在配套的 Notebook 中运行本文展示的示例代码

好消息是,要进行 Gemini 模型访问认证,您只需在 Colab 中进行一次 Google 认证(Colab 中有说明)。

用于图像问答的 VertexAIGeminiGenerator

新的 VertexAIGeminiGenerator 组件允许您查询 Gemini 模型,例如 gemini-progemini-1.5-flash。在此示例中,我们将使用后者,以便在查询中使用图像。

要开始,您需要安装 Haystack 和 google-vertex-haystack 集成

!pip install haystack-ai google-vertex-haystack

与 Haystack 2.0-Beta 中的任何其他生成器组件一样,要单独运行 GeminiGenerator,只需调用 run() 方法即可。但是,与我们的其他组件不同,这里的 run 方法需要 parts 作为输入。Google Vertex AI API 中的 Part 可以是消息、图像,甚至是函数调用。以下是来源代码中我们能找到的最新的文档字符串参考 此处。让我们用一个简单的查询运行此组件 👇

from haystack_integrations.components.generators.google_vertex import VertexAIGeminiGenerator

gemini = VertexAIGeminiGenerator(model="gemini-1.5-flash", project_id='YOUR-GCP-PROJECT-ID')
gemini.run(parts = ["What is the most interesting thing you know?"])

使用图像查询

接下来,让我们利用 parts 的灵活性,同时传入一些图像和问题。在下面的示例中,我们提供了 4 张包含机器人的图片,并询问 gemini-1.5-flash 关于它们的看法。

Pictures of 4 robots

import requests
from haystack.dataclasses.byte_stream import ByteStream

URLS = [
    "https://raw.githubusercontent.com/silvanocerza/robots/main/robot1.jpg",
    "https://raw.githubusercontent.com/silvanocerza/robots/main/robot2.jpg",
    "https://raw.githubusercontent.com/silvanocerza/robots/main/robot3.jpg",
    "https://raw.githubusercontent.com/silvanocerza/robots/main/robot4.jpg"
]
images = [
    ByteStream(data=requests.get(url).content, mime_type="image/jpeg")
    for url in URLS
]

result = gemini.run(parts = ["What can you tell me about this robots?", *images])
for answer in result["replies"]:
    print(answer)

💡 有趣的事实:我们注意到 Gemini 一直在错误地识别第三个机器人!通常的回答是:“第三张图是 1951 年电影《地球停转之日》中的 Gort。Gort 是一个被派往地球警告人类核战争危险的机器人。他是一个强大而聪明的机器人,但他也富有同情心和理解力。” 然而,这个机器人是《银河系漫游指南》系列中的愤世嫉俗的火星人马文。如果 Gort 长那样就太傻了!😅

用于函数调用的 VertexAIGeminiChatGenerator

使用 gemini-pro,我们还可以开始引入函数调用!所以让我们看看如何做到这一点。这里要注意的一个重要特性是,在这种情况下,函数调用指的是使用 Gemini 来识别函数应该*如何*被调用。为了说明我们的意思,让我们看看是否可以构建一个系统,根据自然语言提出的问题来运行一个 get_current_weather 函数。

在本节中,我们将使用新的 VertexAIGeminiChatGenerator 组件,该组件可以通过提供一个 tools 列表来可选地初始化。这很快就会派上用场,因为我们可以定义函数并将它们作为工具列表提供给生成器。

为了演示,我们只是创建了一个 get_current_weather 函数,它返回一个总是告诉我们“晴朗,21.8 度”的对象。如果以摄氏度计算,那将是美好的一天!☀️

from typing import Annotated

def get_current_weather(
    location: Annotated[str, "The city for which to get the weather, e.g. 'San Francisco'"] = "Munich",
    unit: Annotated[str, "The unit for the temperature, e.g. 'celsius'"] = "celsius",
):
  return {"weather": "sunny", "temperature": 21.8, "unit": unit}

接下来,我们将函数转换为 Haystack Tool 对象。参数的描述(使用 Annotated 提供)将包含在工具的模式中。

from haystack.tools import create_tool_from_function

weather_tool = create_tool_from_function(get_current_weather)

我们可以将此工具与 VertexAIGeminiChatGenerator 一起使用,并要求它告诉我们如何调用该函数来回答问题“柏林的气温(摄氏度)是多少?”

from haystack_integrations.components.generators.google_vertex import VertexAIGeminiChatGenerator
from haystack.dataclasses import ChatMessage

gemini_chat = VertexAIGeminiChatGenerator(model="gemini-pro", project_id='YOUR-GCP-PROJECT-ID', tools=[weather_tool])

user_message = [ChatMessage.from_user("What is the temperature in celsius in Berlin?")]
replies = gemini_chat.run(messages=user_message)["replies"]
replies

使用此交互获得的响应,我们可以使用 ToolInvoker 组件调用 get_current_weather 函数,并继续我们的聊天。

from haystack.components.tools import ToolInvoker

tool_invoker = ToolInvoker(tools=[weather_tool])
tool_messages = tool_invoker.run(messages=replies)["tool_messages"]

messages = user_message + replies + tool_messages

res = gemini_chat.run(messages = messages)
res["replies"][0].text

构建完整的检索增强生成管道

除了上面单独使用新的 Gemini 组件外,您当然也可以在完整的 Haystack 管道中使用它们。这是一个使用 LinkContentFetcherVertexAIGeminiGenerator(使用 gemini-1.5-flash 模型)在网页上进行问答的 RAG 管道示例 👇

由于我们正在为 Haystack 2.0 的正式发布做准备,目前 Beta 版本中可用的组件主要集中在文本方面。因此,真正多模态的应用程序(如完整的 Haystack 管道)目前还不可行。我们正在创建可以轻松处理图像、音频和视频等其他媒体的组件,并将很快带来示例!

from haystack_integrations.components.generators.google_vertex import VertexAIGeminiGenerator
from haystack.components.fetchers.link_content import LinkContentFetcher
from haystack.components.converters import HTMLToDocument
from haystack.components.preprocessors import DocumentSplitter
from haystack.components.rankers import TransformersSimilarityRanker
from haystack.components.builders.prompt_builder import PromptBuilder
from haystack import Pipeline

fetcher = LinkContentFetcher()
converter = HTMLToDocument()
document_splitter = DocumentSplitter(split_by="word", split_length=50)
similarity_ranker = TransformersSimilarityRanker(top_k=3)
gemini = VertexAIGeminiGenerator(model="gemini-1.5-flash", project_id=project_id)

prompt_template = """
According to these documents:

{% for doc in documents %}
  {{ doc.content }}
{% endfor %}

Answer the given question: {{question}}
Answer:
"""
prompt_builder = PromptBuilder(template=prompt_template)

pipeline = Pipeline()
pipeline.add_component("fetcher", fetcher)
pipeline.add_component("converter", converter)
pipeline.add_component("splitter", document_splitter)
pipeline.add_component("ranker", similarity_ranker)
pipeline.add_component("prompt_builder", prompt_builder)
pipeline.add_component("gemini", gemini)

pipeline.connect("fetcher.streams", "converter.sources")
pipeline.connect("converter.documents", "splitter.documents")
pipeline.connect("splitter.documents", "ranker.documents")
pipeline.connect("ranker.documents", "prompt_builder.documents")
pipeline.connect("prompt_builder.prompt", "gemini") 

一旦我们有了管道,就可以用关于 Haystack 2.0-Beta 的查询来运行它。

question = "What do graphs have to do with Haystack?"
result = pipeline.run({"prompt_builder": {"question": question},
                   "ranker": {"query": question},
                   "fetcher": {"urls": ["https://haystack.com.cn/blog/introducing-haystack-2-beta-and-advent"]}})

for answer in result["gemini"]["replies"]:
  print(answer)

现在您已经看到了 Gemini 的一些功能,以及如何将其集成到 Haystack 中 🫶 如果您想了解更多