微信扫码
与创始人交个朋友
我要投稿
项目经理小李突然被临时分派到一个新业务,他对公司在这个领域的最新动向和产品设计思路一无所知。他翻阅文档,询问同事,但信息仍然不够完整和及时。实际上,公司各项业务的新动态和技术挑战,更多存在于员工们日常沟通交流的聊天记录之中。
本文,我们将演示如何利用 Milvus Lite 向量数据库与 Jina AI 模型,从企业内部的聊天记录中构建一个知识库式的检索增强生成 (RAG) 应用。Milvus Lite 是一个轻量级的向量数据库,支持本地运行。Jina AI 提供了支持长上下文的 Embedding 和 reranker 模型,可以高效地将非结构化文本数据转化为向量并进行语义检索。
我们将使用一个虚构的企业内部聊天记录数据集,搭建一个 RAG 应用原型。通过这个应用,员工们就可以自然语言查询内部知识,快速全面获取所需的相关对话信息,拉平项目信息差,提高工作效率。
Milvus Lite 是向量数据库 Milvus 的轻量级版本,它与 Milvus 共享同一套 API,只需一行 pip 命令即可安装,,无需设置服务器。
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
Jina Embeddings v2 支持 8192 token 的上下文窗口,并提供多语言能力,能够将丰富的文本语义信息编码为 Embedding 向量,确保实现高准确性搜索。在 Pipeline 中添加 Jina Reranker v1 模型可以进一步优化搜索结果,从而提供更富含上下文语义、更准确的回答。
本教程将介绍如何搭建一个实际的应用,基于企业内部聊天记录,为用户查询生成最相关的回答。
本教程搭建的应用可在实际生活中使用,例如,某公司员工可以向聊天机器人提问 AI 训练流程。
Jina Embeddings、Jina Reranker 和 Milvus 发挥协同作用,能够帮助聊天机器人准确识别聊天记录中的相关信息,并生成高度准确的回答。这样的聊天机器人可以有效帮助公司提升生产力,公司员工也能够更方便地获取所需信息。
在生成回答的过程中,我们会借助 HuggingFace 与 LangChain 的集成,使用到 Mixtral 7B Instruct。如需跟随本教程指南,请先通过此链接 (https://huggingface.co/docs/hub/en/security-tokens)创建 HuggingFace token。
您也可以点击文末阅读原文链接,获取教程代码。
Colab: https://colab.research.google.com/github/jina-ai/workshops/blob/main/notebooks/embeddings/milvus/milvus_lite_jina_integration.ipynb
本教程使用的数据集是由 GPT-4 生成的,旨在模拟 AI 初创公司 Slack Channel 中的聊天记录数据。您可以在此链接 (https://raw.githubusercontent.com/jina-ai/workshops/main/notebooks/embeddings/milvus/chat_history.json) 下载数据集。
数据集中的所有数据以 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)
开始前,请先安装所需组件和工具。
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) 获取。
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) 并获取 token。请确保该 token 权限已设置为 READ 且可访问 Hugging Face Hub。
os.environ["HUGGINGFACEHUB_API_TOKEN"] = getpass.getpass(prompt="Hugging Face Token: ")
请先创建 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)
解析聊天记录并提取元数据。
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)
使用 Jina Embeddings v2 为每条聊天消息生成 Embedding 向量,以便后续检索相关聊天信息。
from pymilvus.model.dense import JinaEmbeddingFunction
jina_ef = JinaEmbeddingFunction("jina-embeddings-v2-base-en")
embeddings = jina_ef.encode_documents(messages)
为聊天数据、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
)
输入查询问题:"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 集成了 Jina Embeddings 和 Reranker,为开发人员提供了完整的数据处理 Pipeline。仅需几行代码便可快速开始!
欢迎和我们分享您使用 Milvus 与 Jina Embeddings 的心得或相关案例。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-12-22
告别加班!这款 AI 数据神器,让你像聊天一样轻松搞定数据!
2024-12-21
全网最全ChatGPT财务分析提示词解决方案
2024-12-21
万字长文梳理基于LLM的Text-to-SQL发展进程
2024-12-20
从0到1解构数据问答系统架构:三层模型全解析
2024-12-19
博士眼镜 × 观远数据 × 飞书 | AI 和 BI 赋能业务实践
2024-12-19
传统水务如何借助AI完成智能化升级?一文看懂核心架构与实战应用!
2024-12-18
ChatBl有什么用,看这篇就够了!
2024-12-18
在Windows上使用RAGFlow+Ollama+Qwen2.5,搭建医疗问诊助手(附相关数据集和案例)
2024-06-20
2024-06-14
2024-07-03
2024-06-06
2024-06-14
2024-06-21
2024-06-16
2024-06-07
2024-07-24
2024-10-09
2024-12-13
2024-11-19
2024-11-06
2024-10-25
2024-10-25
2024-10-25
2024-10-18
2024-10-09