MongoDB Fireworks AI 와 통합하여 오픈 소스 모델에서RAG(검색 강화 생성) 애플리케이션을 빌드 할 수 있습니다. 이 튜토리얼에서는 Voyage AI 사용하여 샘플 데이터를 포함하고 순위를 재지정한 다음, Fireworks 채팅 모델을 사용하여 근거 있는 추천을 생성합니다.
이 튜토리얼에서는 다음 작업을 수행합니다.
환경을 설정합니다.
Voyage AI 임베딩 모델을 사용하여 영화 데이터를 임베딩하고 MongoDB 에 저장 .
MongoDB Vector Search 및 Voyage AI reranker 모델을 사용하여 영화 문서를 조회 하고 순위를 재지정합니다.
재지정된 결과를 기반으로 영화 추천을 생성하도록 Fireworks 채팅 모델을 지시합니다.
배경
Fireworks AI 오픈 소스 AI 모델을 교육 하고 실행 수 있는 플랫폼을 제공합니다. MongoDB 사용하여 운영 및 메모리 데이터를 저장 하고 특정 사용 사례에 맞게 모델을 다시 교육할 수 있습니다.
RAG 애플리케이션 관련 데이터를 검색하여 채팅 모델에 컨텍스트로 전달하므로 모델은 교육 과정에서 학습한 내용에만 의존하지 않고 데이터에서 응답합니다. 이 튜토리얼에서는 MongoDB 데이터를 저장하고 검색합니다. Voyage AI 데이터를 임베딩하는 임베딩 모델과 조회된 결과의 순위를 재지정하는 reranker 모델을 제공하며, Fireworks AI 최종 응답을 생성하는 채팅 모델을 제공합니다.
전제 조건
이 튜토리얼을 완료하려면 다음 리소스가 있어야 합니다:
다음 MongoDB cluster 유형 중 하나입니다.
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 리포지토리를 참조하십시오.검색 및 벡터 검색이 설치된 MongoDB Community 클러스터.
클러스터 에 로드된 샘플 데이터 세트. 이 튜토리얼에서는
sample_mflix.movies컬렉션 사용합니다.Fireworks AI API 키입니다. 키를 만들려면 Fireworks 계정 설정의 API 키로 이동합니다.
Voyage AI API 키입니다. 키를 만들려면 Voyage AI 모델 API 키 관리를 참조하세요.
Python v3.11 이상.
환경 설정
이 섹션에서는 가상 환경을 만들고, 필요한 종속성을 설치하고, 환경 변수를 설정하고, 프로젝트 파일 만들어 환경을 준비합니다.
환경 변수를 설정합니다.
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 클러스터 또는 로컬 Atlas 배포서버의 연결 문자열로 교체합니다.
연결 문자열은 다음 형식을 사용해야 합니다.
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net중요한: 연결 문자열 에 데이터베이스 사용자의 자격 증명 포함되어 있는지 확인하세요. 연결 문자열 찾는 방법에 대해 자세히 학습하려면 클라이언트 라이브러리를 통해 클러스터에 연결하기를 참조하세요.
연결 문자열은 다음 형식을 사용해야 합니다.
mongodb://localhost:<port-number>/?directConnection=true학습 내용은 연결 문자열을 참조하세요.
프로젝트 파일 만들기
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 인덱스 생성합니다.
필요한 클라이언트를 생성합니다.
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: MongoDB Vector Search 후보의 관련성을 다시 평가하는 데 사용되는 Voyage AI reranker 모델입니다.accounts/fireworks/models/gpt-oss-120b: MongoDB 데이터를 기반으로 영화 추천을 생성하는 데 사용되는 Fireworks 채팅 모델입니다.
참고
이 튜토리얼에서는 저장 줄이기 위해 Voyage AI 임베딩 모델에서 1024차원 벡터를 요청합니다. DIMENSIONS 값이 모델이 반환하는 벡터의 크기와 일치하는 한 모든 Voyage AI 임베딩 모델을 사용할 수 있습니다.
임베딩을 생성하고 저장 .
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.")MongoDB Vector Search 인덱스 생성합니다.
다음 코드를 추가하여 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 채팅 모델에 컨텍스트로 전달하여 추천을 생성합니다.
MongoDB Vector Search 쿼리 실행합니다.
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"]}')결과의 순위를 다시 매깁니다.
MongoDB Vector Search의 정밀도를 높이려면 결과를 채팅 모델에 전달하기 전에 더 큰 후보 설정하다 조회 하고Voyage AI reranker 모델을 사용하여 순위를 재지정합니다. 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"])응답을 생성합니다.
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 설명서를 참조하세요.