RAG with MongoDB / Create a RAG Application
Code Summary: Answer Generation
In the final step of building our RAG system, we'll create the answer generation component and put together the entire RAG system. Follow the steps below or you can fork the code from the Curriculum GitHub repository. As a more advanced step, you can use your own source of data and construct your own questions which suit that data.
Prerequisites
- Atlas Cluster Connection String
- OpenAI API Key
- Data loaded into Atlas
Usage
rag.py
If you’ve been following along for this demo thus far, your rag.py
should look something like this at this point:
from langchain_mongodb import MongoDBAtlasVectorSearch
from langchain_openai import OpenAIEmbeddings
import key_param
dbName = "book_mongodb_chunks"
collectionName = "chunked_data"
index = "vector_index"
vectorStore = MongoDBAtlasVectorSearch.from_connection_string(
key_param.MONGODB_URI,
dbName + "." + collectionName,
OpenAIEmbeddings(disallowed_special=(), openai_api_key=key_param.LLM_API_KEY),
index_name=index,
)
def query_data(query):
retriever = vectorStore.as_retriever(
search_type="similarity",
search_kwargs={
"k": 3,
"pre_filter": { "hasCode": { "$eq": False } },
"score_threshold": 0.01
},
)
results = retriever.invoke(query)
print(results)
query_data("When did MongoDB begin supporting multi-document transactions?")
Import additional modules:
from langchain.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
Create a Prompt Template
Here is an example of a template you might create to help the RAG system answer questions:
template = """
Use the following pieces of context to answer the question at the end.
If you don't know the answer, just say that you don't know, don't try to make up an answer.
Do not answer the question if there is no given context.
Do not answer the question if it is not related to the context.
Do not give recommendations to anything other than MongoDB.
Context:
{context}
Question: {question}
"""
Linking the Chain
We'll replace the print(results)
section with our RAG chain sequence to put our whole RAG system together:
custom_rag_prompt = PromptTemplate.from_template(template)
retrieve = {
"context": retriever | (lambda docs: "\n\n".join([d.page_content for d in docs])),
"question": RunnablePassthrough()
}
llm = ChatOpenAI(openai_api_key=key_param.LLM_API_KEY, temperature=0)
response_parser = StrOutputParser()
rag_chain = (
retrieve
| custom_rag_prompt
| llm
| response_parser
)
answer = rag_chain.invoke(query)
return answer
Write a query
Update the query_data
function in the rag.py
file by passing in a question:
query_data("What is the difference between a database and collection in MongoDB?")
rag.py
After this, your rag.py
file should look like this:
from langchain_mongodb import MongoDBAtlasVectorSearch
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
import key_param
dbName = "book_mongodb_chunks"
collectionName = "chunked_data"
index = "vector_index"
vectorStore = MongoDBAtlasVectorSearch.from_connection_string(
key_param.MONGODB_URI,
dbName + "." + collectionName,
OpenAIEmbeddings(disallowed_special=(), openai_api_key=key_param.LLM_API_KEY),
index_name=index,
)
def query_data(query):
retriever = vectorStore.as_retriever(
search_type="similarity",
search_kwargs={
"k": 3,
"pre_filter": { "hasCode": { "$eq": False } },
"score_threshold": 0.01
},
)
template = """
Use the following pieces of context to answer the question at the end.
If you don't know the answer, just say that you don't know, don't try to make up an answer.
Do not answer the question if there is no given context.
Do not answer the question if it is not related to the context.
Do not give recommendations to anything other than MongoDB.
Context:
{context}
Question: {question}
"""
custom_rag_prompt = PromptTemplate.from_template(template)
retrieve = {
"context": retriever | (lambda docs: "\n\n".join([d.page_content for d in docs])),
"question": RunnablePassthrough()
}
llm = ChatOpenAI(openai_api_key=key_param.LLM_API_KEY, temperature=0)
response_parser = StrOutputParser()
rag_chain = (
retrieve
| custom_rag_prompt
| llm
| response_parser
)
answer = rag_chain.invoke(query)
return answer
print(query_data("When did MongoDB begin supporting multi-document transactions?"))
Run the demo
Finally, it’s time to run your RAG application and have it answer your question:
python rag.py