前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Jina AI + Milvus Lite:搭建 RAG 问答机器人

Jina AI + Milvus Lite:搭建 RAG 问答机器人

作者头像
Zilliz RDS
发布2024-06-25 20:30:46
1440
发布2024-06-25 20:30:46
举报

开发人员特别重视那些易于设置、启动迅速且能在生产环境中无缝扩展的基础组件。针对这一需求,我们推出了最新的轻量级向量数据库产品——Milvus Lite。对于 Python 开发者而言,Milvus Lite 是一个极具价值的工具,尤其适用于追求高质量、易用性的搜索应用。

本文将介绍如何使用 Milvus Lite、Jina Embeddings v2 和 Jina Reranker v1 搭建检索增强生成 (RAG)应用。

Milvus Lite、Jina Embeddings 与 Jina Reranker 简介

Milvus Lite 是 Milvus 向量数据库的轻量版本,与 Milvus 共享同一套 API。仅需一行 pip 代码即可快速安装并使用 Milvus Lite,为您免去繁琐的设置流程。

Milvus 的 Python SDK —— pymilvus 集成了Jina Embeddings v2 和 Jina Reranker v1,支持直接使用同一个 Python 客户端部署 Milvus Lite 和 Jina Embeddings,并直接将文档转换为 Embedding 向量。更多详情,请参考 pymilvus 文档(https://milvus.io/docs/integrate_with_jina.md?ref=jina-ai-gmbh.ghost.io)。

Jina Embeddings v2 支持 8000 个 token 的上下文窗口,并提供多语言能力,能够将丰富的文本语义信息编码为 Embedding 向量,有助于实现高准确性搜索。在 Pipeline 中添加 Jina Reranker v1 可以进一步将搜索结果做优化,从而提供更富含上下文语义、更准确的回答。

Milvus and Jina AI Models in Action

本教程将介绍如何搭建一个实际的应用——基于聊天记录,为查询问题生成最相关的回答。

本教程搭建的应用可在实际生活中使用,例如,某公司员工可以向聊天机器人提问 AI 训练流程。

Jina Embeddings、Jina Reranker 和 Milvus 发挥协同作用,能够帮助聊天机器人准确识别聊天记录中的相关信息,并生成高度准确的回答。这样的聊天机器人可以有效帮助公司提升生产力,公司员工也能够更方便地获取所需信息。

在生成回答的过程中,我们会借助 HuggingFace 与 LangChain 的集成,使用到 Mixtral 7B Instruct。如需跟随本教程指南,请先点击此链接 (https://huggingface.co/docs/hub/en/security-tokens?ref=jina-ai-gmbh.ghost.io)创建 HuggingFace token。

您可以点击文末阅读原文链接通过 Colab 获取教程代码。

01. 数据集简介

本教程使用的数据集是由 GPT-4 生成的,旨在模拟 AI 初创公司 Slack Channel 中的聊天记录数据。您可以在此链接 (https://raw.githubusercontent.com/jina-ai/workshops/main/notebooks/embeddings/milvus/chat_history.json?ref=jina-ai-gmbh.ghost.io) 下载数据集。

数据集中的所有数据以 channels 的形式组织,每个 channel 的数据代表了一组 Slack 聊天内容,并带有话题标签。本数据集共有 10 个标签:model distribution、model training、model fine-tuning、ethics and bias mitigation、user feedback、sales、marketing、model onboarding、creative design、product management。

模拟的数据中,有一名参与聊天的用户被命名为 "expert user" (专家)。您可以通过查看其相关聊天记录来验证 RAG 应用生成的结果是否准确。

每个 channel 中包含至多 100 条聊天记录。每条记录包含以下信息:

  • 发送这条聊天记录的用户(User)
  • 发送的聊天记录文本(Text)
  • 发送时间(Timestamp)
  • 用户随聊天记录附上的文件名称(Filename)
  • 聊天记录的 ID (MesaageID)
  • 当这条聊天记录为其他聊天的子话题时,还需要包含其关联聊天记录的 ID(Parent Message ID

02. 设置环境

开始前,请先安装所需组件和工具。

代码语言:javascript
复制
pip install -U pymilvus
pip install -U "pymilvus[model]"
pip install langchain
pip install langchain-community

下载数据集。

代码语言:javascript
复制
import os

if not os.path.exists("chat_history.json"):
    !wget https://raw.githubusercontent.com/jina-ai/workshops/main/notebooks/embeddings/milvus/chat_history.json

在环境变量中设置 Jina AI API 密钥。如果您还未获取 Jina AI API 密钥,可通过此链接 (https://jina.ai/reranker/?ref=jina-ai-gmbh.ghost.io) 获取。

代码语言:javascript
复制
import os
import getpass
os.environ["JINAAI_API_KEY"] = getpass.getpass(prompt="Jina AI API Key: ")

同样,在环境变量中设置 HuggingFace token。如未获取 token,请参考此文档(https://huggingface.co/docs/hub/en/security-tokens?ref=jina-ai-gmbh.ghost.io) 并获取 token。请确保该 token 权限已设置为 READ且可访问 Hugging Face Hub。

代码语言:javascript
复制
os.environ["HUGGINGFACEHUB_API_TOKEN"] = getpass.getpass(prompt="Hugging Face Token: ")

03. 创建 Milvus Collection

请先创建 1 个 Milvus Collection,用于后续存储数据并创建索引。

代码语言:javascript
复制
from pymilvus import MilvusClient, DataType

# Specify a local file name as uri parameter of MilvusClient to use Milvus Lite
client = MilvusClient("milvus_jina.db")

schema = MilvusClient.create_schema(
    auto_id=True,
    enable_dynamic_field=True,
)

schema.add_field(field_name="id", datatype=DataType.INT64, description="The Primary Key", is_primary=True)
schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, description="The Embedding Vector", dim=768)

index_params = client.prepare_index_params()
index_params.add_index(field_name="embedding", metric_type="COSINE", index_type="AUTOINDEX")

client.create_collection(collection_name="milvus_jina", schema=schema, index_params=index_params)

04. 准备数据

解析聊天记录并提取元数据。

代码语言:javascript
复制
import json

with open("chat_history.json", "r", encoding="utf-8") as file:
    chat_data = json.load(file)
messages = []
metadatas = []

for channel in chat_data:
  chat_history = channel["chat_history"]
  chat_topic = channel["topic"]
  chat_expert = channel["expert_user"]for message in chat_history:
    text = f"""{message["user"]}: {message["message"]}"""
    messages.append(text)
    meta = {"time_stamp": message["time_stamp"],"file_name": message["file_name"],"parent_message_nr": message["parent_message_nr"],"channel": chat_topic,"expert": True if message["user"] == chat_expert else False
    }
    metadatas.append(meta)

05. 将聊天数据转换为 Embedding 向量

使用 Jina Embeddings v2 为每条聊天消息生成 Embedding 向量,以便后续检索相关聊天信息。

代码语言:javascript
复制
from pymilvus.model.dense import JinaEmbeddingFunction
jina_ef = JinaEmbeddingFunction("jina-embeddings-v2-base-en")
embeddings = jina_ef.encode_documents(messages)

06. 为聊天数据创建索引

为聊天数据、Embedding 向量和相关元数据创建索引。

代码语言:javascript
复制
collection_data = [{"message": message,"embedding": embedding,"metadata": metadata
} for message, embedding, metadata in zip(messages, embeddings, metadatas)]
data = client.insert(
    collection_name="milvus_jina",
    data=collection_data
)

07. 查询聊天记录

输入查询问题:"Who knows the most about encryption protocols in my team?"(翻译:“我的团队中谁最了解加密协议?”)

代码语言:javascript
复制
query = "Who knows the most about encryption protocols in my team?"

将查询问题转换为 Embedding 向量,并在 Milvus 中搜索相似的向量以检索相关聊天记录。本例中,我们指定搜索返回前 5 条最相关的聊天记录并使用 Jina Reranker v1 对搜索结果进行重新排序。

代码语言:javascript
复制
from pymilvus.model.reranker import JinaRerankFunction
query_vectors = jina_ef.encode_queries([query])
results = client.search(
    collection_name="milvus_jina",
    data=query_vectors,
    limit=5,
)
results = results[0]
ids = [results[i]["id"] for i in range(len(results))]
results = client.get(
    collection_name="milvus_jina",
    ids=ids,
    output_fields=["id", "message", "metadata"]
)
jina_rf = JinaRerankFunction("jina-reranker-v1-base-en")
documents = [results[i]["message"] for i in range(len(results))]
reranked_documents = jina_rf(query, documents)
reranked_messages = []
for reranked_document in reranked_documents:
  idx = reranked_document.index
  reranked_messages.append(results[idx])

我们将重排后的聊天记录作为上下文,与查询问题结合在一起传入 Mixtral 7B Instruct 模型并最终生成回答。

代码语言:javascript
复制
from langchain.prompts import PromptTemplate
from langchain_community.llms import HuggingFaceEndpoint
llm = HuggingFaceEndpoint(repo_id="mistralai/Mixtral-8x7B-Instruct-v0.1")
prompt = """<s>[INST] Context information is below.\\n
        It includes the five most relevant messages to the query, sorted based on their relevance to the query.\\n
        ---------------------\\n
        {context_str}\\\\n
        ---------------------\\n
        Given the context information and not prior knowledge,
        answer the query. Please be brief, concise, and complete.\\n
        If the context information does not contain an answer to the query,
        respond with \\"No information\\".\\n
        Query: {query_str}[/INST] </s>"""
prompt = PromptTemplate(template=prompt, input_variables=["query_str", "context_str"])
llm_chain = prompt | llm
answer = llm_chain.invoke({"query_str":query, "context_str":reranked_messages})

print(f"\n\nANSWER:\n\n{answer}")

回答如下:

“Based on the context information, User5 seems to be the most knowledgeable about encryption protocols in your team. They have mentioned that the new protocols enhance data security significantly, especially for cloud deployments.”

(翻译:基于上下文信息,User5 是您团队中最了解加密协议的。其聊天记录中曾提及新加密协议可以大幅提升数据安全性,尤其是在云环境中。)

如果需要验证回答的准确性,您只需仔细阅读 chat_history.json 中的聊天记录就能发现 User5 确实是团队中最了解揭秘协议的用户。

总结

文本分享了如何基于 Slack 聊天记录搭建 RAG 问答机器人,并详细介绍了设置 Milvus、使用 Jina Embeddings v2 将聊天记录转换为 Embedding 向量、借助 Jina Reranker v1 优化搜索结果等操作步骤。

Milvus Lite 简化了 Python 应用的搭建流程,支持用户通过简单的配置立即上手使用向量数据库。Milvus Lite 集成了 Jina Embedding 和 Reranker 模型,进一步提升了应用开发的效率。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ZILLIZ 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
向量数据库
腾讯云向量数据库(Tencent Cloud VectorDB)是一款全托管的自研企业级分布式数据库服务,专用于存储、检索、分析多维向量数据。该数据库支持多种索引类型和相似度计算方法,单索引支持千亿级向量规模,可支持百万级 QPS 及毫秒级查询延迟。腾讯云向量数据库不仅能为大模型提供外部知识库,提高大模型回答的准确性,还可广泛应用于推荐系统、自然语言处理等 AI 领域。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档