使用 LangChain、LangChain vector store、Groq llama3-70b-8192 和 nomic-embed-text-v1.5 构建 RAG 聊天机器人

什么是 RAG

检索增强生成(Retrieval-Augmented Generation,简称 RAG)正引领生成式 AI,尤其是对话式 AI 的新潮流。它将预训练的大语言模型(LLM,如 OpenAI 的 GPT)与存储于向量数据库(如 MilvusZilliz Cloud)中的外部知识源相结合,从而让模型输出更准确、更具上下文相关性,并且能够及时融合最新信息。 一个完整的 RAG 系统通常包含以下四大核心组件:

  • 向量数据库:用于存储与检索向量化后的知识;
  • 嵌入模型:将文本转为向量表示,为后续的相似度搜索提供支持;
  • 大语言模型(LLM):根据检索到的上下文和用户提问生成回答;
  • 框架:负责将上述组件串联成可用的应用。

核心组件说明

本教程将带你在 Python 环境下,借助以下组件一步步搭建一个初级的 RAG 聊天机器人:

  • LangChain: 一个开源框架,帮助你协调大语言模型、向量数据库、嵌入模型等之间的交互,使集成检索增强生成(RAG)管道变得更容易。
  • LangChain in-memory vector store: 一个内存型, 临时性 的向量存储,将嵌入数据存储在内存中,并通过精确的线性搜索找到最相似的嵌入。默认的相似度度量是余弦相似度,但可以更改为 ml-distance 支持的任何相似度度量。目前该存储仅适用于演示,不支持 ID 或删除操作。 (如果您需要为应用程序或企业项目提供更具扩展性的解决方案,我们推荐使用 Zilliz Cloud,这是一个基于开源项目 Milvus构建的全托管向量数据库服务,并提供支持最多 100 万个向量的免费套餐。)
  • Groq llama3-70b-8192: llama3-70b-8192模型是由Meta开发的大型语言模型,拥有700亿个参数和8,192个令牌的上下文窗口。该模型旨在用于一般语言任务,包括文本生成、摘要和翻译。专注于人工智能硬件和软件解决方案的公司Groq通过其API提供llama3-70b-8192模型。这一集成使开发者能够利用Groq的高性能语言处理单元(LPU)进行高效推理。Groq的LPU以其确定性的单核流式架构而闻名,为人工智能工作负载提供可预测和可重复的性能。
  • nomic-embed-text-v1.5: 该模型专注于生成高质量的文本嵌入,捕捉语义意义和上下文细微差别。其优势在于促进高效的相似性搜索和信息检索任务。非常适合在推荐系统、语义搜索和自然语言理解等应用中,提高各种NLP项目的性能。

完成本教程后,你将拥有一个能够基于自定义知识库回答问题的完整聊天机器人。

注意事项: 使用专有模型前请确保已获取有效 API 密钥。

实战:搭建 RAG 聊天机器人

第 1 步:安装并配置 LangChain

%pip install --quiet --upgrade langchain-text-splitters langchain-community langgraph

第 2 步:安装并配置 Groq llama3-70b-8192

pip install -qU "langchain[groq]"
import getpass
import os

if not os.environ.get("GROQ_API_KEY"):
  os.environ["GROQ_API_KEY"] = getpass.getpass("Enter API key for Groq: ")

from langchain.chat_models import init_chat_model

llm = init_chat_model("llama3-8b-8192", model_provider="groq")

第 3 步:安装并配置 nomic-embed-text-v1.5

pip install -qU langchain-nomic
import getpass
import os

if not os.environ.get("NOMIC_API_KEY"):
  os.environ["NOMIC_API_KEY"] = getpass.getpass("Enter API key for Nomic: ")

from langchain_nomic import NomicEmbeddings

embeddings = NomicEmbeddings(model="nomic-embed-text-v1.5")

第 4 步:安装并配置 LangChain vector store

pip install -qU langchain-core
from langchain_core.vectorstores import InMemoryVectorStore

vector_store = InMemoryVectorStore(embeddings)

第 5 步:正式构建 RAG 聊天机器人

在设置好所有组件之后,我们来搭建一个简单的聊天机器人。我们将使用 Milvus介绍文档 作为私有知识库。你可以用你自己的数据集替换它,来定制你自己的 RAG 聊天机器人。

import bs4
from langchain import hub
from langchain_community.document_loaders import WebBaseLoader
from langchain_core.documents import Document
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langgraph.graph import START, StateGraph
from typing_extensions import List, TypedDict

# 加载并拆分博客内容
loader = WebBaseLoader(
    web_paths=("https://milvus.io/docs/overview.md",),
    bs_kwargs=dict(
        parse_only=bs4.SoupStrainer(
            class_=("doc-style doc-post-content")
        )
    ),
)

docs = loader.load()

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
all_splits = text_splitter.split_documents(docs)

# 索引分块
_ = vector_store.add_documents(documents=all_splits)

# Define prompt for question-answering
prompt = hub.pull("rlm/rag-prompt")


# 定义应用状态
class State(TypedDict):
    question: str
    context: List[Document]
    answer: str


# 定义应用步骤
def retrieve(state: State):
    retrieved_docs = vector_store.similarity_search(state["question"])
    return {"context": retrieved_docs}


def generate(state: State):
    docs_content = "\n\n".join(doc.page_content for doc in state["context"])
    messages = prompt.invoke({"question": state["question"], "context": docs_content})
    response = llm.invoke(messages)
    return {"answer": response.content}


# 编译应用并测试
graph_builder = StateGraph(State).add_sequence([retrieve, generate])
graph_builder.add_edge(START, "retrieve")
graph = graph_builder.compile()

测试聊天机器人

Yeah! You've built your own chatbot. Let's ask the chatbot a question.

response = graph.invoke({"question": "What data types does Milvus support?"})
print(response["answer"])

示例输出

Milvus 支持多种数据类型,包括稀疏向量、二进制向量、JSON 和数组。此外,它还支持常见的数值类型和字符类型,使其能够满足不同的数据建模需求。这使得用户能够高效地管理非结构化或多模态数据。

优化小贴士

在搭建 RAG 系统时,合理调优能显著提升性能与效率。下面为各组件提供一些实用建议:

LangChain 优化建议

为了优化 LangChain,需要通过高效地构建链路和代理来减少工作流程中的冗余操作。使用缓存避免重复计算,从而加快系统速度,并尝试采用模块化设计,确保模型或数据库等组件能够轻松替换。这将提供灵活性和效率,使您能够快速扩展系统,而无需不必要的延迟或复杂性。

LangChain in-memory vector store 优化建议

LangChain 内存型向量存储只是一个临时性的向量存储,它将嵌入数据存储在内存中,并进行精确的线性搜索以找到最相似的嵌入。它的功能非常有限,仅适用于演示。如果您计划构建一个功能完整甚至生产级的解决方案,我们推荐使用 Zilliz Cloud,这是一个基于开源项目 Milvus构建的全托管向量数据库服务,并提供支持最多 100 万个向量的免费套餐。)

Groq llama3-70b-8192 优化建议

为了在检索增强生成(RAG)系统中优化 Groq llama3-70b-8192,重点关注高效的批处理,以通过将多个请求组合在一起来最大化吞吐量。利用混合精度进行更快速的计算,同时保持模型的准确性,并调整输入序列长度,以在上下文丰富性和计算效率之间取得平衡。利用模型并行性将工作负载分配到多个处理单元,以确保可扩展性。定期监控 GPU 利用率,并通过释放未使用的张量来有效管理内存,以防止瓶颈。对特定任务或领域进行模型微调,以提高准确性并减少推理时间。此外,考虑修剪或量化某些层,以在不太影响模型输出质量的情况下优化生产级任务的性能。

nomic-embed-text-v1.5 优化建议

nomic-embed-text-v1.5 是一个全面的嵌入模型,在各种文本检索场景中表现出色。在进行嵌入之前,优化文本预处理,去除停用词和冗余信息,以提高存储效率。使用层级索引结构管理大规模数据集中的嵌入,提高检索速度。利用余弦相似度过滤在查询后细化搜索结果。为了实现经济高效的扩展,一次对多个文档进行批量嵌入,并将嵌入存储在像 Milvus 或 FAISS 这样的分布式向量数据库中。如果处理快速变化的数据,实施增量索引而不是完全重新处理,以节省计算时间。定期通过与基准数据集验证,监测嵌入质量以确保相关性。

通过系统性实施这些优化方案,RAG 系统将在响应速度、结果准确率、资源利用率等维度获得全面提升。 AI 技术迭代迅速,建议定期进行压力测试与架构调优,持续跟踪最新优化方案,确保系统在技术发展中始终保持竞争优势。

RAG 成本计算器

估算 RAG 成本时,需要分析向量存储、计算资源和 API 使用等方面的开销。主要成本驱动因素包括向量数据库查询、嵌入生成和 LLM 推理。RAG 成本计算器是一款免费的在线工具,可快速估算构建 RAG 的费用,涵盖切块(chunking)、嵌入、向量存储/搜索和 LLM 生成。能帮助你发现节省费用的机会,最高可通过无服务器方案在向量存储成本上实现 10 倍降本。

立即使用 RAG 成本计算器

Calculate your RAG cost Calculate your RAG cost

收获与总结

通过深入学习本教程,你已经解锁了从零开始构建现代 RAG 系统的强大能力!你了解到 LangChain 如何充当粘合剂, seamlessly orchestrating workflows between components,像是 LangChain 向量存储用于快速检索,Groq 的极速 Llama3-70B-8192 用于生成类人文本,以及 nomic-embed-text-v1.5 用于将原始数据转换为丰富的、可搜索的嵌入。每个组成部分都扮演着至关重要的角色:LangChain 简化了管道设计,向量存储组织知识以便即时访问,LLM 生成上下文相关的响应,而嵌入模型确保你的数据在语义上被理解。在此过程中,你学习了如何优化性能——比如调整数据块大小,平衡速度与准确性,甚至你还亲自使用像免费的 RAG 成本计算器这样的工具,以便做出明智而经济的决策。这不仅仅是理论;你已经看到这些工具是如何 实际 协同工作的,将非结构化数据转化为动态、智能的应用程序!

现在,带着这些知识,你已经准备好创建几乎神奇的 RAG 系统。想象一下拉取实时见解的聊天机器人、理解细微差别的搜索引擎,或是即时调整的个性化内容生成器——你的创意是唯一的限制!本教程为你提供了蓝图,但 赋予了它创造力。尝试不同的模型,调整参数,探索混合方法。请记住,你所做的每一个优化和整合的每一个数据集,都是在推动可能性的界限。所以,尽管去——构建一些大胆的东西,与世界分享,看看你的 RAG 驱动解决方案如何改变人们与信息的互动。AI 的未来是协作的、迭代的,并且令人兴奋。你的旅程从现在开始——让我们一起创新吧! 🚀

欢迎反馈!

我们很期待听到你的使用心得与建议! 🌟 你可以:

  • 在下方留言;
  • 加入 Milvus Discord 社区,与全球 AI 爱好者一起交流。 如果你觉得本教程对你有帮助,别忘了给 Milvus GitHub 仓库点个 ⭐,这将激励我们不断创作!💖

大规模向量数据库

Zilliz Cloud 是一个专为大规模应用构建的全托管向量数据库,完美适配您的 RAG 应用。

免费试用 Zilliz Cloud

继续阅读

AI Assistant