Compute a relevance coefficient for *query* against *doc_id*. The coefficient is ``min_similarity - mean_similarity`` over the top-k retrieved chunks. A value close to zero suggests the question matches multiple passages equally well. Args: query: The n
(self, query, doc_id, context_size=4)
| 391 | return relevant_documents |
| 392 | |
| 393 | def analyse_query(self, query, doc_id, context_size=4): |
| 394 | """Compute a relevance coefficient for *query* against *doc_id*. |
| 395 | |
| 396 | The coefficient is ``min_similarity - mean_similarity`` over the |
| 397 | top-k retrieved chunks. A value close to zero suggests the |
| 398 | question matches multiple passages equally well. |
| 399 | |
| 400 | Args: |
| 401 | query: The natural-language question. |
| 402 | doc_id: Document identifier. |
| 403 | context_size: Number of chunks to consider (default 4). |
| 404 | |
| 405 | Returns: |
| 406 | tuple: ``(summary_string, coordinates)`` |
| 407 | """ |
| 408 | db = self.data_storage.embeddings_dict[doc_id] |
| 409 | # retriever = db.as_retriever( |
| 410 | # search_kwargs={"k": context_size, 'score_threshold': 0.0}, |
| 411 | # search_type="similarity_score_threshold" |
| 412 | # ) |
| 413 | retriever = db.as_retriever(search_kwargs={"k": context_size}, search_type="similarity_with_embeddings") |
| 414 | relevant_documents = retriever.invoke(query) |
| 415 | relevant_document_coordinates = [ |
| 416 | doc.metadata["coordinates"].split(";") if "coordinates" in doc.metadata else [] for doc in relevant_documents |
| 417 | ] |
| 418 | all_documents = db.get(include=["documents", "metadatas", "embeddings"]) |
| 419 | # all_documents_embeddings = all_documents["embeddings"] |
| 420 | # query_embedding = db._embedding_function.embed_query(query) |
| 421 | |
| 422 | # distance_evaluator = load_evaluator("pairwise_embedding_distance", |
| 423 | # embeddings=db._embedding_function, |
| 424 | # distance_metric=EmbeddingDistance.EUCLIDEAN) |
| 425 | |
| 426 | # distance_evaluator.evaluate_string_pairs(query=query_embedding, documents="") |
| 427 | |
| 428 | similarities = [doc.metadata["__similarity"] for doc in relevant_documents] |
| 429 | min_similarity = min(similarities) |
| 430 | mean_similarity = sum(similarities) / len(similarities) |
| 431 | coefficient = min_similarity - mean_similarity |
| 432 | |
| 433 | return ( |
| 434 | f"Coefficient: {coefficient}, (Min similarity {min_similarity}, Mean similarity: {mean_similarity})", |
| 435 | relevant_document_coordinates, |
| 436 | ) |
| 437 | |
| 438 | def _parse_json(self, response, output_parser): |
| 439 | system_message = ( |
no test coverage detected