AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


Jina AI + Milvus Lite:搭建 RAG 问答机器人
发布日期:2024-06-21 21:38:38 浏览次数: 1963 来源:Zilliz


开发人员特别重视那些易于设置、启动迅速且能在生产环境中无缝扩展的基础组件。针对这一需求,我们推出了最新的轻量级向量数据库产品——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. 设置环境

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

pip install -U pymilvus
pip install -U "pymilvus[model]"
pip install langchain
pip install langchain-community


下载数据集。

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) 获取。

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。

os.environ["HUGGINGFACEHUB_API_TOKEN"] = getpass.getpass(prompt="Hugging Face Token: ")


03. 创建 Milvus Collection

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

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. 准备数据

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

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 向量,以便后续检索相关聊天信息。

from pymilvus.model.dense import JinaEmbeddingFunction
jina_ef = JinaEmbeddingFunction("jina-embeddings-v2-base-en")
embeddings = jina_ef.encode_documents(messages)


06. 为聊天数据创建索引

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

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?"(翻译:“我的团队中谁最了解加密协议?”)

query = "Who knows the most about encryption protocols in my team?"


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

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  模型并最终生成回答。

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 模型,进一步提升了应用开发的效率。


欢迎立即使用 Milvus 与 Jina AI!

Milvus Lite 集成了 Jina Embeddings 和 Reranker,为开发人员提供了完整的数据处理 Pipeline。仅需几行代码便可快速开始!



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询