【LLM大模型】如何使用RAG构建准确率更高的AI代理

本教程展示了如何使用检索器从非结构化数据中提取上下文,同时调用 API 获取更多数据来构建代理。

译自 How To Build an AI Agent That Uses RAG To Increase Accuracy,作者 Janakiram MSV。

检索增强生成 (RAG) 和 函数调用 的结合可以极大地提高基于 LLM 的应用程序的功能。基于函数调用的 RAG 代理 结合了两种方法的优势,依赖于外部知识库进行准确的数据检索,并执行特定函数以高效地完成任务。

RAG 框架中的函数调用使检索过程更加结构化。例如,可以预定义一个函数,根据用户查询从综合知识库中提取特定信息,RAG 系统将从该知识库中检索信息。这种方法确保响应既相关又精确地满足应用程序的要求。

在这里插入图片描述

在本教程中,我们将构建一个代理,旨在帮助电子商务公司的产品经理分析销售和产品组合。它使用检索器从存储在 PDF 中的非结构化数据中提取上下文,同时调用 API 获取销售信息。

该代理可以访问一组工具和向量数据库。初始提示和注册的工具将发送到 LLM。如果 LLM 响应包含工具的子集,代理将执行它们并收集上下文。如果 LLM 不建议执行任何工具,代理将在向量数据库中执行语义搜索并检索上下文。无论从哪里收集上下文,它都将添加到原始提示中并发送到 LLM。

为了简化配置,我创建了一个 Docker Compose 文件来运行 MySQL 数据库和 Flask API 层。PDF 被单独索引并导入 ChromaDB。假设您有权访问 OpenAI 环境。

首先克隆 Git 仓库 并按照以下步骤在您的机器上配置代理。

代码语言:javascript

git clone https://github.com/janakiramm/rag-agent.git

第 1 步:启动数据库和 API 服务器

切换到 api 目录并运行 Docker Compose 文件以启动数据库和相应的 API 服务器。

代码语言:javascript

docker compose up -d --build

API 服务器公开了四个 API 端点:

  • get_top_selling_products
  • get_top_categories
  • get_sales_trends
  • get_revenue_by_category

您可以从 curl 调用这些端点。

代码语言:javascript

curl "http://localhost:5000/api/sales/top-products?start_date=2023-04-01&end_date=2023-06-30"

curl "http://localhost:5000/api/sales/top-categories?start_date=2023-04-01&end_date=2023-06-30"

curl "http://localhost:5000/api/sales/trends?start_date=2023-04-01&end_date=2023-06-30"

curl "http://localhost:5000/api/sales/revenue-by-category?start_date=2023-04-01&end_date=2023-06-30"

在这里插入图片描述

第 2 步:索引 PDF 并将向量存储在 Chroma DB 中

data 目录下,您会找到一个 PDF,其中包含电子产品类别中一些产品的描述。我们的任务是索引它并将嵌入向量存储在 Chroma 中。

在这里插入图片描述

为此,启动 Index-Datasheet Jupyter Notebook 并运行所有单元格。

在这里插入图片描述

这将加载 PDF,执行分块,生成嵌入,最后将向量存储在 ChromaDB 中。

此 Notebook 的最后一个单元格执行简单的语义搜索以验证索引过程。

在这里插入图片描述

现在,我们有两个可以帮助我们获取上下文的实体:1) API 和 2) 向量数据库。

第 3 步:运行 RAG 代理

代理代码在 RAG-Agent Jupyter Notebook 中可用。启动它并运行所有单元格以查看它的运行情况。

此 Notebook 包含决定执行工具还是执行语义搜索的逻辑。

我将 REST API 调用包装在 tools.py 中,该文件位于仓库的根目录中,我们将其导入代理。

代码语言:javascript

from tools import (
    get_top_selling_products,
    get_top_categories,
    get_sales_trends,
    get_revenue_by_category
)

由于我们决定从上一步执行的索引过程中持久化 Chroma 集合,我们将简单地加载它。

代码语言:javascript

chroma_client = chromadb.PersistentClient(path="./data")
embedding_function = embedding_functions.SentenceTransformerEmbeddingFunction(model_name="all-MiniLM-L6-v2")
collection = chroma_client.get_or_create_collection(name="products", embedding_function=embedding_function)

根据可用的工具,我们将它们与提示一起传递给 LLM 以进行映射。然后,LLM 会推荐要调用的正确函数。以下是 map_tools 函数中的部分代码片段。

代码语言:javascript

….
messages = [{"role": "user", "content": prompt}]
    response = llm.chat.completions.create(
        model=model,
        messages=messages,
        tools=tools,
        tool_choice="auto"
    )
    
    # Ensure response has valid tool_calls
    response_message = response.choices[0].message
    tool_calls = getattr(response_message, 'tool_calls', None)
 
    functions = []
    if tool_calls:
        for tool in tool_calls:
            function_name = tool.function.name
            arguments = json.loads(tool.function.arguments)
            functions.append({
                "function_name": function_name,
                "arguments": arguments
            })
 
    return functions

类似地,我们有一个检索器负责从向量数据库中提取上下文。

代码语言:javascript

def retriever(query):
    vector = embedding_function([query])
    results = collection.query(    
        query_embeddings=vector,
        n_results=5,
        include=["documents"]
    )
    res = " \n".join(str(item) for item in results['documents'][0])
    return res

我们有一个简单的辅助函数,用于将收集到的上下文和原始提示发送到 LLM。

代码语言:javascript

def generate_response(prompt,context):
    input_text = (
        "Based on the below context, respond with an accurate answer. If you don't find the answer within the context, say I do not know. Don't repeat the question\n\n"
        f"{context}\n\n"
        f"{prompt}"
    )
    response = llm.chat.completions.create(
        model= model,
        messages=[
            {"role": "user", "content": input_text},
        ],
        max_tokens=150,
        temperature=0
    )
 
    return response.choices[0].message.content.strip()

代理的工作是首先检查 LLM 是否推荐任何工具,然后执行这些工具以生成上下文。如果没有,它将依靠向量数据库来生成上下文。

代码语言:javascript

def agent(prompt):
    tools = map_tools(prompt)
    
    if tools:    
        tool_output = execute_tools(tools)
        context = json.dumps(tool_output)       
    else:
        context = retriever(prompt)
        
    response = generate_response(prompt, context)
    return response

在下面的屏幕截图中,第一个响应来自工具/API,第二个来自向量数据库。

在这里插入图片描述

扩展 RAG 代理以使用联邦语言模型

在这种情况下,我们依赖 OpenAI 的 GPT-4o 来映射函数调用并根据上下文生成最终响应。通过依赖联邦模型的概念,我们可以完全避免将上下文发送到基于云的 LLM,并使用部署在边缘的本地 LLM 来响应查询。

在我的下一篇文章(本系列的最后一部分)中,我们将看到如何将 RAG 代理的概念与联邦语言模型结合起来。

如何系统的去学习大模型LLM ?

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料 包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来

所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门+进阶学习资源包》,扫码获取~

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img
在这里插入图片描述

四、AI大模型商业化落地方案

img

阶段1:AI大模型时代的基础理解
  • 目标:了解AI大模型的基本概念、发展历程和核心原理。
  • 内容
    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
      - L1.4.1 知识大模型
      - L1.4.2 生产大模型
      - L1.4.3 模型工程方法论
      - L1.4.4 模型工程实践
    • L1.5 GPT应用案例
阶段2:AI大模型API应用开发工程
  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
  • 内容
    • L2.1 API接口
      - L2.1.1 OpenAI API接口
      - L2.1.2 Python接口接入
      - L2.1.3 BOT工具类框架
      - L2.1.4 代码示例
    • L2.2 Prompt框架
      - L2.2.1 什么是Prompt
      - L2.2.2 Prompt框架应用现状
      - L2.2.3 基于GPTAS的Prompt框架
      - L2.2.4 Prompt框架与Thought
      - L2.2.5 Prompt框架与提示词
    • L2.3 流水线工程
      - L2.3.1 流水线工程的概念
      - L2.3.2 流水线工程的优点
      - L2.3.3 流水线工程的应用
    • L2.4 总结与展望
阶段3:AI大模型应用架构实践
  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
  • 内容
    • L3.1 Agent模型框架
      - L3.1.1 Agent模型框架的设计理念
      - L3.1.2 Agent模型框架的核心组件
      - L3.1.3 Agent模型框架的实现细节
    • L3.2 MetaGPT
      - L3.2.1 MetaGPT的基本概念
      - L3.2.2 MetaGPT的工作原理
      - L3.2.3 MetaGPT的应用场景
    • L3.3 ChatGLM
      - L3.3.1 ChatGLM的特点
      - L3.3.2 ChatGLM的开发环境
      - L3.3.3 ChatGLM的使用示例
    • L3.4 LLAMA
      - L3.4.1 LLAMA的特点
      - L3.4.2 LLAMA的开发环境
      - L3.4.3 LLAMA的使用示例
    • L3.5 其他大模型介绍
阶段4:AI大模型私有化部署
  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
  • 内容
    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景
学习计划:
  • 阶段1:1-2个月,建立AI大模型的基础知识体系。
  • 阶段2:2-3个月,专注于API应用开发能力的提升。
  • 阶段3:3-4个月,深入实践AI大模型的应用架构和私有化部署。
  • 阶段4:4-5个月,专注于高级模型的应用和部署。
这份完整版的所有 ⚡️ 大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

全套 《LLM大模型入门+进阶学习资源包↓↓↓ 获取~

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值