对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

开始使用MongoDB Fireworks AI集成

您可以将MongoDB与 Fireworks AI集成,在开源模型上构建检索增强生成 ( RAG ) 应用程序。本教程使用 Voyage AI嵌入和重新排名示例数据,然后使用 Fireworks 聊天模型生成有依据的推荐。

在本教程中,您将执行以下任务:

  1. 设置您的环境。

  2. 使用 Voyage AI嵌入模型嵌入电影数据并将嵌入内容存储在MongoDB中。

  3. 使用MongoDB Vector Search 和 Voyage AI重排序模型来检索和重新排序电影文档。

  4. 指示 Fireworks 聊天模型根据重新排名的结果生成电影推荐。

Fireworks AI为培训和运行开源AI模型提供了一个平台。您可以使用MongoDB存储操作数据和内存数据,并针对特定使用案例重新训练模型。

RAG应用程序检索相关数据并将其作为上下文传递给聊天模型,因此该模型会根据您的数据进行回答,而不是仅依赖在培训期间所学的内容。在本教程中, MongoDB会存储和检索数据。 Voyage AI提供嵌入数据的嵌入模型和对检索结果重新排名的重排序模型,Fireworks AI提供生成最终响应的聊天模型。

要完成本教程,您必须具备以下资源:

  • 以下MongoDB 集群类型之一:

    • 运行 MongoDB 6.0.11 版本的 Atlas 集群,7.0.2或以上版本。确保您的 IP 地址 包含在 Atlas 项目的 访问列表 中。

    • 使用 Python 和 Docker 创建的本地 Atlas 部署。安装 atlas-local-lib-py (pip install atlas-local-lib-py),以编程方式创建和管理本地部署。要了解更多信息,请参阅 atlas-local-lib-py 存储库。

    • 安装了Search 和向量搜索的 MongoDB Community 集群。

  • 示例数据集已加载到集群中。本教程使用 sample_mflix.movies集合。

  • Fireworks AI API密钥。要创建密钥,请转到 Fireworks 帐户设置中的API密钥。

  • Voyage AI API密钥。要创建密钥,请参阅管理 Voyage AI模型API密钥。

  • Python v3.11 或更高版本。

  • uv.

在本部分中,您将通过创建虚拟环境、安装所需的依赖项、设置环境变量以及创建项目文件来准备环境。

1

从终端运行以下命令,创建名为 fireworks-mongodb-project 的新目录并启动虚拟环境:

mkdir fireworks-mongodb-projectcd fireworks-mongodb-projectuv venvsource .venv/bin/activate
2

从 fireworks-mongodb-project目录运行以下命令以安装所需的依赖项:

uv pip install pymongo openai voyageai python-dotenv
3

在您的 fireworks-mongodb-project 目录中,创建一个 .env 文件并添加以下代码:

FIREWORKS_API_KEY="<fireworks-api-key>"VOYAGE_API_KEY="<voyage-api-key>"MONGODB_URI="<connection-string>"

将 <fireworks-api-key> 替换为您的 Fireworks API密钥,并将 <voyage-api-key> 替换为您的 Voyage AI API密钥。

将 <connection-string> 替换为您的 Atlas 集群或本地部署的连接字符串。

连接字符串应使用以下格式:

mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

重要: 确保连接字符串包含数据库用户的凭证。要学习有关查找连接字符串的更多信息,请参阅通过客户端库连接到集群。

4

在 fireworks-mongodb-project目录中,创建名为 main.py 的文件。将以下代码添加到此文件以加载环境变量并定义两个命令行参数,它们指定搜索查询和结果数量:

import argparseimport osimport time import voyageaifrom dotenv import load_dotenvfrom openai import OpenAIfrom pymongo import MongoClientfrom pymongo.operations import SearchIndexModel load_dotenv() parser = argparse.ArgumentParser()parser.add_argument("--query", default="something interesting")parser.add_argument("--count", type=int, default=10)args = parser.parse_args()

在后续步骤中,您将向此文件添加代码,以嵌入电影数据、检索电影数据并生成响应。

在本部分中,您设立客户端,嵌入 50 电影文档的 plot字段,并将每个向量存储在新的 embedding字段中。然后,在该字段上创建MongoDB Vector Search索引。

1

将以下代码添加到 main.py文件,以创建 Fireworks客户端、Voyage AI客户端和MongoDB客户端,并选择模型:

fireworks = OpenAI( base_url="https://api.fireworks.ai/inference/v1", api_key=os.environ["FIREWORKS_API_KEY"],)voyage = voyageai.Client() mongo_client = MongoClient(os.environ["MONGODB_URI"])collection = mongo_client["sample_mflix"]["movies"] EMBEDDING_MODEL = "voyage-4"RERANK_MODEL = "rerank-3"CHAT_MODEL = "accounts/fireworks/models/gpt-oss-120b"DIMENSIONS = 1024

此示例选择以下模型:

  • voyage-4:Voyage AI嵌入模型,用于嵌入电影情节和搜索查询。

  • rerank-3:Voyage AI重排序模型,用于对MongoDB Vector Search 候选对象的相关性重新评分。

  • accounts/fireworks/models/gpt-oss-120b:Fireworks 聊天模型,用于根据MongoDB数据生成电影推荐。

注意

本教程从 Voyage AI嵌入模型请求 1024 维向量以减少存储。您可以使用任何 Voyage AI嵌入模型,只要 DIMENSIONS 值与模型返回的向量的大小相匹配。

2

将以下代码添加到 main.py文件,以将每部电影的情节嵌入 embedding字段:

def get_embeddings(texts, input_type="document"): response = voyage.embed( texts, model=EMBEDDING_MODEL, input_type=input_type, output_dimension=DIMENSIONS ) return response.embeddings docs = list( collection.find( {"plot": {"$exists": True, "$ne": ""}}, {"_id": 1, "title": 1, "plot": 1} ).limit(50)) vectors = get_embeddings([doc["plot"] for doc in docs]) for doc, vector in zip(docs, vectors): collection.update_one({"_id": doc["_id"]}, {"$set": {"embedding": vector}}) print(f"Embedded {len(docs)} movies.")
3

添加以下代码以在 embedding字段上创建MongoDB Vector Search索引,并等待索引完成构建:

index = SearchIndexModel( definition={ "fields": [ { "type": "vector", "path": "embedding", "numDimensions": DIMENSIONS, "similarity": "cosine", } ] }, name="movie_vector_index", type="vectorSearch",)collection.create_search_index(model=index) print("Waiting for the index to build...")while not any( idx.get("queryable") for idx in collection.list_search_indexes("movie_vector_index")): time.sleep(5) print("Index is ready.")

在本部分中,您将对文档的 plot字段运行MongoDB Vector Search查询并对结果重新排名。然后,将重新排名的电影作为上下文传递给 Fireworks 聊天模型,以生成推荐。

1

将以下代码添加到 main.py文件,以嵌入 plot字段查询,并检索情节与查询相似的电影:

def vector_search(query, limit=5): query_vector = get_embeddings([query], input_type="query")[0] pipeline = [ { "$vectorSearch": { "index": "movie_vector_index", "path": "embedding", "queryVector": query_vector, "numCandidates": limit * 20, "limit": limit, } }, { "$project": { "_id": 0, "title": 1, "plot": 1, "score": {"$meta": "vectorSearchScore"}, } }, ] return list(collection.aggregate(pipeline)) print("\nVector search results:")for movie in vector_search(args.query, limit=args.count): print(f'{movie["score"]:.3f} {movie["title"]}')
2

要提高MongoDB Vector Search 精度,检索更大的候选设立并使用 Voyage AI重排序器模型对其进行重排序,然后再将结果传递给聊天模型。将以下代码添加到 main.py文件中:

def rerank(query, movies, top_n=5): candidate_texts = [f'{m["title"]}: {m["plot"]}' for m in movies] reranking = voyage.rerank(query, candidate_texts, model=RERANK_MODEL, top_k=top_n) return [movies[result.index] for result in reranking.results] def retrieve(query, top_n=5): return rerank(query, vector_search(query, limit=top_n * 4), top_n=top_n) print("\nReranked, precise results:")for movie in retrieve(args.query, top_n=args.count): print(movie["title"])
3

将以下代码添加到您的 main.py文件中,将重新排名的电影作为上下文传递给 Fireworks 聊天模型,并指示该模型仅从该上下文进行回答:

def answer(question): context = "\n\n".join(f'{m["title"]}: {m["plot"]}' for m in retrieve(question)) response = fireworks.chat.completions.create( model=CHAT_MODEL, messages=[ { "role": "system", "content": "Answer using only the movies in the context. " "If the context doesn't contain the answer, say so.", }, { "role": "user", "content": f"Context:\n{context}\n\nQuestion: {question}", }, ], ) return response.choices[0].message.content print("\nRecommendation:")print(answer(f"Recommend a movie about {args.query}, and explain why."))

要运行main.py文件,请从 fireworks-mongodb-project目录运行以下命令。使用 --query 和 --count 标志指定搜索查询以及文件返回的结果数:

uv run main.py --query "a heist that goes wrong" --count 5

如果命令成功运行,输出如下所示。

Embedded 50 movies.Waiting for the index to build...Index is ready. Vector search results:0.724 I Became a Criminal0.664 Hallelujah0.662 Zoo in Budapest0.658 Rear Window0.654 The Long Voyage Home Reranked, precise results:I Became a CriminalHallelujahFoolish WivesZoo in BudapestA Corner in Wheat Recommendation:**I Became a Criminal** -- This gritty film-noir follows cynicalex-RAF flyer Morgan, who joins a break-in gang led by Narcy. Theirfirst job quickly turns disastrous when the getaway car crashesafter the crew accidentally kills a policeman. The movie centers ona heist that goes badly wrong, showcasing the chaos, moral fallout,and gritty consequences of a botched robbery.

要学习;了解有关 Fireworks 和 Voyage AI配置选项以及本教程中使用的方法的更多信息,请参阅将MongoDB与 Fireworks AI集成。

要构建记住其在MongoDB中的对话历史记录的工具调用代理,请参阅指定代理工具和持久代理内存。

要学习;了解有关 Fireworks AI 的更多信息,请参阅 Fireworks AI文档。

要学习;了解有关 Voyage AI 的更多信息,请参阅文本嵌入和重排序。