How to Utilize the Multi-QA MiniLM Sentence-Transformers Model for Semantic Search

May 11, 2024 | Educational

Ever found yourself wading through a sea of information, wishing for a magical tool that could fetch relevant answers to your queries efficiently? Enter the multi-qa-MiniLM-L6-dot-v1 sentence-transformers model! This blog post will guide you through the ins and outs of leveraging this powerful model for semantic search.

What is the Multi-QA MiniLM Model?

The multi-qa-MiniLM-L6-dot-v1 model is designed to convert sentences and paragraphs into a structured 384-dimensional vector space, basically making sense of words by embedding them numerically. With **215 million** (question, answer) pairs in its training arsenal, this model excels at understanding context, making it a reliable partner for semantic search.

Setting Up the Environment

To start using this model, you’ll need to have the sentence-transformers library installed. Here’s how:

pip install -U sentence-transformers

Using the Model

Once you’ve set up the library, you can start querying for answers using the model. Here’s how you can do it with a simple Python script:

from sentence_transformers import SentenceTransformer, util

# Your query
query = "How many people live in London?"

# Relevant documents
docs = [
    "Around 9 million people live in London.",
    "London is known for its financial district."
]

# Load the model
model = SentenceTransformer('sentence-transformers/multi-qa-MiniLM-L6-dot-v1')

# Encode the query and documents
query_emb = model.encode(query)
doc_emb = model.encode(docs)

# Compute dot score between query and all document embeddings
scores = util.dot_score(query_emb, doc_emb)[0].cpu().tolist()

# Combine docs & scores
doc_score_pairs = list(zip(docs, scores))

# Sort by decreasing score
doc_score_pairs = sorted(doc_score_pairs, key=lambda x: x[1], reverse=True)

# Output passages & scores
for doc, score in doc_score_pairs:
    print(score, doc)

Understanding the Code with an Analogy

Imagine you’re at a library (the model) with a massive collection of books (documents). You’ve just asked the librarian (the query) how many people live in London. The librarian understands your request and checks through the collection of books. She pulls out a few books that talk about London (encoding documents). The librarian then gives you a quick overview of each book (dot scoring), ensuring that you get the most relevant information first (sorting). You walk away with precise answers without having to flip through every book yourself!

Alternative: Using HuggingFace Transformers

If you prefer doing things a little differently, you can still use this model without the sentence-transformers library. First, ensure you have the right packages installed:

from transformers import AutoTokenizer, AutoModel
import torch

# CLS Pooling - Take output from first token
def cls_pooling(model_output):
    return model_output.last_hidden_state[:, 0]

# Encode text
def encode(texts):
    # Tokenize sentences
    encoded_input = tokenizer(texts, padding=True, truncation=True, return_tensors='pt')
    # Compute token embeddings
    with torch.no_grad():
        model_output = model(**encoded_input, return_dict=True)
    # Perform pooling
    embeddings = cls_pooling(model_output)
    return embeddings

# Sentences we want sentence embeddings for
query = "How many people live in London?"
docs = [
    "Around 9 million people live in London.",
    "London is known for its financial district."
]

# Load model from HuggingFace Hub
tokenizer = AutoTokenizer.from_pretrained('sentence-transformers/multi-qa-MiniLM-L6-dot-v1')
model = AutoModel.from_pretrained('sentence-transformers/multi-qa-MiniLM-L6-dot-v1')

# Encode query and docs
query_emb = encode(query)
doc_emb = encode(docs)

# Compute dot score between query and all document embeddings
scores = torch.mm(query_emb, doc_emb.transpose(0, 1))[0].cpu().tolist()

# Combine docs & scores
doc_score_pairs = list(zip(docs, scores))

# Sort by decreasing score
doc_score_pairs = sorted(doc_score_pairs, key=lambda x: x[1], reverse=True)

# Output passages & scores
for doc, score in doc_score_pairs:
    print(score, doc)

Troubleshooting

If you encounter issues while using the model, consider these troubleshooting tips:

  • Ensure you have installed all required libraries. If any are missing, use pip install to get them.
  • Check for compatibility issues with Python versions or library versions.
  • For large documents, ensure the text doesn’t exceed the **512 word pieces** limit, else it will truncate.
  • Refer to relevant error messages and consult documentation for specific corrective actions.

For more insights, updates, or to collaborate on AI development projects, stay connected with fxis.ai.

Final Thoughts

At fxis.ai, we believe that such advancements are crucial for the future of AI, as they enable more comprehensive and effective solutions. Our team is continually exploring new methodologies to push the envelope in artificial intelligence, ensuring that our clients benefit from the latest technological innovations.

Stay Informed with the Newest F(x) Insights and Blogs

Tech News and Blog Highlights, Straight to Your Inbox