2024年企业内部聊天记录RAG知识库高效构建指南
摘要
基于MilvusLite向量数据库与JinaAI的Embedding及Reranker模型,从企业内部聊天记录构建检索增强生
项目经理小李临时接手了一项新业务,但对公司在该领域的最新动态与产品设计逻辑几乎毫无头绪。翻文档、问同事,获取的信息总是零碎且滞后。实际上,企业内部那些真正有洞察力的进展与技术难题,大多隐没在员工日常沟通的聊天记录中。
本文将以 Milvus Lite 向量数据库和 Jina AI 模型为例,演示如何从企业聊天记录中构建一套知识库式的检索增强生成(RAG)系统。Milvus Lite 是一款轻量化向量数据库,可在本地直接运行;Jina AI 提供支持长上下文窗口的 Embedding 与 Reranker 模型,能将非结构化文本高效转为向量,从而实现语义检索。
我们使用虚构的企业内部聊天记录数据集搭建 RAG 应用原型。员工可通过自然语言查询内部知识,快速获取完整对话信息,消除项目信息不对称,提升工作效率。
Milvus Lite、Jina Embeddings 与 Jina Reranker 功能解析
Milvus Lite 是向量数据库 Milvus 的轻量版,与 Milvus 共享同一套 API。只需一行 pip 命令即可安装,无需单独部署服务器。
Milvus 的 Python SDK——pymilvus,内置了 Jina Embeddings v2 与 Jina Reranker v1。开发者可以借助同一 Python 客户端部署 Milvus Lite 并直接调用 Jina Embeddings,将文档转换为 Embedding 向量。
Jina Embeddings v2 支持 8192 token 上下文窗口,具备多语言能力,能对文本语义进行深度编码,确保高精度检索。在 Pipeline 中加入 Jina Reranker v1,可进一步排序优化搜索结果,提升答案的准确性与语义丰富度。
Milvus 与 Jina AI 模型的实际落地
本教程将 step by step 演示如何构建一个实际应用,基于企业聊天记录为用户查询生成最相关的答复。

这套方案完全可投入生产环境。例如,公司员工可直接向聊天机器人提问“AI 训练流程”这类业务问题。
Jina Embeddings、Jina Reranker 和 Milvus 协同工作,使聊天机器人精准定位聊天记录中的核心信息,输出高准确度的答案。这类聊天机器人能显著提升公司生产力,大幅降低员工信息获取成本。
回答生成环节借助 HuggingFace 与 LangChain 集成,使用 Mixtral 7B Instruct 模型。若想完整复现教程,需提前创建 HuggingFace token。
1. 数据集概览
本教程采用 GPT-4 生成的模拟数据集,模拟了一家 AI 初创公司在 Slack 频道上的聊天记录。
数据以 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(MessageID)
- 若消息为子话题,则包含父消息 ID(Parent Message ID)

2. 环境配置
开始前,先安装所需组件与工具。
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 官网申请。
import os
import getpass
os.environ["JINAAI_API_KEY"] = getpass.getpass(prompt="Jina AI API Key: ")
同理,设置 HuggingFace token。请确保 token 权限为 READ,且可访问 Hugging Face Hub。
os.environ["HUGGINGFACEHUB_API_TOKEN"] = getpass.getpass(prompt="Hugging Face Token: ")
3. 创建 Milvus Collection
首先创建一个 Milvus Collection,用于存储数据并建立索引。
from pymilvus import MilvusClient, DataType
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)
4. 数据准备
解析聊天记录并提取元数据。
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)
5. 将聊天数据转为 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)
6. 为聊天数据建立索引
将消息、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)
7. 查询聊天记录
输入问题:“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 = """
[INST] Context information is below.
It includes the five most relevant messages to the query, sorted based on their relevance to the query.
---------------------
{context_str}
---------------------
Given the context information and not prior knowledge, answer the query. Please be brief, concise, and complete.
If the context information does not contain an answer to the query, respond with "No information".
Query: {query_str}[/INST] """
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"nnANSWER:nn{answer}")
获得的答案如下:
"Based on the context information, User5 seems to be the most knowledgeable about encryption protocols in your team. They ha ve mentioned that the new protocols enhance data security significantly, especially for cloud deployments."
如需验证答案的准确性,可查阅 chat_history.json 中的原始聊天记录。结果证实,User5 确实是团队中最熟悉加密协议的成员。
总结
本文完整分享了如何基于 Slack 聊天记录搭建 RAG 问答机器人,涵盖 Milvus 配置、Jina Embeddings v2 向量化聊天记录、Jina Reranker v1 结果排序等核心步骤。
Milvus Lite 集成 Jina Embeddings 与 Reranker,为开发者提供了一条端到端的数据处理管线。仅需几行代码,即可快速部署上线。
来源:互联网
本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。