langroid 0.56.5__tar.gz → 0.56.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. {langroid-0.56.5 → langroid-0.56.7}/PKG-INFO +1 -1
  2. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/doc_chat_agent.py +89 -22
  3. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/lance_doc_chat_agent.py +1 -1
  4. {langroid-0.56.5 → langroid-0.56.7}/langroid/parsing/parser.py +1 -1
  5. {langroid-0.56.5 → langroid-0.56.7}/pyproject.toml +1 -1
  6. {langroid-0.56.5 → langroid-0.56.7}/.gitignore +0 -0
  7. {langroid-0.56.5 → langroid-0.56.7}/LICENSE +0 -0
  8. {langroid-0.56.5 → langroid-0.56.7}/README.md +0 -0
  9. {langroid-0.56.5 → langroid-0.56.7}/langroid/__init__.py +0 -0
  10. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/__init__.py +0 -0
  11. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/base.py +0 -0
  12. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/batch.py +0 -0
  13. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/callbacks/__init__.py +0 -0
  14. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/callbacks/chainlit.py +0 -0
  15. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/chat_agent.py +0 -0
  16. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/chat_document.py +0 -0
  17. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/done_sequence_parser.py +0 -0
  18. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/openai_assistant.py +0 -0
  19. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/__init__.py +0 -0
  20. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/arangodb/__init__.py +0 -0
  21. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/arangodb/arangodb_agent.py +0 -0
  22. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/arangodb/system_messages.py +0 -0
  23. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/arangodb/tools.py +0 -0
  24. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/arangodb/utils.py +0 -0
  25. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/doc_chat_task.py +0 -0
  26. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/lance_rag/__init__.py +0 -0
  27. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/lance_rag/critic_agent.py +0 -0
  28. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/lance_rag/lance_rag_task.py +0 -0
  29. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/lance_rag/query_planner_agent.py +0 -0
  30. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/lance_tools.py +0 -0
  31. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/neo4j/__init__.py +0 -0
  32. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/neo4j/csv_kg_chat.py +0 -0
  33. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/neo4j/neo4j_chat_agent.py +0 -0
  34. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/neo4j/system_messages.py +0 -0
  35. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/neo4j/tools.py +0 -0
  36. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/relevance_extractor_agent.py +0 -0
  37. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/retriever_agent.py +0 -0
  38. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/sql/__init__.py +0 -0
  39. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/sql/sql_chat_agent.py +0 -0
  40. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/sql/utils/__init__.py +0 -0
  41. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/sql/utils/description_extractors.py +0 -0
  42. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/sql/utils/populate_metadata.py +0 -0
  43. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/sql/utils/system_message.py +0 -0
  44. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/sql/utils/tools.py +0 -0
  45. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/special/table_chat_agent.py +0 -0
  46. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/task.py +0 -0
  47. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/tool_message.py +0 -0
  48. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/tools/__init__.py +0 -0
  49. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/tools/duckduckgo_search_tool.py +0 -0
  50. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/tools/exa_search_tool.py +0 -0
  51. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/tools/file_tools.py +0 -0
  52. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/tools/google_search_tool.py +0 -0
  53. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/tools/mcp/__init__.py +0 -0
  54. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/tools/mcp/decorators.py +0 -0
  55. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/tools/mcp/fastmcp_client.py +0 -0
  56. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/tools/metaphor_search_tool.py +0 -0
  57. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/tools/orchestration.py +0 -0
  58. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/tools/recipient_tool.py +0 -0
  59. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/tools/retrieval_tool.py +0 -0
  60. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/tools/rewind_tool.py +0 -0
  61. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/tools/segment_extract_tool.py +0 -0
  62. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/tools/task_tool.py +0 -0
  63. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/tools/tavily_search_tool.py +0 -0
  64. {langroid-0.56.5 → langroid-0.56.7}/langroid/agent/xml_tool_message.py +0 -0
  65. {langroid-0.56.5 → langroid-0.56.7}/langroid/cachedb/__init__.py +0 -0
  66. {langroid-0.56.5 → langroid-0.56.7}/langroid/cachedb/base.py +0 -0
  67. {langroid-0.56.5 → langroid-0.56.7}/langroid/cachedb/redis_cachedb.py +0 -0
  68. {langroid-0.56.5 → langroid-0.56.7}/langroid/embedding_models/__init__.py +0 -0
  69. {langroid-0.56.5 → langroid-0.56.7}/langroid/embedding_models/base.py +0 -0
  70. {langroid-0.56.5 → langroid-0.56.7}/langroid/embedding_models/models.py +0 -0
  71. {langroid-0.56.5 → langroid-0.56.7}/langroid/embedding_models/protoc/__init__.py +0 -0
  72. {langroid-0.56.5 → langroid-0.56.7}/langroid/embedding_models/protoc/embeddings.proto +0 -0
  73. {langroid-0.56.5 → langroid-0.56.7}/langroid/embedding_models/protoc/embeddings_pb2.py +0 -0
  74. {langroid-0.56.5 → langroid-0.56.7}/langroid/embedding_models/protoc/embeddings_pb2.pyi +0 -0
  75. {langroid-0.56.5 → langroid-0.56.7}/langroid/embedding_models/protoc/embeddings_pb2_grpc.py +0 -0
  76. {langroid-0.56.5 → langroid-0.56.7}/langroid/embedding_models/remote_embeds.py +0 -0
  77. {langroid-0.56.5 → langroid-0.56.7}/langroid/exceptions.py +0 -0
  78. {langroid-0.56.5 → langroid-0.56.7}/langroid/language_models/__init__.py +0 -0
  79. {langroid-0.56.5 → langroid-0.56.7}/langroid/language_models/azure_openai.py +0 -0
  80. {langroid-0.56.5 → langroid-0.56.7}/langroid/language_models/base.py +0 -0
  81. {langroid-0.56.5 → langroid-0.56.7}/langroid/language_models/config.py +0 -0
  82. {langroid-0.56.5 → langroid-0.56.7}/langroid/language_models/mock_lm.py +0 -0
  83. {langroid-0.56.5 → langroid-0.56.7}/langroid/language_models/model_info.py +0 -0
  84. {langroid-0.56.5 → langroid-0.56.7}/langroid/language_models/openai_gpt.py +0 -0
  85. {langroid-0.56.5 → langroid-0.56.7}/langroid/language_models/prompt_formatter/__init__.py +0 -0
  86. {langroid-0.56.5 → langroid-0.56.7}/langroid/language_models/prompt_formatter/base.py +0 -0
  87. {langroid-0.56.5 → langroid-0.56.7}/langroid/language_models/prompt_formatter/hf_formatter.py +0 -0
  88. {langroid-0.56.5 → langroid-0.56.7}/langroid/language_models/prompt_formatter/llama2_formatter.py +0 -0
  89. {langroid-0.56.5 → langroid-0.56.7}/langroid/language_models/provider_params.py +0 -0
  90. {langroid-0.56.5 → langroid-0.56.7}/langroid/language_models/utils.py +0 -0
  91. {langroid-0.56.5 → langroid-0.56.7}/langroid/mcp/__init__.py +0 -0
  92. {langroid-0.56.5 → langroid-0.56.7}/langroid/mcp/server/__init__.py +0 -0
  93. {langroid-0.56.5 → langroid-0.56.7}/langroid/mytypes.py +0 -0
  94. {langroid-0.56.5 → langroid-0.56.7}/langroid/parsing/__init__.py +0 -0
  95. {langroid-0.56.5 → langroid-0.56.7}/langroid/parsing/agent_chats.py +0 -0
  96. {langroid-0.56.5 → langroid-0.56.7}/langroid/parsing/code_parser.py +0 -0
  97. {langroid-0.56.5 → langroid-0.56.7}/langroid/parsing/document_parser.py +0 -0
  98. {langroid-0.56.5 → langroid-0.56.7}/langroid/parsing/file_attachment.py +0 -0
  99. {langroid-0.56.5 → langroid-0.56.7}/langroid/parsing/md_parser.py +0 -0
  100. {langroid-0.56.5 → langroid-0.56.7}/langroid/parsing/para_sentence_split.py +0 -0
  101. {langroid-0.56.5 → langroid-0.56.7}/langroid/parsing/parse_json.py +0 -0
  102. {langroid-0.56.5 → langroid-0.56.7}/langroid/parsing/pdf_utils.py +0 -0
  103. {langroid-0.56.5 → langroid-0.56.7}/langroid/parsing/repo_loader.py +0 -0
  104. {langroid-0.56.5 → langroid-0.56.7}/langroid/parsing/routing.py +0 -0
  105. {langroid-0.56.5 → langroid-0.56.7}/langroid/parsing/search.py +0 -0
  106. {langroid-0.56.5 → langroid-0.56.7}/langroid/parsing/spider.py +0 -0
  107. {langroid-0.56.5 → langroid-0.56.7}/langroid/parsing/table_loader.py +0 -0
  108. {langroid-0.56.5 → langroid-0.56.7}/langroid/parsing/url_loader.py +0 -0
  109. {langroid-0.56.5 → langroid-0.56.7}/langroid/parsing/urls.py +0 -0
  110. {langroid-0.56.5 → langroid-0.56.7}/langroid/parsing/utils.py +0 -0
  111. {langroid-0.56.5 → langroid-0.56.7}/langroid/parsing/web_search.py +0 -0
  112. {langroid-0.56.5 → langroid-0.56.7}/langroid/prompts/__init__.py +0 -0
  113. {langroid-0.56.5 → langroid-0.56.7}/langroid/prompts/dialog.py +0 -0
  114. {langroid-0.56.5 → langroid-0.56.7}/langroid/prompts/prompts_config.py +0 -0
  115. {langroid-0.56.5 → langroid-0.56.7}/langroid/prompts/templates.py +0 -0
  116. {langroid-0.56.5 → langroid-0.56.7}/langroid/py.typed +0 -0
  117. {langroid-0.56.5 → langroid-0.56.7}/langroid/pydantic_v1/__init__.py +0 -0
  118. {langroid-0.56.5 → langroid-0.56.7}/langroid/pydantic_v1/main.py +0 -0
  119. {langroid-0.56.5 → langroid-0.56.7}/langroid/utils/__init__.py +0 -0
  120. {langroid-0.56.5 → langroid-0.56.7}/langroid/utils/algorithms/__init__.py +0 -0
  121. {langroid-0.56.5 → langroid-0.56.7}/langroid/utils/algorithms/graph.py +0 -0
  122. {langroid-0.56.5 → langroid-0.56.7}/langroid/utils/configuration.py +0 -0
  123. {langroid-0.56.5 → langroid-0.56.7}/langroid/utils/constants.py +0 -0
  124. {langroid-0.56.5 → langroid-0.56.7}/langroid/utils/git_utils.py +0 -0
  125. {langroid-0.56.5 → langroid-0.56.7}/langroid/utils/globals.py +0 -0
  126. {langroid-0.56.5 → langroid-0.56.7}/langroid/utils/logging.py +0 -0
  127. {langroid-0.56.5 → langroid-0.56.7}/langroid/utils/object_registry.py +0 -0
  128. {langroid-0.56.5 → langroid-0.56.7}/langroid/utils/output/__init__.py +0 -0
  129. {langroid-0.56.5 → langroid-0.56.7}/langroid/utils/output/citations.py +0 -0
  130. {langroid-0.56.5 → langroid-0.56.7}/langroid/utils/output/printing.py +0 -0
  131. {langroid-0.56.5 → langroid-0.56.7}/langroid/utils/output/status.py +0 -0
  132. {langroid-0.56.5 → langroid-0.56.7}/langroid/utils/pandas_utils.py +0 -0
  133. {langroid-0.56.5 → langroid-0.56.7}/langroid/utils/pydantic_utils.py +0 -0
  134. {langroid-0.56.5 → langroid-0.56.7}/langroid/utils/system.py +0 -0
  135. {langroid-0.56.5 → langroid-0.56.7}/langroid/utils/types.py +0 -0
  136. {langroid-0.56.5 → langroid-0.56.7}/langroid/vector_store/__init__.py +0 -0
  137. {langroid-0.56.5 → langroid-0.56.7}/langroid/vector_store/base.py +0 -0
  138. {langroid-0.56.5 → langroid-0.56.7}/langroid/vector_store/chromadb.py +0 -0
  139. {langroid-0.56.5 → langroid-0.56.7}/langroid/vector_store/lancedb.py +0 -0
  140. {langroid-0.56.5 → langroid-0.56.7}/langroid/vector_store/meilisearch.py +0 -0
  141. {langroid-0.56.5 → langroid-0.56.7}/langroid/vector_store/pineconedb.py +0 -0
  142. {langroid-0.56.5 → langroid-0.56.7}/langroid/vector_store/postgres.py +0 -0
  143. {langroid-0.56.5 → langroid-0.56.7}/langroid/vector_store/qdrantdb.py +0 -0
  144. {langroid-0.56.5 → langroid-0.56.7}/langroid/vector_store/weaviatedb.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langroid
3
- Version: 0.56.5
3
+ Version: 0.56.7
4
4
  Summary: Harness LLMs with Multi-Agent Programming
5
5
  Author-email: Prasad Chalasani <pchalasani@gmail.com>
6
6
  License: MIT
@@ -142,6 +142,8 @@ class DocChatAgentConfig(ChatAgentConfig):
142
142
  # improve retrieval.
143
143
  chunk_enrichment_config: Optional[ChunkEnrichmentAgentConfig] = None
144
144
 
145
+ n_relevant_chunks: int = 3 # how many relevant chunks to retrieve finally
146
+ n_similar_chunks: int = 3 # how many similar chunks to retrieve, by each method
145
147
  n_query_rephrases: int = 0
146
148
  n_neighbor_chunks: int = 0 # how many neighbors on either side of match to retrieve
147
149
  n_fuzzy_neighbor_words: int = 100 # num neighbor words to retrieve for fuzzy match
@@ -185,7 +187,8 @@ class DocChatAgentConfig(ChatAgentConfig):
185
187
  # truncating due to punctuation
186
188
  min_chunk_chars=200,
187
189
  discard_chunk_chars=5, # discard chunks with fewer than this many chars
188
- n_similar_docs=3,
190
+ # set deprecated n_similar_docs to None; use n_similar_chunks above instead
191
+ n_similar_docs=None,
189
192
  n_neighbor_ids=0, # num chunk IDs to store on either side of each chunk
190
193
  pdf=PdfParsingConfig(
191
194
  # NOTE: PDF parsing is extremely challenging, and each library
@@ -240,6 +243,60 @@ class DocChatAgent(ChatAgent):
240
243
  self.chunked_docs: List[Document] = []
241
244
  self.chunked_docs_clean: List[Document] = []
242
245
  self.response: None | Document = None
246
+ if (
247
+ self.config.cross_encoder_reranking_model != ""
248
+ and self.config.use_reciprocal_rank_fusion
249
+ ):
250
+ logger.warning(
251
+ """
252
+ You have set `use_reciprocal_rank_fusion` to True,
253
+ but it will be ignored since you have also set
254
+ `cross_encoder_reranking_model` to a non-empty value.
255
+ To use RRF (Reciprocal Rank Fusion), set
256
+ `cross_encoder_reranking_model` to an empty string.
257
+ """
258
+ )
259
+
260
+ if (
261
+ self.config.cross_encoder_reranking_model == ""
262
+ and not self.config.use_reciprocal_rank_fusion
263
+ and (self.config.use_fuzzy_match or self.config.use_bm25_search)
264
+ and (
265
+ self.config.n_relevant_chunks
266
+ < self.config.n_similar_chunks
267
+ * (self.config.use_bm25_search + self.config.use_fuzzy_match)
268
+ )
269
+ ):
270
+ logger.warning(
271
+ """
272
+ DocChatAgent has been configured to have no cross encoder reranking,
273
+ AND `use_reciprocal_rank_fusion` is set to False,
274
+ AND `use_fuzzy_match` or `use_bm25_search` is True,
275
+ AND `n_relevant_chunks` is less than `n_similar_chunks` * (
276
+ `use_bm25_search` + `use_fuzzy_match`
277
+ ),
278
+ BUT there is no way to rerank the chunks retrieved by multiple methods,
279
+ so we will set `use_reciprocal_rank_fusion` to True.
280
+ """
281
+ )
282
+ self.config.use_reciprocal_rank_fusion = True
283
+
284
+ # Handle backward compatibility for deprecated n_similar_docs
285
+ if self.config.parsing.n_similar_docs is not None:
286
+ logger.warning(
287
+ """
288
+ The parameter `parsing.n_similar_docs` is deprecated and will be
289
+ removed in a future version. Please use `n_similar_chunks` and
290
+ `n_relevant_chunks` instead, which provide more fine-grained
291
+ control over retrieval.
292
+ - n_similar_chunks: number of chunks to retrieve by each method
293
+ - n_relevant_chunks: final number of chunks to return after reranking
294
+ """
295
+ )
296
+ # Use the deprecated value for both parameters
297
+ self.config.n_similar_chunks = self.config.parsing.n_similar_docs
298
+ self.config.n_relevant_chunks = self.config.parsing.n_similar_docs
299
+
243
300
  self.ingest()
244
301
 
245
302
  def clear(self) -> None:
@@ -486,7 +543,7 @@ class DocChatAgent(ChatAgent):
486
543
  def retrieval_tool(self, msg: RetrievalTool) -> str:
487
544
  """Handle the RetrievalTool message"""
488
545
  self.config.retrieve_only = True
489
- self.config.parsing.n_similar_docs = msg.num_results
546
+ self.config.n_relevant_chunks = msg.num_results
490
547
  content_doc = self.answer_from_docs(msg.query)
491
548
  return content_doc.content
492
549
 
@@ -1005,7 +1062,7 @@ class DocChatAgent(ChatAgent):
1005
1062
  self.chunked_docs,
1006
1063
  self.chunked_docs_clean, # already pre-processed!
1007
1064
  query,
1008
- k=self.config.parsing.n_similar_docs * multiple,
1065
+ k=self.config.n_similar_chunks * multiple,
1009
1066
  )
1010
1067
  return docs_scores
1011
1068
 
@@ -1025,7 +1082,7 @@ class DocChatAgent(ChatAgent):
1025
1082
  query,
1026
1083
  self.chunked_docs,
1027
1084
  self.chunked_docs_clean,
1028
- k=self.config.parsing.n_similar_docs * multiple,
1085
+ k=self.config.n_similar_chunks * multiple,
1029
1086
  words_before=self.config.n_fuzzy_neighbor_words or None,
1030
1087
  words_after=self.config.n_fuzzy_neighbor_words or None,
1031
1088
  )
@@ -1056,9 +1113,7 @@ class DocChatAgent(ChatAgent):
1056
1113
  key=lambda x: x[0],
1057
1114
  reverse=True,
1058
1115
  )
1059
- passages = [
1060
- d for _, d in sorted_pairs[: self.config.parsing.n_similar_docs]
1061
- ]
1116
+ passages = [d for _, d in sorted_pairs[: self.config.n_similar_chunks]]
1062
1117
  return passages
1063
1118
 
1064
1119
  def rerank_with_diversity(self, passages: List[Document]) -> List[Document]:
@@ -1229,7 +1284,7 @@ class DocChatAgent(ChatAgent):
1229
1284
 
1230
1285
  # if we are using cross-encoder reranking or reciprocal rank fusion (RRF),
1231
1286
  # we can retrieve more docs during retrieval, and leave it to the cross-encoder
1232
- # or RRF reranking to whittle down to self.config.parsing.n_similar_docs
1287
+ # or RRF reranking to whittle down to self.config.n_similar_chunks
1233
1288
  retrieval_multiple = (
1234
1289
  1
1235
1290
  if (
@@ -1247,7 +1302,7 @@ class DocChatAgent(ChatAgent):
1247
1302
  for q in [query] + query_proxies:
1248
1303
  docs_and_scores += self.get_semantic_search_results(
1249
1304
  q,
1250
- k=self.config.parsing.n_similar_docs * retrieval_multiple,
1305
+ k=self.config.n_similar_chunks * retrieval_multiple,
1251
1306
  )
1252
1307
  # sort by score descending
1253
1308
  docs_and_scores = sorted(
@@ -1265,8 +1320,12 @@ class DocChatAgent(ChatAgent):
1265
1320
  # TODO: Add score threshold in config
1266
1321
  docs_scores = self.get_similar_chunks_bm25(query, retrieval_multiple)
1267
1322
  id2doc.update({d.id(): d for d, _ in docs_scores})
1268
- if self.config.cross_encoder_reranking_model == "":
1269
- # only if we're not re-ranking with a cross-encoder,
1323
+ if (
1324
+ self.config.cross_encoder_reranking_model == ""
1325
+ and self.config.use_reciprocal_rank_fusion
1326
+ ):
1327
+ # if we're not re-ranking with a cross-encoder, and have RRF enabled,
1328
+ # instead of accumulating the bm25 results into passages,
1270
1329
  # we collect these ranks for Reciprocal Rank Fusion down below.
1271
1330
  docs_scores = sorted(docs_scores, key=lambda x: x[1], reverse=True)
1272
1331
  id2_rank_bm25 = {d.id(): i for i, (d, _) in enumerate(docs_scores)}
@@ -1279,8 +1338,12 @@ class DocChatAgent(ChatAgent):
1279
1338
  if self.config.use_fuzzy_match:
1280
1339
  # TODO: Add score threshold in config
1281
1340
  fuzzy_match_doc_scores = self.get_fuzzy_matches(query, retrieval_multiple)
1282
- if self.config.cross_encoder_reranking_model == "":
1283
- # only if we're not re-ranking with a cross-encoder,
1341
+ if (
1342
+ self.config.cross_encoder_reranking_model == ""
1343
+ and self.config.use_reciprocal_rank_fusion
1344
+ ):
1345
+ # if we're not re-ranking with a cross-encoder,
1346
+ # instead of accumulating the fuzzy match results into passages,
1284
1347
  # we collect these ranks for Reciprocal Rank Fusion down below.
1285
1348
  fuzzy_match_doc_scores = sorted(
1286
1349
  fuzzy_match_doc_scores, key=lambda x: x[1], reverse=True
@@ -1316,9 +1379,12 @@ class DocChatAgent(ChatAgent):
1316
1379
  | set(id2_rank_bm25.keys())
1317
1380
  | set(id2_rank_fuzzy.keys())
1318
1381
  ):
1319
- rank_semantic = id2_rank_semantic.get(id_, float("inf"))
1320
- rank_bm25 = id2_rank_bm25.get(id_, float("inf"))
1321
- rank_fuzzy = id2_rank_fuzzy.get(id_, float("inf"))
1382
+ # Use max_rank instead of infinity to avoid bias against
1383
+ # single-method docs
1384
+ max_rank = self.config.n_similar_chunks * retrieval_multiple
1385
+ rank_semantic = id2_rank_semantic.get(id_, max_rank)
1386
+ rank_bm25 = id2_rank_bm25.get(id_, max_rank)
1387
+ rank_fuzzy = id2_rank_fuzzy.get(id_, max_rank)
1322
1388
  c = self.config.reciprocal_rank_fusion_constant
1323
1389
  reciprocal_fusion_score = (
1324
1390
  1 / (rank_semantic + c) + 1 / (rank_bm25 + c) + 1 / (rank_fuzzy + c)
@@ -1333,12 +1399,13 @@ class DocChatAgent(ChatAgent):
1333
1399
  reverse=True,
1334
1400
  )
1335
1401
  )
1336
- # each method retrieved up to retrieval_multiple * n_similar_docs,
1337
- # so we need to take the top n_similar_docs from the combined list
1402
+ # each method retrieved up to retrieval_multiple * n_similar_chunks,
1403
+ # so we need to take the top n_similar_chunks from the combined list
1338
1404
  passages = [
1339
1405
  id2doc[id]
1340
- for i, (id, _) in enumerate(id2_reciprocal_score.items())
1341
- if i < self.config.parsing.n_similar_docs
1406
+ for id, _ in list(id2_reciprocal_score.items())[
1407
+ : self.config.n_similar_chunks
1408
+ ]
1342
1409
  ]
1343
1410
  # passages must have distinct ids
1344
1411
  assert len(passages) == len(set([d.id() for d in passages])), (
@@ -1355,7 +1422,7 @@ class DocChatAgent(ChatAgent):
1355
1422
  passages = [p for p, _ in passages_scores]
1356
1423
  # now passages can potentially have a lot of doc chunks,
1357
1424
  # so we re-rank them using a cross-encoder scoring model,
1358
- # and pick top k where k = config.parsing.n_similar_docs
1425
+ # and pick top k where k = config..n_similar_chunks
1359
1426
  # https://www.sbert.net/examples/applications/retrieve_rerank
1360
1427
  if self.config.cross_encoder_reranking_model != "":
1361
1428
  passages = self.rerank_with_cross_encoder(query, passages)
@@ -1374,7 +1441,7 @@ class DocChatAgent(ChatAgent):
1374
1441
  passages_scores = self.add_context_window(passages_scores)
1375
1442
  passages = [p for p, _ in passages_scores]
1376
1443
 
1377
- return passages[: self.config.parsing.n_similar_docs]
1444
+ return passages[: self.config.n_relevant_chunks]
1378
1445
 
1379
1446
  @no_type_check
1380
1447
  def get_relevant_extracts(self, query: str) -> Tuple[str, List[Document]]:
@@ -255,7 +255,7 @@ class LanceDocChatAgent(DocChatAgent):
255
255
  result = (
256
256
  tbl.search(query_clean)
257
257
  .where(self.config.filter or None)
258
- .limit(self.config.parsing.n_similar_docs * multiple)
258
+ .limit(self.config.n_similar_chunks * multiple)
259
259
  )
260
260
  docs = self.vecdb._lance_result_to_docs(result)
261
261
  scores = [r["score"] for r in result.to_list()]
@@ -120,7 +120,7 @@ class ParsingConfig(BaseSettings):
120
120
  # aim to have at least this many chars per chunk when truncating due to punctuation
121
121
  min_chunk_chars: int = 350
122
122
  discard_chunk_chars: int = 5 # discard chunks with fewer than this many chars
123
- n_similar_docs: int = 4
123
+ n_similar_docs: Optional[int] = None # deprecated
124
124
  n_neighbor_ids: int = 5 # window size to store around each chunk
125
125
  separators: List[str] = ["\n\n", "\n", " ", ""]
126
126
  token_encoding_model: str = "text-embedding-3-small"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "langroid"
3
- version = "0.56.5"
3
+ version = "0.56.7"
4
4
  authors = [
5
5
  {name = "Prasad Chalasani", email = "pchalasani@gmail.com"},
6
6
  ]
File without changes
File without changes
File without changes
File without changes
File without changes