基于 LlamaIndex、Claude-3.5 Sonnet 和 MongoDB,构建具有超级检索能力的智能体

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。

针对大模型技术趋势、算法项目落地经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。

总结链接如下:

  • 《大模型面试宝典》(2024版) 正式发布

喜欢本文记得收藏、关注、点赞。更多实战和面试交流,文末加入我们


想象一下,AI 助手可以无缝地与你互动,动态地根据你的需求检索信息并完成任务。随着智能体检索增强生成(RAG)的兴起,这一愿景正逐渐成为现实。

在本文中,我们将深入探讨这个令人兴奋的领域,探索如何利用强大的工具组合:LlamaIndex、Claude-3.5 Sonnet 和 MongoDB 来创建具有检索超级能力的 AI 智能体。

图片

工具集成

让我们看看如何将这些强大的工具结合在一起:

  • LlamaIndex:这个先进的搜索引擎擅长基于意义而不是关键词查找相似信息。它充当 AI 智能体的“眼睛”,在海量信息中定位最相关的数据。

  • Claude-3.5 Sonnet:它允许智能体处理 LlamaIndex 检索到的信息,生成响应。

  • MongoDB:一个强大的 NoSQL 数据库,MongoDB 在存储和管理支持 AI 智能体的知识库中起着关键作用。其灵活性允许存储各种数据类型,使其成为复杂信息检索任务的理想选择。

集成优势

这种协同作用带来了许多好处:

  • 增强的信息检索:LlamaIndex 的向量搜索功能确保 AI 智能体检索到最相关的信息,即使是细微的查询也不例外。

  • 动态任务完成:Claude-3.5 Sonnet 使 AI 智能体能够分析检索到的数据并采取适当的行动,使其真正成为能够独立行动的智能体。

  • 可扩展性和灵活性:MongoDB 处理大型数据集的能力允许系统随着信息需求的增加而增长。

代码实现

让我们深入研究使用 LlamaIndex、Claude-3.5 Sonnet 和 MongoDB 的智能体 RAG。

第一步:安装库

!pip install --quiet llama-index  # main llamaindex library
!pip install --quiet llama-index-vector-stores-MongoDB # mongodb vector database
!pip install --quiet llama-index-llms-anthropic # anthropic LLM provider
!pip install --quiet llama-index-embeddings-openai # openai embedding provider
!pip install --quiet pymongo pandas datasets # others

第二步:设置环境变量

import os
os.environ["ANTHROPIC_API_KEY"] = ""
os.environ["HF_TOKEN"] = ""
os.environ["OPENAI_API_KEY"] = ""
# WARNING: Never commit API keys or sensitive information to public repositories

LLM 和嵌入模型配置

from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.llms.anthropic import Anthropic
from llama_index.core import Settings

llm = Anthropic(model="claude-3-5-sonnet-20240620")

embed_model = OpenAIEmbedding(
    model="text-embedding-3-small", 
    dimensions=256,
    embed_batch_size=10, 
    openai_api_key=os.environ["OPENAI_API_KEY"]
)

Settings.embed_model = embed_model
Settings.llm = llm

第三步:数据加载和处理

from datasets import load_dataset
import pandas as pd

# https://huggingface.co/datasets/MongoDB/airbnb_embeddings
dataset = load_dataset("MongoDB/airbnb_embeddings", split="train", streaming=True)
dataset = dataset.take(4000)

# Convert the dataset to a pandas dataframe
dataset_df = pd.DataFrame(dataset)

# Dataset comes with embeddings created with OpenAI, but we will recreate new ones
dataset_df = dataset_df.drop(columns=['text_embeddings'])
dataset_df.head(5)

第四步:生成嵌入

import json
from llama_index.core import Document
from llama_index.core.schema import MetadataMode

documents_json = dataset_df.to_json(orient='records')
documents_list = json.loads(documents_json)

llama_documents = []

for document in documents_list:
    # Convert complex objects to JSON strings
    for field in ["amenities", "images", "host", "address", "availability", "review_scores", "reviews", "image_embeddings"]:
        document[field] = json.dumps(document[field])

    # Create a Document object
    llama_document = Document(
        text=document["description"],
        metadata=document,
        excluded_llm_metadata_keys=["_id", "transit", "minimum_nights", "maximum_nights", "cancellation_policy", "last_scraped", "calendar_last_scraped", "first_review", "last_review", "security_deposit", "cleaning_fee", "guests_included", "host", "availability", "reviews", "image_embeddings"],
        excluded_embed_metadata_keys=["_id", "transit", "minimum_nights", "maximum_nights", "cancellation_policy", "last_scraped", "calendar_last_scraped", "first_review", "last_review", "security_deposit", "cleaning_fee", "guests_included", "host", "availability", "reviews", "image_embeddings"],
        metadata_template="{key}=>{value}",
        text_template="Metadata: {metadata_str}\n-----\nContent: {content}",
    )
    llama_documents.append(llama_document)

# Observing input examples
print("\nThe LLM sees this: \n", llama_documents[0].get_content(metadata_mode=MetadataMode.LLM))
print("\nThe Embedding model sees this: \n", llama_documents[0].get_content(metadata_mode=MetadataMode.EMBED))
from llama_index.core.node_parser import SentenceSplitter, SemanticSplitterNodeParser
from llama_index.core.schema import MetadataMode
from tqdm import tqdm

# semantic_splitter = SemanticSplitterNodeParser(
#     buffer_size=10, breakpoint_percentile_threshold=95, embed_model=embed_model
# )

base_splitter = SentenceSplitter(chunk_size=5000, chunk_overlap=200)

nodes = base_splitter.get_nodes_from_documents(llama_documents)

# Progress bar
pbar = tqdm(total=len(nodes), desc="Embedding Progress", unit="node")

for node in nodes:
    node_embedding = embed_model.get_text_embedding(
        node.get_content(metadata_mode=MetadataMode.EMBED)
    )
    node.embedding = node_embedding
    
    # Update the progress bar
    pbar.update(1)

# Close the progress bar
pbar.close()

print("Embedding process completed!")

第五步:MongoDB 设置

import pymongo

os.environ["MONGO_URI"] = ""

def get_mongo_client(mongo_uri):
    """Establish and validate connection to the MongoDB."""
    
    client = pymongo.MongoClient(mongo_uri, appname="devrel.showcase.python")

    # Validate the connection
    ping_result = client.admin.command('ping')
    if ping_result.get('ok') == 1.0:
        # Connection successful
        print("Connection to MongoDB successful")
        return client
    else:
        print("Connection to MongoDB failed")
    return None


mongo_client = get_mongo_client(mongo_uri)

DB_NAME = "airbnb"
COLLECTION_NAME = "listings_reviews"

db = mongo_client.get_database(DB_NAME)
collection = db.get_collection(COLLECTION_NAME)

第六步:向量数据库集成

from llama_index.vector_stores.mongodb import MongoDBAtlasVectorSearch

vector_store = MongoDBAtlasVectorSearch(
    mongo_client, 
    db_name=DB_NAME, 
    collection_name=COLLECTION_NAME, 
    index_name="vector_index"
)

vector_store.add(nodes)

第七步:创建检索工具和智能体

from llama_index.core import VectorStoreIndex
from llama_index.core.tools import QueryEngineTool, ToolMetadata
from llama_index.core.agent import FunctionCallingAgentWorker

index = VectorStoreIndex.from_vector_store(vector_store)
query_engine = index.as_query_engine(similarity_top_k=5, llm=llm)

query_engine_tool = QueryEngineTool(
    query_engine=query_engine,
    metadata=ToolMetadata(
        name="knowledge_base",
        description=(
            "Provides information about Airbnb listings and reviews."
            "Use a detailed plain text question as input to the tool."
        ),
    ),
)

agent_worker = FunctionCallingAgentWorker.from_tools(
    [query_engine_tool], llm=llm, verbose=True
)
agent = agent_worker.as_agent()

response = agent.chat("Tell me the best listing for a place in New York")
print(str(response))

结论

LlamaIndex、Claude-3.5 Sonnet 和 MongoDB 共同构建的智能体 RAG 未来充满可能性。

资料获取和交流

技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

成立了大模型算法技术交流群,相关资料、技术交流&答疑,均可加我们的交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2040,备注:来自CSDN + 技术交流

通俗易懂讲解大模型系列

  • 重磅消息!《大模型面试宝典》(2024版) 正式发布!

  • 重磅消息!《大模型实战宝典》(2024版) 正式发布!

  • 做大模型也有1年多了,聊聊这段时间的感悟!

  • 用通俗易懂的方式讲解:大模型算法工程师最全面试题汇总

  • 用通俗易懂的方式讲解:不要再苦苦寻觅了!AI 大模型面试指南(含答案)的最全总结来了!

  • 用通俗易懂的方式讲解:我的大模型岗位面试总结:共24家,9个offer

  • 用通俗易懂的方式讲解:大模型 RAG 在 LangChain 中的应用实战

  • 用通俗易懂的方式讲解:ChatGPT 开放的多模态的DALL-E 3功能,好玩到停不下来!

  • 用通俗易懂的方式讲解:基于扩散模型(Diffusion),文生图 AnyText 的效果太棒了

  • 用通俗易懂的方式讲解:在 CPU 服务器上部署 ChatGLM3-6B 模型

  • 用通俗易懂的方式讲解:ChatGLM3-6B 部署指南

  • 用通俗易懂的方式讲解:使用 LangChain 封装自定义的 LLM,太棒了

  • 用通俗易懂的方式讲解:基于 Langchain 和 ChatChat 部署本地知识库问答系统

  • 用通俗易懂的方式讲解:Llama2 部署讲解及试用方式

  • 用通俗易懂的方式讲解:一份保姆级的 Stable Diffusion 部署教程,开启你的炼丹之路

  • 用通俗易懂的方式讲解:LlamaIndex 官方发布高清大图,纵览高级 RAG技术

  • 用通俗易懂的方式讲解:为什么大模型 Advanced RAG 方法对于AI的未来至关重要?

  • 用通俗易懂的方式讲解:基于 Langchain 框架,利用 MongoDB 矢量搜索实现大模型 RAG 高级检索方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/784170.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day1--每日一练

🍁 个人主页:爱编程的Tom💫 本篇博文收录专栏:每日一练-算法篇👉 目前其它专栏:c系列小游戏 c语言系列--万物的开始_ Java专栏等 🎉 欢迎 👍点赞✍评论⭐收藏&…

Java之父James Gosling宣布正式退休 创造无数人的饭碗

编程语言Java的创始人,被誉为“Java之父”的James Gosling,近日在社交媒体上宣布了自己正式退休的消息。Gosling表示:“我终于退休了。做了这么多年的软件工程师,现在是时候享受人生了。”他透露,在亚马逊的过去7年是非…

代码随想录算法训练营第四十七天|1143.最长公共子序列、 1035.不相交的线、53. 最大子序和、392.判断子序列

1143.最长公共子序列 题目链接:1143.最长公共子序列 文档讲解:代码随想录 状态:一开始没想明白为啥要 max(dp[i - 1][j], dp[i][j - 1]) 思路: 如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素&#xff…

GitLab介绍,以及add an SSH key

GitLab GitLab 是一个用于仓库管理系统的开源项目,现今并在国内外大中型互联网公司广泛使用。 git,gitlab,github区别 git 是一种基于命令的版本控制系统,全命令操作,没有可视化界面; gitlab 是一个基于git实现的在线代码仓库…

K8s驱逐场景以及规避方案参考 —— 筑梦之路

Pod 驱逐分为两种情况: 较安全驱逐 & 提高稳定性的良性驱逐 API 发起驱逐,典型案例:kubectl drain Node Not Ready 时,Controller Manager 发起的驱逐 有风险的驱逐 节点压力驱逐 节点磁盘空间不足、内存不足 或 Pid 不足&…

简易Qt串口助手

界面显示如下 关于串口类 初始化 设置串口号 设置波特率 打开串口 发送按钮功能实现 接收数据显示在控件中 关闭串口

Vortex GPGPU的硬件设计和代码结构分析

文章目录 前言一、GPGPU是什么?1.1 GPU和GPGPU之间的差异1.2 GPU和CPU之间的集成方式1.3 GPU包含什么(列举和VMIPS向量体系结构的差异) 二、Vortex GPGPU是什么?2.1 Vortex GPGPU的技术边界和验证环境2.2 Vortex GPGPU的指令集设计…

30万的剧本杀店 被“好色”店长玩死了

文|琥珀食酒社 作者 | 朱珀 对开店搞钱的人来讲 什么才是最苦逼的? 不是一开始生意就不行 而是刚开始好到不行 最后只剩下不行 本期投稿的主人公糊糊 就是这样的 苦逼大BOSS 30万开剧本杀店 短短几个月 从巅峰跌到谷底 被捞钱又好色的猪队友…

C++ 类和对象 拷贝构造函数

一 拷贝构造函数的概念: 拷贝构造函数是一种特殊的构造函数,用于创建一个对象是另一个对象的副本。当需要用一个已存在的对象来初始化一个新对象时,或者将对象传递给函数或从函数返回对象时,会调用拷贝构造函数。 二 拷贝构造函…

LabVIEW高能质子束流密度分布测试系统

LabVIEW平台开发的高能质子束流密度分布测试系统。该系统主要应用于电子器件的抗辐射加固试验,旨在精确测量高能质子束的密度分布,以评估电子器件在辐射环境下的性能表现和耐受能力。 系统组成与设计 硬件组成: 法拉第杯探测器:…

自动化测试高级控件交互方法:TouchAction、触屏操作、点按,双击,滑动,手势解锁!

在自动化测试领域中,TouchAction 是一种非常强大的工具,它允许我们模拟用户在设备屏幕上的各种触摸事件。这种模拟不仅限于简单的点击操作,还包括滑动、长按、多点触控等复杂的手势。 点按与双击 点按和双击是触屏设备上最基本的操作之一。…

数据库图形化管理界面应用 Navicat Premium 使用教程

经同学介绍的一个把数据库可视化的软件Navicat Premium,很好用,在这里分享一下,需要的同学可以去了解看看 一:下载并解压 链接:https://pan.baidu.com/s/1ZcDH6m7EAurAp_QmXWx81A 提取码:e5f6 解压到合…

景芯SoC训练营DFT debug

景芯训练营VIP学员在实践课上遇到个DFT C1 violation,导致check_design_rule无法通过,具体报错如下: 遇到这个问题第一反映一定是确认时钟,于是小编让学员去排查add_clock是否指定了时钟,指定的时钟位置是否正确。 景芯…

Redis原理-数据结构

Redis原理篇 1、原理篇-Redis数据结构 1.1 Redis数据结构-动态字符串 我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 不过Redis没有直接使用C语言中的字符串,因为C语言字符串存…

【操作系统】进程管理——进程的同步与互斥(个人笔记)

学习日期:2024.7.8 内容摘要:进程同步/互斥的概念和意义,基于软/硬件的实现方法 进程同步与互斥的概念和意义 为什么要有进程同步机制? 回顾:在《进程管理》第一章中,我们学习了进程具有异步性的特征&am…

Apache AGE中的图

图由一组点和边组成,其中每个节点和边都具有属性映射。点是图的基本对象,可以独立于图中的其他任何对象存在。边创建了两个点之间的有向连接。 创建图 要创建图,可以使用 ag_catalog 命名空间中的 create_graph 函数。 create_graph() 语法…

C++进阶-二叉树进阶(二叉搜索树)

1. 二叉搜索树 1.1 二叉搜索树概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值2.若它的右子树不为空,则右子树上所有节点的值都大于…

Jenkins教程-15-常用插件-Blue Ocean

上一小节我们学习了Jenkins定时任务构建的方法,本小节我们讲解一下Jenkins常用插件Blue Ocean的使用方法。 Blue Ocean 提供了一套可视化操作界面来帮助创建、编辑 Pipeline 任务。 Blue Ocean 特性: 流水线编辑器:用于创建贯穿始终的持续交…

一、redis-万字长文读懂redis

高性能分布式缓存Redis `第一篇章`1.1缓存发展史&缓存分类1.1.1 大型网站中缓存的使用带来的问题1.1.2 常见缓存的分类及对比与memcache对比1.2 数据类型选择&应用场景1.2.1 string1.2.2 hash1.2.3 链表1.2.4 set1.2.5 sortedset有序集合类型1.2.6 总结1.3 Redis高级应…

mysql在linux系统下重置root密码

mysql在linux系统下重置root密码 登录服务器时候mysql密码忘记了,没办法只能重置,找了一圈,把行之有效的方法介绍在这里。 错误展示: 我还以为yes就可以了呢,这是不行的意思。 关掉mysql服务 sudo systemctl stop …