跳到主要内容
Open In ColabOpen on GitHub

vectara

Vectara 是值得信赖的 AI 助手和代理平台,专注于关键任务企业应用的就绪性。Vectara 的无服务器 RAG 即服务(RAG-as-a-service)通过易于使用的 API 提供 RAG 的所有组件,包括:

  1. 从文件(PDF、PPT、DOCX 等)中提取文本的方法
  2. 基于机器学习的分块,提供最先进的性能。
  3. Boomerang 嵌入模型。
  4. 其内部向量数据库,用于存储文本块和嵌入向量。
  5. 一个查询服务,自动将查询编码为嵌入,并检索最相关的文本片段,包括支持混合搜索以及多种重新排序选项,例如多语言相关性重新排序器MMRUDF 重新排序器
  6. 一个 LLM,用于根据检索到的文档(上下文)创建生成式摘要,包括引用。

欲了解更多信息

本 Notebook 展示了如何使用 Vectara 的聊天功能,该功能提供自动存储会话历史记录,并确保后续问题考虑到该历史记录。

设置

要使用 VectaraVectorStore,您首先需要安装合作伙伴包。

!uv pip install -U pip && uv pip install -qU langchain-vectara

开始使用

要开始使用,请遵循以下步骤:

  1. 如果您还没有账户,请注册免费的 Vectara 试用版。
  2. 在您的帐户中,您可以创建一个或多个语料库。每个语料库都表示一个区域,用于存储从输入文档中摄取到的文本数据。要创建语料库,请使用 “创建语料库” 按钮。然后,为您的语料库提供一个名称和描述。您可以选择定义过滤属性并应用一些高级选项。如果您点击已创建的语料库,您可以在顶部看到其名称和语料库 ID。
  3. 接下来,您需要创建 API 密钥来访问语料库。点击语料库视图中的 “访问控制” 选项卡,然后点击 “创建 API 密钥” 按钮。为您的密钥命名,并选择您希望密钥是仅查询还是查询+索引。点击“创建”,您现在就拥有了一个活跃的 API 密钥。请妥善保管此密钥。

要将 LangChain 与 Vectara 结合使用,您需要这两个值:corpus_keyapi_key。您可以通过两种方式向 LangChain 提供 VECTARA_API_KEY

实例化

  1. 在您的环境中包含这两个变量:VECTARA_API_KEY

    例如,您可以使用 os.environ 和 getpass 如下设置这些变量:

import os
import getpass

os.environ["VECTARA_API_KEY"] = getpass.getpass("Vectara API Key:")
  1. 将它们添加到 Vectara 向量存储构造函数中
vectara = Vectara(
vectara_api_key=vectara_api_key
)

在本 Notebook 中,我们假定它们已在环境中提供。

import os

os.environ["VECTARA_API_KEY"] = "<VECTARA_API_KEY>"
os.environ["VECTARA_CORPUS_KEY"] = "<VECTARA_CORPUS_KEY>"

from langchain_vectara import Vectara
from langchain_vectara.vectorstores import (
CorpusConfig,
GenerationConfig,
MmrReranker,
SearchConfig,
VectaraQueryConfig,
)

Vectara 聊天功能说明

在大多数使用 LangChain 创建聊天机器人的情况下,必须集成一个特殊的 memory 组件来维护聊天会话的历史记录,然后使用该历史记录来确保聊天机器人了解会话历史。

通过 Vectara 聊天功能,所有这些都在后端由 Vectara 自动执行。您可以查看聊天文档以获取详细信息,了解其内部实现方式,但在 LangChain 中,您只需在 Vectara 向量存储中开启该功能即可。

我们来看一个例子。首先,我们加载 SOTU 文档(请记住,文本提取和分块都在 Vectara 平台上自动进行)

from langchain_community.document_loaders import TextLoader

loader = TextLoader("../document_loaders/example_data/state_of_the_union.txt")
documents = loader.load()

corpus_key = os.getenv("VECTARA_CORPUS_KEY")
vectara = Vectara.from_documents(documents, embedding=None, corpus_key=corpus_key)
API 参考:TextLoader

现在我们使用 as_chat 方法创建一个聊天 Runnable

generation_config = GenerationConfig(
max_used_search_results=7,
response_language="eng",
generation_preset_name="vectara-summary-ext-24-05-med-omni",
enable_factual_consistency_score=True,
)
search_config = SearchConfig(
corpora=[CorpusConfig(corpus_key=corpus_key, limit=25)],
reranker=MmrReranker(diversity_bias=0.2),
)

config = VectaraQueryConfig(
search=search_config,
generation=generation_config,
)


bot = vectara.as_chat(config)

调用

这是一个没有聊天历史记录的问题示例

bot.invoke("What did the president say about Ketanji Brown Jackson?")["answer"]
'The president stated that nominating someone to serve on the United States Supreme Court is one of the most serious constitutional responsibilities. He nominated Circuit Court of Appeals Judge Ketanji Brown Jackson, describing her as one of the nation’s top legal minds who will continue Justice Breyer’s legacy of excellence and noting her experience as a former top litigator in private practice [1].'

这是一个带有一些聊天历史记录的问题示例

bot.invoke("Did he mention who she suceeded?")["answer"]
'Yes, the president mentioned that Ketanji Brown Jackson succeeded Justice Breyer [1].'

流式聊天

当然,聊天机器人界面也支持流式传输。您只需使用 stream 方法而不是 invoke 方法

output = {}
curr_key = None
for chunk in bot.stream("what did he said about the covid?"):
for key in chunk:
if key not in output:
output[key] = chunk[key]
else:
output[key] += chunk[key]
if key == "answer":
print(chunk[key], end="", flush=True)
curr_key = key
The president acknowledged the significant impact of COVID-19 on the nation, expressing understanding of the public's fatigue and frustration. He emphasized the need to view COVID-19 not as a partisan issue but as a serious disease, urging unity among Americans. The president highlighted the progress made, noting that severe cases have decreased significantly, and mentioned new CDC guidelines allowing most Americans to be mask-free. He also pointed out the efforts to vaccinate the nation and provide economic relief, and the ongoing commitment to vaccinate the world [2], [3], [5].

链式调用

如需更多功能,您可以使用链式调用。

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai.chat_models import ChatOpenAI

llm = ChatOpenAI(temperature=0)

prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"You are a helpful assistant that explains the stuff to a five year old. Vectara is providing the answer.",
),
("human", "{vectara_response}"),
]
)


def get_vectara_response(question: dict) -> str:
"""
Calls Vectara as_chat and returns the answer string. This encapsulates
the Vectara call.
"""
try:
response = bot.invoke(question["question"])
return response["answer"]
except Exception as e:
return "I'm sorry, I couldn't get an answer from Vectara."


# Create the chain
chain = get_vectara_response | prompt | llm | StrOutputParser()


# Invoke the chain
result = chain.invoke({"question": "what did he say about the covid?"})
print(result)
So, the president talked about how the COVID-19 sickness has affected a lot of people in the country. He said that it's important for everyone to work together to fight the sickness, no matter what political party they are in. The president also mentioned that they are working hard to give vaccines to people to help protect them from getting sick. They are also giving money and help to people who need it, like food, housing, and cheaper health insurance. The president also said that they are sending vaccines to many other countries to help people all around the world stay healthy.

API 参考

您可以查看聊天文档以获取详细信息。