新闻
模型
产品
keyboard_arrow_down
读取器
读取URL或搜索为大模型提供更好的依据。
向量模型
世界一流的多模态多语言向量模型。
重排器
世界一流的重排器,最大限度地提高搜索相关性。
深度搜索
搜索、读取并推理直到找到最佳答案。
更多的
keyboard_arrow_down
分类器
图片和文本的零样本和少样本分类。
切分器
将长文本切分成块或词元。

API 文档
为您的AI 编程助手 IDE 或大模型自动生成代码
open_in_new


公司
keyboard_arrow_down
关于我们
联系销售
实习生计划
加入我们
open_in_new
下载Logo
open_in_new
条款及条件


登录
login
Milvus Lite、Jina Embeddings 和 Jina Reranker 概述
Milvus 和 Jina AI 模型实战
总结
立即使用 Jina AI Models 和 Milvus
技术文章
六月 03, 2024

使用 Jina AI 和 Milvus Lite 实现聊天历史 RAG

使用 Jina Embeddings、Reranker 以及轻量级、易于部署的 Milvus Lite,在 Python 中增强你的搜索应用。
Black background with vivid geometric shapes on the sides and central logos "Embeddings," "Reranker," and "Milvus."
Francesco Kruk
Saahil Ognawala
Francesco Kruk, Saahil Ognawala • 6 分钟的读取量

开发人员和运维工程师非常重视那些容易设置、快速启动、且后续能在生产环境中高效扩展的基础设施。基于这个原因,我们的合作伙伴 Milvus 最新推出的轻量级向量数据库 Milvus Lite,对 Python 开发者来说是一个重要工具,特别是当它与高质量且易用的搜索底座模型结合使用时,可以快速开发搜索应用。

在本文中,我们将通过一个示例来说明 Milvus Lite 如何集成 Jina Embeddings v2 和 Jina Reranker v1。这个示例是一个基于虚构公司内部公共频道聊天记录构建的 检索增强生成(RAG) 应用,让员工能够准确且有效地获得与组织相关问题的答案。

tagMilvus Lite、Jina Embeddings 和 Jina Reranker 概述

Milvus Lite 是领先的向量数据库 Milvus 的新版轻量级版本,现在也作为 Python 库提供。Milvus Lite 与部署在 Docker 或 Kubernetes 上的 Milvus 共享相同的 API,但可以通过一行 pip 命令轻松安装,无需设置服务器。

通过在 Milvus 的 Python SDK pymilvus 中集成 Jina Embeddings v2 和 Jina Reranker v1,你现在可以使用相同的 Python 客户端直接嵌入文档,适用于 Milvus 的任何部署模式,包括 Milvus Lite。你可以在 pymilvus 的 文档页面中找到 Jina Embeddings 和 Reranker 集成的详细信息。

凭借 8k-token 的上下文窗口和多语言能力,Jina Embeddings v2 可以编码文本的广泛语义并确保准确检索。通过在流程中添加 Jina Reranker v1,你可以通过将检索结果与查询直接进行交叉编码来进一步优化结果,实现更深层次的上下文理解。

tagMilvus 和 Jina AI 模型实战

本教程将专注于一个实际用例:查询公司的 Slack 聊天历史记录,基于过往对话回答各种问题。

Flowchart detailing the Rust community's model training process, featuring steps from the "Next training step?" query through
使用示例查询查询 Slack 数据的流程

例如,一名员工可以询问 AI 训练过程中的下一步,如上述流程图所示。通过使用 Jina Embeddings、Jina Reranker 和 Milvus,我们可以准确地识别记录的 Slack 消息中的相关信息。该应用程序可以通过便于访问过往通信中的有价值信息来提升工作效率。

为了生成答案,我们将通过 Langchain 中的 HuggingFace 集成使用 Mixtral 7B Instruct。要使用该模型,你需要一个 HuggingFace 访问令牌,可以按照这里的说明生成。

你可以在 Colab 上跟随学习,或者下载 notebook。

Google Colab

tag关于数据集

本教程使用的数据集是由 GPT-4 生成的,旨在复制 Blueprint AI 的 Slack 频道聊天历史。Blueprint 是一家虚构的 AI 初创公司,正在开发自己的基础模型。你可以在这里下载数据集。

数据按频道组织,每个频道代表相关 Slack 对话的集合。每个频道都有一个主题标签,包含十个主题选项之一:模型分发、模型训练、模型微调、伦理和偏见缓解、用户反馈、销售、市场营销、模型入职、创意设计和产品管理。其中一个参与者被称为"专家用户"。你可以使用这个字段来验证查询主题专家用户的结果,我们将在下面展示如何做到这一点。

每个频道还包含聊天历史记录,每个频道最多包含 100 条消息的对话线程。数据集中的每条消息都包含以下信息:

  • 用户:发送消息的用户
  • 消息文本:用户发送的消息内容
  • 时间戳:消息发送时间
  • 文件名:用户可能附加到消息的文件名
  • 消息 ID
  • 父消息 ID:如果消息是源自另一条消息的线程中的消息
Diagram showing the structure of a messaging system, detailing the relationship between 'Channel' and 'Message' entities, wit
聊天数据结构的 UML 图。

tag设置环境

首先,安装所有必需的组件:

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 Key。你可以在这里生成一个。

import os
import getpass

os.environ["JINAAI_API_KEY"] = getpass.getpass(prompt="Jina AI API Key: ")

对 Hugging Face Token 执行相同操作。你可以在这里找到如何生成它。确保将其设置为 READ 以访问 Hugging Face Hub。

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

tag创建 Milvus Collection

创建 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)

tag准备数据

解析聊天历史并提取元数据:

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)

tag嵌入聊天数据

使用 Jina Embeddings v2 为每条消息创建嵌入向量,以检索相关的聊天信息:

from pymilvus.model.dense import JinaEmbeddingFunction

jina_ef = JinaEmbeddingFunction("jina-embeddings-v2-base-en")

embeddings = jina_ef.encode_documents(messages)

tag索引聊天数据

为消息、嵌入向量和相关元数据建立索引:

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
)

tag查询聊天历史

是时候提出一个问题了:

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

现在对查询进行嵌入并检索相关消息。这里我们检索五条最相关的消息,并使用 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}")

我们的问题的答案是:

"根据上下文信息,User5 似乎是你团队中最了解加密协议的人。他们提到新协议显著提高了数据安全性,特别是对于云部署来说。"

如果你阅读 chat_history.json 中的消息,你可以自己验证 User5 是否是最专业的用户。

tag总结

我们已经看到了如何设置 Milvus Lite、使用 Jina Embeddings v2 嵌入聊天数据,以及使用 Jina Reranker v1 优化搜索结果,所有这些都在搜索 Slack 聊天历史的实际用例中展示。Milvus Lite 简化了基于 Python 的应用程序开发,无需复杂的服务器设置。它与 Jina Embeddings 和 Reranker 的集成旨在通过让您更容易访问工作场所中的有价值信息来提高生产力。

tag立即使用 Jina AI Models 和 Milvus

集成了 Jina Embeddings 和 Reranker 的 Milvus Lite 为您提供了一个完整的处理流程,只需几行代码即可使用。

我们很想听听您的使用案例,并讨论 Jina AI Milvus 扩展如何满足您的业务需求。通过我们的网站或我们的 Discord 频道联系我们,分享您的反馈并及时了解我们的最新模型。关于 Milvus 和 Jina AI 集成的问题,欢迎加入 Milvus 社区。

类别:
技术文章
rss_feed
办公室
location_on
加利福尼亚州桑尼维尔
710 Lakeway Dr, Ste 200, 桑尼维尔, CA 94085, 美国
location_on
德国柏林(总部)
Prinzessinnenstraße 19-20,10969 柏林,德国
location_on
中国北京
中国北京市海淀区西大街48号6号楼5层
location_on
中国深圳
中国深圳市赋安科技大厦4楼402
搜索底座
读取器
向量模型
重排器
深度搜索
分类器
切分器
API 文档
获取 Jina API 密钥
速率限制
API 状态
公司
关于我们
联系销售
新闻
实习生计划
加入我们
open_in_new
下载Logo
open_in_new
条款
安全
条款及条件
隐私
管理 Cookie
email
Jina AI © 2020-2025.