langchain 0.3.26__py3-none-any.whl → 0.3.27__py3-none-any.whl
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.
Potentially problematic release.
This version of langchain might be problematic. Click here for more details.
- langchain/__init__.py +110 -96
- langchain/_api/__init__.py +2 -2
- langchain/_api/deprecation.py +3 -3
- langchain/_api/module_import.py +51 -46
- langchain/_api/path.py +1 -1
- langchain/adapters/openai.py +8 -8
- langchain/agents/__init__.py +15 -12
- langchain/agents/agent.py +160 -133
- langchain/agents/agent_iterator.py +31 -14
- langchain/agents/agent_toolkits/__init__.py +7 -6
- langchain/agents/agent_toolkits/ainetwork/toolkit.py +1 -1
- langchain/agents/agent_toolkits/amadeus/toolkit.py +1 -1
- langchain/agents/agent_toolkits/azure_cognitive_services.py +1 -1
- langchain/agents/agent_toolkits/clickup/toolkit.py +1 -1
- langchain/agents/agent_toolkits/conversational_retrieval/openai_functions.py +6 -4
- langchain/agents/agent_toolkits/csv/__init__.py +4 -2
- langchain/agents/agent_toolkits/file_management/__init__.py +1 -1
- langchain/agents/agent_toolkits/file_management/toolkit.py +1 -1
- langchain/agents/agent_toolkits/github/toolkit.py +9 -9
- langchain/agents/agent_toolkits/gitlab/toolkit.py +1 -1
- langchain/agents/agent_toolkits/json/base.py +1 -1
- langchain/agents/agent_toolkits/multion/toolkit.py +1 -1
- langchain/agents/agent_toolkits/office365/toolkit.py +1 -1
- langchain/agents/agent_toolkits/openapi/base.py +1 -1
- langchain/agents/agent_toolkits/openapi/planner.py +2 -2
- langchain/agents/agent_toolkits/openapi/planner_prompt.py +10 -10
- langchain/agents/agent_toolkits/openapi/prompt.py +1 -1
- langchain/agents/agent_toolkits/openapi/toolkit.py +1 -1
- langchain/agents/agent_toolkits/pandas/__init__.py +4 -2
- langchain/agents/agent_toolkits/playwright/__init__.py +1 -1
- langchain/agents/agent_toolkits/playwright/toolkit.py +1 -1
- langchain/agents/agent_toolkits/powerbi/base.py +1 -1
- langchain/agents/agent_toolkits/powerbi/chat_base.py +1 -1
- langchain/agents/agent_toolkits/powerbi/prompt.py +2 -2
- langchain/agents/agent_toolkits/powerbi/toolkit.py +1 -1
- langchain/agents/agent_toolkits/python/__init__.py +4 -2
- langchain/agents/agent_toolkits/spark/__init__.py +4 -2
- langchain/agents/agent_toolkits/spark_sql/base.py +1 -1
- langchain/agents/agent_toolkits/spark_sql/toolkit.py +1 -1
- langchain/agents/agent_toolkits/sql/prompt.py +1 -1
- langchain/agents/agent_toolkits/sql/toolkit.py +1 -1
- langchain/agents/agent_toolkits/vectorstore/base.py +2 -2
- langchain/agents/agent_toolkits/vectorstore/prompt.py +2 -4
- langchain/agents/agent_toolkits/vectorstore/toolkit.py +12 -11
- langchain/agents/agent_toolkits/xorbits/__init__.py +4 -2
- langchain/agents/agent_toolkits/zapier/toolkit.py +1 -1
- langchain/agents/agent_types.py +6 -6
- langchain/agents/chat/base.py +6 -12
- langchain/agents/chat/output_parser.py +9 -6
- langchain/agents/chat/prompt.py +3 -4
- langchain/agents/conversational/base.py +9 -5
- langchain/agents/conversational/output_parser.py +4 -2
- langchain/agents/conversational/prompt.py +2 -3
- langchain/agents/conversational_chat/base.py +7 -5
- langchain/agents/conversational_chat/output_parser.py +9 -11
- langchain/agents/conversational_chat/prompt.py +5 -6
- langchain/agents/format_scratchpad/__init__.py +3 -3
- langchain/agents/format_scratchpad/log_to_messages.py +1 -1
- langchain/agents/format_scratchpad/openai_functions.py +8 -6
- langchain/agents/format_scratchpad/tools.py +5 -3
- langchain/agents/format_scratchpad/xml.py +33 -2
- langchain/agents/initialize.py +16 -8
- langchain/agents/json_chat/base.py +18 -18
- langchain/agents/json_chat/prompt.py +2 -3
- langchain/agents/load_tools.py +2 -1
- langchain/agents/loading.py +28 -18
- langchain/agents/mrkl/base.py +9 -4
- langchain/agents/mrkl/output_parser.py +17 -13
- langchain/agents/mrkl/prompt.py +1 -2
- langchain/agents/openai_assistant/base.py +80 -70
- langchain/agents/openai_functions_agent/base.py +46 -37
- langchain/agents/openai_functions_multi_agent/base.py +39 -26
- langchain/agents/openai_tools/base.py +8 -8
- langchain/agents/output_parsers/__init__.py +3 -3
- langchain/agents/output_parsers/json.py +6 -6
- langchain/agents/output_parsers/openai_functions.py +15 -7
- langchain/agents/output_parsers/openai_tools.py +9 -4
- langchain/agents/output_parsers/react_json_single_input.py +10 -5
- langchain/agents/output_parsers/react_single_input.py +15 -11
- langchain/agents/output_parsers/self_ask.py +3 -2
- langchain/agents/output_parsers/tools.py +18 -13
- langchain/agents/output_parsers/xml.py +99 -28
- langchain/agents/react/agent.py +4 -4
- langchain/agents/react/base.py +22 -17
- langchain/agents/react/output_parser.py +5 -6
- langchain/agents/react/textworld_prompt.py +0 -1
- langchain/agents/react/wiki_prompt.py +14 -15
- langchain/agents/schema.py +3 -2
- langchain/agents/self_ask_with_search/base.py +19 -15
- langchain/agents/self_ask_with_search/prompt.py +0 -1
- langchain/agents/structured_chat/base.py +14 -11
- langchain/agents/structured_chat/output_parser.py +16 -18
- langchain/agents/structured_chat/prompt.py +3 -4
- langchain/agents/tool_calling_agent/base.py +7 -6
- langchain/agents/tools.py +2 -2
- langchain/agents/utils.py +2 -3
- langchain/agents/xml/base.py +5 -5
- langchain/agents/xml/prompt.py +1 -2
- langchain/cache.py +12 -12
- langchain/callbacks/__init__.py +11 -11
- langchain/callbacks/aim_callback.py +2 -2
- langchain/callbacks/argilla_callback.py +1 -1
- langchain/callbacks/arize_callback.py +1 -1
- langchain/callbacks/arthur_callback.py +1 -1
- langchain/callbacks/base.py +7 -7
- langchain/callbacks/clearml_callback.py +1 -1
- langchain/callbacks/comet_ml_callback.py +1 -1
- langchain/callbacks/confident_callback.py +1 -1
- langchain/callbacks/context_callback.py +1 -1
- langchain/callbacks/flyte_callback.py +1 -1
- langchain/callbacks/human.py +2 -2
- langchain/callbacks/infino_callback.py +1 -1
- langchain/callbacks/labelstudio_callback.py +1 -1
- langchain/callbacks/llmonitor_callback.py +1 -1
- langchain/callbacks/manager.py +5 -5
- langchain/callbacks/mlflow_callback.py +2 -2
- langchain/callbacks/openai_info.py +1 -1
- langchain/callbacks/promptlayer_callback.py +1 -1
- langchain/callbacks/sagemaker_callback.py +1 -1
- langchain/callbacks/streaming_aiter.py +4 -1
- langchain/callbacks/streaming_aiter_final_only.py +5 -3
- langchain/callbacks/streaming_stdout_final_only.py +5 -3
- langchain/callbacks/streamlit/__init__.py +3 -2
- langchain/callbacks/streamlit/mutable_expander.py +1 -1
- langchain/callbacks/streamlit/streamlit_callback_handler.py +3 -3
- langchain/callbacks/tracers/__init__.py +1 -1
- langchain/callbacks/tracers/comet.py +1 -1
- langchain/callbacks/tracers/evaluation.py +1 -1
- langchain/callbacks/tracers/log_stream.py +1 -1
- langchain/callbacks/tracers/logging.py +1 -1
- langchain/callbacks/tracers/stdout.py +1 -1
- langchain/callbacks/trubrics_callback.py +1 -1
- langchain/callbacks/utils.py +4 -4
- langchain/callbacks/wandb_callback.py +1 -1
- langchain/callbacks/whylabs_callback.py +1 -1
- langchain/chains/api/base.py +36 -22
- langchain/chains/api/news_docs.py +1 -2
- langchain/chains/api/open_meteo_docs.py +1 -2
- langchain/chains/api/openapi/requests_chain.py +1 -1
- langchain/chains/api/openapi/response_chain.py +1 -1
- langchain/chains/api/podcast_docs.py +1 -2
- langchain/chains/api/prompt.py +1 -2
- langchain/chains/api/tmdb_docs.py +1 -2
- langchain/chains/base.py +88 -54
- langchain/chains/chat_vector_db/prompts.py +2 -3
- langchain/chains/combine_documents/__init__.py +1 -1
- langchain/chains/combine_documents/base.py +23 -10
- langchain/chains/combine_documents/map_reduce.py +38 -30
- langchain/chains/combine_documents/map_rerank.py +33 -20
- langchain/chains/combine_documents/reduce.py +47 -26
- langchain/chains/combine_documents/refine.py +26 -17
- langchain/chains/combine_documents/stuff.py +19 -12
- langchain/chains/constitutional_ai/base.py +4 -4
- langchain/chains/constitutional_ai/principles.py +22 -25
- langchain/chains/constitutional_ai/prompts.py +25 -28
- langchain/chains/conversation/base.py +5 -3
- langchain/chains/conversation/memory.py +5 -5
- langchain/chains/conversation/prompt.py +5 -5
- langchain/chains/conversational_retrieval/base.py +41 -20
- langchain/chains/conversational_retrieval/prompts.py +2 -3
- langchain/chains/elasticsearch_database/base.py +8 -9
- langchain/chains/elasticsearch_database/prompts.py +2 -3
- langchain/chains/ernie_functions/__init__.py +2 -2
- langchain/chains/example_generator.py +3 -1
- langchain/chains/flare/base.py +26 -12
- langchain/chains/graph_qa/cypher.py +2 -2
- langchain/chains/graph_qa/falkordb.py +1 -1
- langchain/chains/graph_qa/gremlin.py +1 -1
- langchain/chains/graph_qa/neptune_sparql.py +1 -1
- langchain/chains/graph_qa/prompts.py +2 -2
- langchain/chains/history_aware_retriever.py +2 -1
- langchain/chains/hyde/base.py +6 -5
- langchain/chains/hyde/prompts.py +5 -6
- langchain/chains/llm.py +77 -61
- langchain/chains/llm_bash/__init__.py +2 -1
- langchain/chains/llm_checker/base.py +7 -5
- langchain/chains/llm_checker/prompt.py +3 -4
- langchain/chains/llm_math/base.py +16 -9
- langchain/chains/llm_math/prompt.py +1 -2
- langchain/chains/llm_summarization_checker/base.py +9 -6
- langchain/chains/llm_symbolic_math/__init__.py +2 -1
- langchain/chains/loading.py +151 -95
- langchain/chains/mapreduce.py +4 -3
- langchain/chains/moderation.py +8 -9
- langchain/chains/natbot/base.py +8 -8
- langchain/chains/natbot/crawler.py +73 -76
- langchain/chains/natbot/prompt.py +2 -3
- langchain/chains/openai_functions/__init__.py +7 -7
- langchain/chains/openai_functions/base.py +13 -10
- langchain/chains/openai_functions/citation_fuzzy_match.py +12 -11
- langchain/chains/openai_functions/extraction.py +19 -19
- langchain/chains/openai_functions/openapi.py +35 -35
- langchain/chains/openai_functions/qa_with_structure.py +19 -12
- langchain/chains/openai_functions/tagging.py +2 -4
- langchain/chains/openai_tools/extraction.py +7 -8
- langchain/chains/qa_generation/base.py +4 -3
- langchain/chains/qa_generation/prompt.py +5 -5
- langchain/chains/qa_with_sources/base.py +14 -6
- langchain/chains/qa_with_sources/loading.py +16 -8
- langchain/chains/qa_with_sources/map_reduce_prompt.py +8 -9
- langchain/chains/qa_with_sources/refine_prompts.py +0 -1
- langchain/chains/qa_with_sources/retrieval.py +14 -5
- langchain/chains/qa_with_sources/stuff_prompt.py +6 -7
- langchain/chains/qa_with_sources/vector_db.py +17 -6
- langchain/chains/query_constructor/base.py +34 -33
- langchain/chains/query_constructor/ir.py +4 -4
- langchain/chains/query_constructor/parser.py +37 -32
- langchain/chains/query_constructor/prompt.py +5 -6
- langchain/chains/question_answering/chain.py +21 -10
- langchain/chains/question_answering/map_reduce_prompt.py +14 -14
- langchain/chains/question_answering/map_rerank_prompt.py +3 -3
- langchain/chains/question_answering/refine_prompts.py +2 -5
- langchain/chains/question_answering/stuff_prompt.py +5 -5
- langchain/chains/retrieval.py +1 -3
- langchain/chains/retrieval_qa/base.py +34 -27
- langchain/chains/retrieval_qa/prompt.py +1 -2
- langchain/chains/router/__init__.py +3 -3
- langchain/chains/router/base.py +24 -20
- langchain/chains/router/embedding_router.py +12 -8
- langchain/chains/router/llm_router.py +17 -16
- langchain/chains/router/multi_prompt.py +2 -2
- langchain/chains/router/multi_retrieval_qa.py +10 -5
- langchain/chains/sequential.py +30 -18
- langchain/chains/sql_database/prompt.py +14 -16
- langchain/chains/sql_database/query.py +6 -5
- langchain/chains/structured_output/__init__.py +1 -1
- langchain/chains/structured_output/base.py +75 -67
- langchain/chains/summarize/chain.py +11 -5
- langchain/chains/summarize/map_reduce_prompt.py +0 -1
- langchain/chains/summarize/stuff_prompt.py +0 -1
- langchain/chains/transform.py +5 -6
- langchain/chat_loaders/facebook_messenger.py +1 -1
- langchain/chat_loaders/langsmith.py +1 -1
- langchain/chat_loaders/utils.py +3 -3
- langchain/chat_models/__init__.py +20 -19
- langchain/chat_models/anthropic.py +1 -1
- langchain/chat_models/azureml_endpoint.py +1 -1
- langchain/chat_models/baidu_qianfan_endpoint.py +1 -1
- langchain/chat_models/base.py +160 -123
- langchain/chat_models/bedrock.py +1 -1
- langchain/chat_models/fake.py +1 -1
- langchain/chat_models/meta.py +1 -1
- langchain/chat_models/pai_eas_endpoint.py +1 -1
- langchain/chat_models/promptlayer_openai.py +1 -1
- langchain/chat_models/volcengine_maas.py +1 -1
- langchain/docstore/base.py +1 -1
- langchain/document_loaders/__init__.py +9 -9
- langchain/document_loaders/airbyte.py +3 -3
- langchain/document_loaders/assemblyai.py +1 -1
- langchain/document_loaders/azure_blob_storage_container.py +1 -1
- langchain/document_loaders/azure_blob_storage_file.py +1 -1
- langchain/document_loaders/baiducloud_bos_file.py +1 -1
- langchain/document_loaders/base.py +1 -1
- langchain/document_loaders/blob_loaders/__init__.py +1 -1
- langchain/document_loaders/blockchain.py +1 -1
- langchain/document_loaders/chatgpt.py +1 -1
- langchain/document_loaders/college_confidential.py +1 -1
- langchain/document_loaders/confluence.py +1 -1
- langchain/document_loaders/email.py +1 -1
- langchain/document_loaders/facebook_chat.py +1 -1
- langchain/document_loaders/markdown.py +1 -1
- langchain/document_loaders/notebook.py +1 -1
- langchain/document_loaders/org_mode.py +1 -1
- langchain/document_loaders/parsers/__init__.py +1 -1
- langchain/document_loaders/parsers/docai.py +1 -1
- langchain/document_loaders/parsers/generic.py +1 -1
- langchain/document_loaders/parsers/html/__init__.py +1 -1
- langchain/document_loaders/parsers/html/bs4.py +1 -1
- langchain/document_loaders/parsers/language/cobol.py +1 -1
- langchain/document_loaders/parsers/language/python.py +1 -1
- langchain/document_loaders/parsers/msword.py +1 -1
- langchain/document_loaders/parsers/pdf.py +5 -5
- langchain/document_loaders/parsers/registry.py +1 -1
- langchain/document_loaders/pdf.py +8 -8
- langchain/document_loaders/powerpoint.py +1 -1
- langchain/document_loaders/pyspark_dataframe.py +1 -1
- langchain/document_loaders/telegram.py +2 -2
- langchain/document_loaders/tencent_cos_directory.py +1 -1
- langchain/document_loaders/unstructured.py +5 -5
- langchain/document_loaders/url_playwright.py +1 -1
- langchain/document_loaders/whatsapp_chat.py +1 -1
- langchain/document_loaders/youtube.py +2 -2
- langchain/document_transformers/__init__.py +3 -3
- langchain/document_transformers/beautiful_soup_transformer.py +1 -1
- langchain/document_transformers/doctran_text_extract.py +1 -1
- langchain/document_transformers/doctran_text_qa.py +1 -1
- langchain/document_transformers/doctran_text_translate.py +1 -1
- langchain/document_transformers/embeddings_redundant_filter.py +3 -3
- langchain/document_transformers/google_translate.py +1 -1
- langchain/document_transformers/html2text.py +1 -1
- langchain/document_transformers/nuclia_text_transform.py +1 -1
- langchain/embeddings/__init__.py +5 -5
- langchain/embeddings/base.py +33 -24
- langchain/embeddings/cache.py +36 -31
- langchain/embeddings/fake.py +1 -1
- langchain/embeddings/huggingface.py +2 -2
- langchain/evaluation/__init__.py +22 -22
- langchain/evaluation/agents/trajectory_eval_chain.py +23 -23
- langchain/evaluation/agents/trajectory_eval_prompt.py +6 -9
- langchain/evaluation/comparison/__init__.py +1 -1
- langchain/evaluation/comparison/eval_chain.py +20 -13
- langchain/evaluation/comparison/prompt.py +1 -2
- langchain/evaluation/criteria/__init__.py +1 -1
- langchain/evaluation/criteria/eval_chain.py +20 -11
- langchain/evaluation/criteria/prompt.py +2 -3
- langchain/evaluation/embedding_distance/base.py +23 -20
- langchain/evaluation/loading.py +15 -11
- langchain/evaluation/parsing/base.py +4 -1
- langchain/evaluation/parsing/json_distance.py +5 -2
- langchain/evaluation/parsing/json_schema.py +12 -8
- langchain/evaluation/qa/__init__.py +1 -1
- langchain/evaluation/qa/eval_chain.py +12 -5
- langchain/evaluation/qa/eval_prompt.py +7 -8
- langchain/evaluation/qa/generate_chain.py +2 -1
- langchain/evaluation/qa/generate_prompt.py +2 -4
- langchain/evaluation/schema.py +38 -30
- langchain/evaluation/scoring/__init__.py +1 -1
- langchain/evaluation/scoring/eval_chain.py +22 -15
- langchain/evaluation/scoring/prompt.py +0 -1
- langchain/evaluation/string_distance/base.py +14 -9
- langchain/globals.py +12 -11
- langchain/graphs/__init__.py +6 -6
- langchain/graphs/graph_document.py +1 -1
- langchain/graphs/networkx_graph.py +2 -2
- langchain/hub.py +9 -11
- langchain/indexes/__init__.py +3 -3
- langchain/indexes/_sql_record_manager.py +63 -46
- langchain/indexes/prompts/entity_extraction.py +1 -2
- langchain/indexes/prompts/entity_summarization.py +1 -2
- langchain/indexes/prompts/knowledge_triplet_extraction.py +1 -3
- langchain/indexes/vectorstore.py +35 -19
- langchain/llms/__init__.py +13 -13
- langchain/llms/ai21.py +1 -1
- langchain/llms/azureml_endpoint.py +4 -4
- langchain/llms/base.py +15 -7
- langchain/llms/bedrock.py +1 -1
- langchain/llms/cloudflare_workersai.py +1 -1
- langchain/llms/gradient_ai.py +1 -1
- langchain/llms/loading.py +1 -1
- langchain/llms/openai.py +1 -1
- langchain/llms/sagemaker_endpoint.py +1 -1
- langchain/load/dump.py +1 -1
- langchain/load/load.py +1 -1
- langchain/load/serializable.py +3 -3
- langchain/memory/__init__.py +3 -3
- langchain/memory/buffer.py +9 -7
- langchain/memory/chat_memory.py +14 -8
- langchain/memory/chat_message_histories/__init__.py +1 -1
- langchain/memory/chat_message_histories/astradb.py +1 -1
- langchain/memory/chat_message_histories/cassandra.py +1 -1
- langchain/memory/chat_message_histories/cosmos_db.py +1 -1
- langchain/memory/chat_message_histories/dynamodb.py +1 -1
- langchain/memory/chat_message_histories/elasticsearch.py +1 -1
- langchain/memory/chat_message_histories/file.py +1 -1
- langchain/memory/chat_message_histories/firestore.py +1 -1
- langchain/memory/chat_message_histories/momento.py +1 -1
- langchain/memory/chat_message_histories/mongodb.py +1 -1
- langchain/memory/chat_message_histories/neo4j.py +1 -1
- langchain/memory/chat_message_histories/postgres.py +1 -1
- langchain/memory/chat_message_histories/redis.py +1 -1
- langchain/memory/chat_message_histories/rocksetdb.py +1 -1
- langchain/memory/chat_message_histories/singlestoredb.py +1 -1
- langchain/memory/chat_message_histories/streamlit.py +1 -1
- langchain/memory/chat_message_histories/upstash_redis.py +1 -1
- langchain/memory/chat_message_histories/xata.py +1 -1
- langchain/memory/chat_message_histories/zep.py +1 -1
- langchain/memory/combined.py +13 -12
- langchain/memory/entity.py +84 -61
- langchain/memory/prompt.py +10 -11
- langchain/memory/readonly.py +0 -2
- langchain/memory/simple.py +1 -3
- langchain/memory/summary.py +13 -11
- langchain/memory/summary_buffer.py +17 -8
- langchain/memory/utils.py +3 -2
- langchain/memory/vectorstore.py +12 -5
- langchain/memory/vectorstore_token_buffer_memory.py +5 -5
- langchain/model_laboratory.py +12 -11
- langchain/output_parsers/__init__.py +4 -4
- langchain/output_parsers/boolean.py +7 -4
- langchain/output_parsers/combining.py +10 -5
- langchain/output_parsers/datetime.py +32 -31
- langchain/output_parsers/enum.py +5 -3
- langchain/output_parsers/fix.py +52 -52
- langchain/output_parsers/format_instructions.py +6 -8
- langchain/output_parsers/json.py +2 -2
- langchain/output_parsers/list.py +2 -2
- langchain/output_parsers/loading.py +9 -9
- langchain/output_parsers/openai_functions.py +3 -3
- langchain/output_parsers/openai_tools.py +1 -1
- langchain/output_parsers/pandas_dataframe.py +43 -47
- langchain/output_parsers/prompts.py +1 -2
- langchain/output_parsers/rail_parser.py +1 -1
- langchain/output_parsers/regex.py +7 -8
- langchain/output_parsers/regex_dict.py +7 -10
- langchain/output_parsers/retry.py +77 -78
- langchain/output_parsers/structured.py +11 -6
- langchain/output_parsers/yaml.py +15 -11
- langchain/prompts/__init__.py +5 -3
- langchain/prompts/base.py +5 -5
- langchain/prompts/chat.py +8 -8
- langchain/prompts/example_selector/__init__.py +3 -1
- langchain/prompts/example_selector/semantic_similarity.py +2 -2
- langchain/prompts/few_shot.py +1 -1
- langchain/prompts/loading.py +3 -3
- langchain/prompts/prompt.py +1 -1
- langchain/retrievers/__init__.py +5 -5
- langchain/retrievers/bedrock.py +2 -2
- langchain/retrievers/bm25.py +1 -1
- langchain/retrievers/contextual_compression.py +14 -8
- langchain/retrievers/docarray.py +1 -1
- langchain/retrievers/document_compressors/__init__.py +5 -4
- langchain/retrievers/document_compressors/base.py +12 -6
- langchain/retrievers/document_compressors/chain_extract.py +2 -2
- langchain/retrievers/document_compressors/chain_extract_prompt.py +2 -3
- langchain/retrievers/document_compressors/chain_filter.py +9 -9
- langchain/retrievers/document_compressors/chain_filter_prompt.py +1 -2
- langchain/retrievers/document_compressors/cohere_rerank.py +15 -15
- langchain/retrievers/document_compressors/embeddings_filter.py +21 -17
- langchain/retrievers/document_compressors/flashrank_rerank.py +1 -1
- langchain/retrievers/document_compressors/listwise_rerank.py +7 -5
- langchain/retrievers/ensemble.py +28 -25
- langchain/retrievers/google_cloud_documentai_warehouse.py +1 -1
- langchain/retrievers/google_vertex_ai_search.py +2 -2
- langchain/retrievers/kendra.py +10 -10
- langchain/retrievers/llama_index.py +1 -1
- langchain/retrievers/merger_retriever.py +11 -11
- langchain/retrievers/milvus.py +1 -1
- langchain/retrievers/multi_query.py +32 -26
- langchain/retrievers/multi_vector.py +20 -8
- langchain/retrievers/parent_document_retriever.py +18 -9
- langchain/retrievers/re_phraser.py +6 -5
- langchain/retrievers/self_query/base.py +138 -127
- langchain/retrievers/time_weighted_retriever.py +18 -7
- langchain/retrievers/zilliz.py +1 -1
- langchain/runnables/openai_functions.py +6 -2
- langchain/schema/__init__.py +23 -23
- langchain/schema/cache.py +1 -1
- langchain/schema/callbacks/base.py +7 -7
- langchain/schema/callbacks/manager.py +19 -19
- langchain/schema/callbacks/tracers/base.py +1 -1
- langchain/schema/callbacks/tracers/evaluation.py +1 -1
- langchain/schema/callbacks/tracers/langchain.py +1 -1
- langchain/schema/callbacks/tracers/langchain_v1.py +1 -1
- langchain/schema/callbacks/tracers/log_stream.py +1 -1
- langchain/schema/callbacks/tracers/schemas.py +8 -8
- langchain/schema/callbacks/tracers/stdout.py +3 -3
- langchain/schema/document.py +1 -1
- langchain/schema/language_model.py +2 -2
- langchain/schema/messages.py +12 -12
- langchain/schema/output.py +3 -3
- langchain/schema/output_parser.py +3 -3
- langchain/schema/runnable/__init__.py +3 -3
- langchain/schema/runnable/base.py +9 -9
- langchain/schema/runnable/config.py +5 -5
- langchain/schema/runnable/configurable.py +1 -1
- langchain/schema/runnable/history.py +1 -1
- langchain/schema/runnable/passthrough.py +1 -1
- langchain/schema/runnable/utils.py +16 -16
- langchain/schema/vectorstore.py +1 -1
- langchain/smith/__init__.py +1 -1
- langchain/smith/evaluation/__init__.py +2 -2
- langchain/smith/evaluation/config.py +10 -7
- langchain/smith/evaluation/name_generation.py +3 -3
- langchain/smith/evaluation/progress.py +11 -2
- langchain/smith/evaluation/runner_utils.py +179 -127
- langchain/smith/evaluation/string_run_evaluator.py +75 -68
- langchain/storage/__init__.py +2 -2
- langchain/storage/_lc_store.py +4 -2
- langchain/storage/encoder_backed.py +6 -2
- langchain/storage/file_system.py +19 -16
- langchain/storage/in_memory.py +1 -1
- langchain/storage/upstash_redis.py +1 -1
- langchain/text_splitter.py +15 -15
- langchain/tools/__init__.py +28 -26
- langchain/tools/ainetwork/app.py +1 -1
- langchain/tools/ainetwork/base.py +1 -1
- langchain/tools/ainetwork/owner.py +1 -1
- langchain/tools/ainetwork/rule.py +1 -1
- langchain/tools/ainetwork/transfer.py +1 -1
- langchain/tools/ainetwork/value.py +1 -1
- langchain/tools/amadeus/closest_airport.py +1 -1
- langchain/tools/amadeus/flight_search.py +1 -1
- langchain/tools/azure_cognitive_services/__init__.py +1 -1
- langchain/tools/base.py +4 -4
- langchain/tools/bearly/tool.py +1 -1
- langchain/tools/bing_search/__init__.py +1 -1
- langchain/tools/bing_search/tool.py +1 -1
- langchain/tools/dataforseo_api_search/__init__.py +1 -1
- langchain/tools/dataforseo_api_search/tool.py +1 -1
- langchain/tools/ddg_search/tool.py +1 -1
- langchain/tools/e2b_data_analysis/tool.py +2 -2
- langchain/tools/edenai/__init__.py +1 -1
- langchain/tools/file_management/__init__.py +1 -1
- langchain/tools/file_management/copy.py +1 -1
- langchain/tools/file_management/delete.py +1 -1
- langchain/tools/gmail/__init__.py +2 -2
- langchain/tools/gmail/get_message.py +1 -1
- langchain/tools/gmail/search.py +1 -1
- langchain/tools/gmail/send_message.py +1 -1
- langchain/tools/google_finance/__init__.py +1 -1
- langchain/tools/google_finance/tool.py +1 -1
- langchain/tools/google_scholar/__init__.py +1 -1
- langchain/tools/google_scholar/tool.py +1 -1
- langchain/tools/google_search/__init__.py +1 -1
- langchain/tools/google_search/tool.py +1 -1
- langchain/tools/google_serper/__init__.py +1 -1
- langchain/tools/google_serper/tool.py +1 -1
- langchain/tools/google_trends/__init__.py +1 -1
- langchain/tools/google_trends/tool.py +1 -1
- langchain/tools/jira/tool.py +20 -1
- langchain/tools/json/tool.py +25 -3
- langchain/tools/memorize/tool.py +1 -1
- langchain/tools/multion/__init__.py +1 -1
- langchain/tools/multion/update_session.py +1 -1
- langchain/tools/office365/__init__.py +2 -2
- langchain/tools/office365/events_search.py +1 -1
- langchain/tools/office365/messages_search.py +1 -1
- langchain/tools/office365/send_event.py +1 -1
- langchain/tools/office365/send_message.py +1 -1
- langchain/tools/openapi/utils/api_models.py +6 -6
- langchain/tools/playwright/__init__.py +5 -5
- langchain/tools/playwright/click.py +1 -1
- langchain/tools/playwright/extract_hyperlinks.py +1 -1
- langchain/tools/playwright/get_elements.py +1 -1
- langchain/tools/playwright/navigate.py +1 -1
- langchain/tools/plugin.py +2 -2
- langchain/tools/powerbi/tool.py +1 -1
- langchain/tools/python/__init__.py +2 -1
- langchain/tools/reddit_search/tool.py +1 -1
- langchain/tools/render.py +2 -2
- langchain/tools/requests/tool.py +2 -2
- langchain/tools/searchapi/tool.py +1 -1
- langchain/tools/searx_search/tool.py +1 -1
- langchain/tools/slack/get_message.py +1 -1
- langchain/tools/spark_sql/tool.py +1 -1
- langchain/tools/sql_database/tool.py +1 -1
- langchain/tools/tavily_search/__init__.py +1 -1
- langchain/tools/tavily_search/tool.py +1 -1
- langchain/tools/zapier/__init__.py +1 -1
- langchain/tools/zapier/tool.py +24 -2
- langchain/utilities/__init__.py +4 -4
- langchain/utilities/arcee.py +4 -4
- langchain/utilities/clickup.py +4 -4
- langchain/utilities/dalle_image_generator.py +1 -1
- langchain/utilities/dataforseo_api_search.py +1 -1
- langchain/utilities/opaqueprompts.py +1 -1
- langchain/utilities/reddit_search.py +1 -1
- langchain/utilities/sql_database.py +1 -1
- langchain/utilities/tavily_search.py +1 -1
- langchain/utilities/vertexai.py +2 -2
- langchain/utils/__init__.py +1 -1
- langchain/utils/aiter.py +1 -1
- langchain/utils/html.py +3 -3
- langchain/utils/input.py +1 -1
- langchain/utils/iter.py +1 -1
- langchain/utils/json_schema.py +1 -3
- langchain/utils/strings.py +1 -1
- langchain/utils/utils.py +6 -6
- langchain/vectorstores/__init__.py +5 -5
- langchain/vectorstores/alibabacloud_opensearch.py +1 -1
- langchain/vectorstores/azure_cosmos_db.py +1 -1
- langchain/vectorstores/clickhouse.py +1 -1
- langchain/vectorstores/elastic_vector_search.py +1 -1
- langchain/vectorstores/elasticsearch.py +2 -2
- langchain/vectorstores/myscale.py +1 -1
- langchain/vectorstores/neo4j_vector.py +1 -1
- langchain/vectorstores/pgembedding.py +1 -1
- langchain/vectorstores/qdrant.py +1 -1
- langchain/vectorstores/redis/__init__.py +1 -1
- langchain/vectorstores/redis/base.py +1 -1
- langchain/vectorstores/redis/filters.py +4 -4
- langchain/vectorstores/redis/schema.py +6 -6
- langchain/vectorstores/sklearn.py +2 -2
- langchain/vectorstores/starrocks.py +1 -1
- langchain/vectorstores/utils.py +1 -1
- {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/METADATA +4 -4
- {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/RECORD +580 -580
- {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/WHEEL +1 -1
- {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/entry_points.txt +0 -0
- {langchain-0.3.26.dist-info → langchain-0.3.27.dist-info}/licenses/LICENSE +0 -0
langchain/prompts/prompt.py
CHANGED
langchain/retrievers/__init__.py
CHANGED
|
@@ -148,8 +148,8 @@ __all__ = [
|
|
|
148
148
|
"GoogleDocumentAIWarehouseRetriever",
|
|
149
149
|
"GoogleVertexAIMultiTurnSearchRetriever",
|
|
150
150
|
"GoogleVertexAISearchRetriever",
|
|
151
|
-
"KayAiRetriever",
|
|
152
151
|
"KNNRetriever",
|
|
152
|
+
"KayAiRetriever",
|
|
153
153
|
"LlamaIndexGraphRetriever",
|
|
154
154
|
"LlamaIndexRetriever",
|
|
155
155
|
"MergerRetriever",
|
|
@@ -157,22 +157,22 @@ __all__ = [
|
|
|
157
157
|
"MilvusRetriever",
|
|
158
158
|
"MultiQueryRetriever",
|
|
159
159
|
"MultiVectorRetriever",
|
|
160
|
+
"NeuralDBRetriever",
|
|
160
161
|
"OutlineRetriever",
|
|
161
162
|
"ParentDocumentRetriever",
|
|
162
163
|
"PineconeHybridSearchRetriever",
|
|
163
164
|
"PubMedRetriever",
|
|
164
|
-
"RemoteLangChainRetriever",
|
|
165
165
|
"RePhraseQueryRetriever",
|
|
166
|
-
"
|
|
166
|
+
"RemoteLangChainRetriever",
|
|
167
167
|
"SVMRetriever",
|
|
168
|
-
"
|
|
168
|
+
"SelfQueryRetriever",
|
|
169
169
|
"TFIDFRetriever",
|
|
170
|
+
"TavilySearchAPIRetriever",
|
|
170
171
|
"TimeWeightedVectorStoreRetriever",
|
|
171
172
|
"VespaRetriever",
|
|
172
173
|
"WeaviateHybridSearchRetriever",
|
|
173
174
|
"WebResearchRetriever",
|
|
174
175
|
"WikipediaRetriever",
|
|
175
176
|
"ZepRetriever",
|
|
176
|
-
"NeuralDBRetriever",
|
|
177
177
|
"ZillizRetriever",
|
|
178
178
|
]
|
langchain/retrievers/bedrock.py
CHANGED
langchain/retrievers/bm25.py
CHANGED
|
@@ -38,15 +38,18 @@ class ContextualCompressionRetriever(BaseRetriever):
|
|
|
38
38
|
Sequence of relevant documents
|
|
39
39
|
"""
|
|
40
40
|
docs = self.base_retriever.invoke(
|
|
41
|
-
query,
|
|
41
|
+
query,
|
|
42
|
+
config={"callbacks": run_manager.get_child()},
|
|
43
|
+
**kwargs,
|
|
42
44
|
)
|
|
43
45
|
if docs:
|
|
44
46
|
compressed_docs = self.base_compressor.compress_documents(
|
|
45
|
-
docs,
|
|
47
|
+
docs,
|
|
48
|
+
query,
|
|
49
|
+
callbacks=run_manager.get_child(),
|
|
46
50
|
)
|
|
47
51
|
return list(compressed_docs)
|
|
48
|
-
|
|
49
|
-
return []
|
|
52
|
+
return []
|
|
50
53
|
|
|
51
54
|
async def _aget_relevant_documents(
|
|
52
55
|
self,
|
|
@@ -64,12 +67,15 @@ class ContextualCompressionRetriever(BaseRetriever):
|
|
|
64
67
|
List of relevant documents
|
|
65
68
|
"""
|
|
66
69
|
docs = await self.base_retriever.ainvoke(
|
|
67
|
-
query,
|
|
70
|
+
query,
|
|
71
|
+
config={"callbacks": run_manager.get_child()},
|
|
72
|
+
**kwargs,
|
|
68
73
|
)
|
|
69
74
|
if docs:
|
|
70
75
|
compressed_docs = await self.base_compressor.acompress_documents(
|
|
71
|
-
docs,
|
|
76
|
+
docs,
|
|
77
|
+
query,
|
|
78
|
+
callbacks=run_manager.get_child(),
|
|
72
79
|
)
|
|
73
80
|
return list(compressed_docs)
|
|
74
|
-
|
|
75
|
-
return []
|
|
81
|
+
return []
|
langchain/retrievers/docarray.py
CHANGED
|
@@ -28,16 +28,17 @@ def __getattr__(name: str) -> Any:
|
|
|
28
28
|
if name in _module_lookup:
|
|
29
29
|
module = importlib.import_module(_module_lookup[name])
|
|
30
30
|
return getattr(module, name)
|
|
31
|
-
|
|
31
|
+
msg = f"module {__name__} has no attribute {name}"
|
|
32
|
+
raise AttributeError(msg)
|
|
32
33
|
|
|
33
34
|
|
|
34
35
|
__all__ = [
|
|
36
|
+
"CohereRerank",
|
|
37
|
+
"CrossEncoderReranker",
|
|
35
38
|
"DocumentCompressorPipeline",
|
|
36
39
|
"EmbeddingsFilter",
|
|
37
40
|
"FlashrankRerank",
|
|
38
|
-
"LLMListwiseRerank",
|
|
39
41
|
"LLMChainExtractor",
|
|
40
42
|
"LLMChainFilter",
|
|
41
|
-
"
|
|
42
|
-
"CrossEncoderReranker",
|
|
43
|
+
"LLMListwiseRerank",
|
|
43
44
|
]
|
|
@@ -32,20 +32,23 @@ class DocumentCompressorPipeline(BaseDocumentCompressor):
|
|
|
32
32
|
if isinstance(_transformer, BaseDocumentCompressor):
|
|
33
33
|
accepts_callbacks = (
|
|
34
34
|
signature(_transformer.compress_documents).parameters.get(
|
|
35
|
-
"callbacks"
|
|
35
|
+
"callbacks",
|
|
36
36
|
)
|
|
37
37
|
is not None
|
|
38
38
|
)
|
|
39
39
|
if accepts_callbacks:
|
|
40
40
|
documents = _transformer.compress_documents(
|
|
41
|
-
documents,
|
|
41
|
+
documents,
|
|
42
|
+
query,
|
|
43
|
+
callbacks=callbacks,
|
|
42
44
|
)
|
|
43
45
|
else:
|
|
44
46
|
documents = _transformer.compress_documents(documents, query)
|
|
45
47
|
elif isinstance(_transformer, BaseDocumentTransformer):
|
|
46
48
|
documents = _transformer.transform_documents(documents)
|
|
47
49
|
else:
|
|
48
|
-
|
|
50
|
+
msg = f"Got unexpected transformer type: {_transformer}"
|
|
51
|
+
raise ValueError(msg) # noqa: TRY004
|
|
49
52
|
return documents
|
|
50
53
|
|
|
51
54
|
async def acompress_documents(
|
|
@@ -59,18 +62,21 @@ class DocumentCompressorPipeline(BaseDocumentCompressor):
|
|
|
59
62
|
if isinstance(_transformer, BaseDocumentCompressor):
|
|
60
63
|
accepts_callbacks = (
|
|
61
64
|
signature(_transformer.acompress_documents).parameters.get(
|
|
62
|
-
"callbacks"
|
|
65
|
+
"callbacks",
|
|
63
66
|
)
|
|
64
67
|
is not None
|
|
65
68
|
)
|
|
66
69
|
if accepts_callbacks:
|
|
67
70
|
documents = await _transformer.acompress_documents(
|
|
68
|
-
documents,
|
|
71
|
+
documents,
|
|
72
|
+
query,
|
|
73
|
+
callbacks=callbacks,
|
|
69
74
|
)
|
|
70
75
|
else:
|
|
71
76
|
documents = await _transformer.acompress_documents(documents, query)
|
|
72
77
|
elif isinstance(_transformer, BaseDocumentTransformer):
|
|
73
78
|
documents = await _transformer.atransform_documents(documents)
|
|
74
79
|
else:
|
|
75
|
-
|
|
80
|
+
msg = f"Got unexpected transformer type: {_transformer}"
|
|
81
|
+
raise ValueError(msg) # noqa: TRY004
|
|
76
82
|
return documents
|
|
@@ -80,7 +80,7 @@ class LLMChainExtractor(BaseDocumentCompressor):
|
|
|
80
80
|
if len(output) == 0:
|
|
81
81
|
continue
|
|
82
82
|
compressed_docs.append(
|
|
83
|
-
Document(page_content=cast(str, output), metadata=doc.metadata)
|
|
83
|
+
Document(page_content=cast(str, output), metadata=doc.metadata),
|
|
84
84
|
)
|
|
85
85
|
return compressed_docs
|
|
86
86
|
|
|
@@ -98,7 +98,7 @@ class LLMChainExtractor(BaseDocumentCompressor):
|
|
|
98
98
|
if len(outputs[i]) == 0:
|
|
99
99
|
continue
|
|
100
100
|
compressed_docs.append(
|
|
101
|
-
Document(page_content=outputs[i], metadata=doc.metadata)
|
|
101
|
+
Document(page_content=outputs[i], metadata=doc.metadata),
|
|
102
102
|
)
|
|
103
103
|
return compressed_docs
|
|
104
104
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
prompt_template = """Given the following question and context, extract any part of the context *AS IS* that is relevant to answer the question. If none of the context is relevant return {no_output_str}.
|
|
1
|
+
prompt_template = """Given the following question and context, extract any part of the context *AS IS* that is relevant to answer the question. If none of the context is relevant return {no_output_str}.
|
|
3
2
|
|
|
4
3
|
Remember, *DO NOT* edit the extracted parts of the context.
|
|
5
4
|
|
|
@@ -8,4 +7,4 @@ Remember, *DO NOT* edit the extracted parts of the context.
|
|
|
8
7
|
>>>
|
|
9
8
|
{{context}}
|
|
10
9
|
>>>
|
|
11
|
-
Extracted relevant parts:"""
|
|
10
|
+
Extracted relevant parts:""" # noqa: E501
|
|
@@ -36,7 +36,7 @@ class LLMChainFilter(BaseDocumentCompressor):
|
|
|
36
36
|
"""Filter that drops documents that aren't relevant to the query."""
|
|
37
37
|
|
|
38
38
|
llm_chain: Runnable
|
|
39
|
-
"""LLM wrapper to use for filtering documents.
|
|
39
|
+
"""LLM wrapper to use for filtering documents.
|
|
40
40
|
The chain prompt is expected to have a BooleanOutputParser."""
|
|
41
41
|
|
|
42
42
|
get_input: Callable[[str, Document], dict] = default_get_input
|
|
@@ -58,7 +58,8 @@ class LLMChainFilter(BaseDocumentCompressor):
|
|
|
58
58
|
config = RunnableConfig(callbacks=callbacks)
|
|
59
59
|
outputs = zip(
|
|
60
60
|
self.llm_chain.batch(
|
|
61
|
-
[self.get_input(query, doc) for doc in documents],
|
|
61
|
+
[self.get_input(query, doc) for doc in documents],
|
|
62
|
+
config=config,
|
|
62
63
|
),
|
|
63
64
|
documents,
|
|
64
65
|
)
|
|
@@ -69,9 +70,8 @@ class LLMChainFilter(BaseDocumentCompressor):
|
|
|
69
70
|
output = output_[self.llm_chain.output_key]
|
|
70
71
|
if self.llm_chain.prompt.output_parser is not None:
|
|
71
72
|
include_doc = self.llm_chain.prompt.output_parser.parse(output)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
include_doc = output_
|
|
73
|
+
elif isinstance(output_, bool):
|
|
74
|
+
include_doc = output_
|
|
75
75
|
if include_doc:
|
|
76
76
|
filtered_docs.append(doc)
|
|
77
77
|
|
|
@@ -89,7 +89,8 @@ class LLMChainFilter(BaseDocumentCompressor):
|
|
|
89
89
|
config = RunnableConfig(callbacks=callbacks)
|
|
90
90
|
outputs = zip(
|
|
91
91
|
await self.llm_chain.abatch(
|
|
92
|
-
[self.get_input(query, doc) for doc in documents],
|
|
92
|
+
[self.get_input(query, doc) for doc in documents],
|
|
93
|
+
config=config,
|
|
93
94
|
),
|
|
94
95
|
documents,
|
|
95
96
|
)
|
|
@@ -99,9 +100,8 @@ class LLMChainFilter(BaseDocumentCompressor):
|
|
|
99
100
|
output = output_[self.llm_chain.output_key]
|
|
100
101
|
if self.llm_chain.prompt.output_parser is not None:
|
|
101
102
|
include_doc = self.llm_chain.prompt.output_parser.parse(output)
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
include_doc = output_
|
|
103
|
+
elif isinstance(output_, bool):
|
|
104
|
+
include_doc = output_
|
|
105
105
|
if include_doc:
|
|
106
106
|
filtered_docs.append(doc)
|
|
107
107
|
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# flake8: noqa
|
|
2
1
|
prompt_template = """Given the following question and context, return YES if the context is relevant to the question and NO if it isn't.
|
|
3
2
|
|
|
4
3
|
> Question: {question}
|
|
@@ -6,4 +5,4 @@ prompt_template = """Given the following question and context, return YES if the
|
|
|
6
5
|
>>>
|
|
7
6
|
{context}
|
|
8
7
|
>>>
|
|
9
|
-
> Relevant (YES / NO):"""
|
|
8
|
+
> Relevant (YES / NO):""" # noqa: E501
|
|
@@ -12,7 +12,9 @@ from pydantic import ConfigDict, model_validator
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
@deprecated(
|
|
15
|
-
since="0.0.30",
|
|
15
|
+
since="0.0.30",
|
|
16
|
+
removal="1.0",
|
|
17
|
+
alternative_import="langchain_cohere.CohereRerank",
|
|
16
18
|
)
|
|
17
19
|
class CohereRerank(BaseDocumentCompressor):
|
|
18
20
|
"""Document compressor that uses `Cohere Rerank API`."""
|
|
@@ -24,7 +26,7 @@ class CohereRerank(BaseDocumentCompressor):
|
|
|
24
26
|
model: str = "rerank-english-v2.0"
|
|
25
27
|
"""Model to use for reranking."""
|
|
26
28
|
cohere_api_key: Optional[str] = None
|
|
27
|
-
"""Cohere API key. Must be specified directly or via environment variable
|
|
29
|
+
"""Cohere API key. Must be specified directly or via environment variable
|
|
28
30
|
COHERE_API_KEY."""
|
|
29
31
|
user_agent: str = "langchain"
|
|
30
32
|
"""Identifier for the application making the request."""
|
|
@@ -41,13 +43,16 @@ class CohereRerank(BaseDocumentCompressor):
|
|
|
41
43
|
if not values.get("client"):
|
|
42
44
|
try:
|
|
43
45
|
import cohere
|
|
44
|
-
except ImportError:
|
|
45
|
-
|
|
46
|
+
except ImportError as e:
|
|
47
|
+
msg = (
|
|
46
48
|
"Could not import cohere python package. "
|
|
47
49
|
"Please install it with `pip install cohere`."
|
|
48
50
|
)
|
|
51
|
+
raise ImportError(msg) from e
|
|
49
52
|
cohere_api_key = get_from_dict_or_env(
|
|
50
|
-
values,
|
|
53
|
+
values,
|
|
54
|
+
"cohere_api_key",
|
|
55
|
+
"COHERE_API_KEY",
|
|
51
56
|
)
|
|
52
57
|
client_name = values.get("user_agent", "langchain")
|
|
53
58
|
values["client"] = cohere.Client(cohere_api_key, client_name=client_name)
|
|
@@ -87,16 +92,11 @@ class CohereRerank(BaseDocumentCompressor):
|
|
|
87
92
|
max_chunks_per_doc=max_chunks_per_doc,
|
|
88
93
|
)
|
|
89
94
|
if hasattr(results, "results"):
|
|
90
|
-
results =
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
"index": res.index,
|
|
96
|
-
"relevance_score": res.relevance_score,
|
|
97
|
-
}
|
|
98
|
-
)
|
|
99
|
-
return result_dicts
|
|
95
|
+
results = results.results
|
|
96
|
+
return [
|
|
97
|
+
{"index": res.index, "relevance_score": res.relevance_score}
|
|
98
|
+
for res in results
|
|
99
|
+
]
|
|
100
100
|
|
|
101
101
|
def compress_documents(
|
|
102
102
|
self,
|
|
@@ -11,11 +11,12 @@ from pydantic import ConfigDict, Field
|
|
|
11
11
|
def _get_similarity_function() -> Callable:
|
|
12
12
|
try:
|
|
13
13
|
from langchain_community.utils.math import cosine_similarity
|
|
14
|
-
except ImportError:
|
|
15
|
-
|
|
14
|
+
except ImportError as e:
|
|
15
|
+
msg = (
|
|
16
16
|
"To use please install langchain-community "
|
|
17
17
|
"with `pip install langchain-community`."
|
|
18
18
|
)
|
|
19
|
+
raise ImportError(msg) from e
|
|
19
20
|
return cosine_similarity
|
|
20
21
|
|
|
21
22
|
|
|
@@ -45,7 +46,8 @@ class EmbeddingsFilter(BaseDocumentCompressor):
|
|
|
45
46
|
def validate_params(cls, values: dict) -> dict:
|
|
46
47
|
"""Validate similarity parameters."""
|
|
47
48
|
if values["k"] is None and values["similarity_threshold"] is None:
|
|
48
|
-
|
|
49
|
+
msg = "Must specify one of `k` or `similarity_threshold`."
|
|
50
|
+
raise ValueError(msg)
|
|
49
51
|
return values
|
|
50
52
|
|
|
51
53
|
def compress_documents(
|
|
@@ -60,21 +62,22 @@ class EmbeddingsFilter(BaseDocumentCompressor):
|
|
|
60
62
|
_get_embeddings_from_stateful_docs,
|
|
61
63
|
get_stateful_documents,
|
|
62
64
|
)
|
|
63
|
-
except ImportError:
|
|
64
|
-
|
|
65
|
+
except ImportError as e:
|
|
66
|
+
msg = (
|
|
65
67
|
"To use please install langchain-community "
|
|
66
68
|
"with `pip install langchain-community`."
|
|
67
69
|
)
|
|
70
|
+
raise ImportError(msg) from e
|
|
68
71
|
|
|
69
72
|
try:
|
|
70
73
|
import numpy as np
|
|
71
74
|
except ImportError as e:
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
) from e
|
|
75
|
+
msg = "Could not import numpy, please install with `pip install numpy`."
|
|
76
|
+
raise ImportError(msg) from e
|
|
75
77
|
stateful_documents = get_stateful_documents(documents)
|
|
76
78
|
embedded_documents = _get_embeddings_from_stateful_docs(
|
|
77
|
-
self.embeddings,
|
|
79
|
+
self.embeddings,
|
|
80
|
+
stateful_documents,
|
|
78
81
|
)
|
|
79
82
|
embedded_query = self.embeddings.embed_query(query)
|
|
80
83
|
similarity = self.similarity_fn([embedded_query], embedded_documents)[0]
|
|
@@ -83,7 +86,7 @@ class EmbeddingsFilter(BaseDocumentCompressor):
|
|
|
83
86
|
included_idxs = np.argsort(similarity)[::-1][: self.k]
|
|
84
87
|
if self.similarity_threshold is not None:
|
|
85
88
|
similar_enough = np.where(
|
|
86
|
-
similarity[included_idxs] > self.similarity_threshold
|
|
89
|
+
similarity[included_idxs] > self.similarity_threshold,
|
|
87
90
|
)
|
|
88
91
|
included_idxs = included_idxs[similar_enough]
|
|
89
92
|
for i in included_idxs:
|
|
@@ -102,21 +105,22 @@ class EmbeddingsFilter(BaseDocumentCompressor):
|
|
|
102
105
|
_aget_embeddings_from_stateful_docs,
|
|
103
106
|
get_stateful_documents,
|
|
104
107
|
)
|
|
105
|
-
except ImportError:
|
|
106
|
-
|
|
108
|
+
except ImportError as e:
|
|
109
|
+
msg = (
|
|
107
110
|
"To use please install langchain-community "
|
|
108
111
|
"with `pip install langchain-community`."
|
|
109
112
|
)
|
|
113
|
+
raise ImportError(msg) from e
|
|
110
114
|
|
|
111
115
|
try:
|
|
112
116
|
import numpy as np
|
|
113
117
|
except ImportError as e:
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
) from e
|
|
118
|
+
msg = "Could not import numpy, please install with `pip install numpy`."
|
|
119
|
+
raise ImportError(msg) from e
|
|
117
120
|
stateful_documents = get_stateful_documents(documents)
|
|
118
121
|
embedded_documents = await _aget_embeddings_from_stateful_docs(
|
|
119
|
-
self.embeddings,
|
|
122
|
+
self.embeddings,
|
|
123
|
+
stateful_documents,
|
|
120
124
|
)
|
|
121
125
|
embedded_query = await self.embeddings.aembed_query(query)
|
|
122
126
|
similarity = self.similarity_fn([embedded_query], embedded_documents)[0]
|
|
@@ -125,7 +129,7 @@ class EmbeddingsFilter(BaseDocumentCompressor):
|
|
|
125
129
|
included_idxs = np.argsort(similarity)[::-1][: self.k]
|
|
126
130
|
if self.similarity_threshold is not None:
|
|
127
131
|
similar_enough = np.where(
|
|
128
|
-
similarity[included_idxs] > self.similarity_threshold
|
|
132
|
+
similarity[included_idxs] > self.similarity_threshold,
|
|
129
133
|
)
|
|
130
134
|
included_idxs = included_idxs[similar_enough]
|
|
131
135
|
for i in included_idxs:
|
|
@@ -11,7 +11,7 @@ if TYPE_CHECKING:
|
|
|
11
11
|
# Used to consolidate logic for raising deprecation warnings and
|
|
12
12
|
# handling optional imports.
|
|
13
13
|
DEPRECATED_LOOKUP = {
|
|
14
|
-
"FlashrankRerank": "langchain_community.document_compressors.flashrank_rerank"
|
|
14
|
+
"FlashrankRerank": "langchain_community.document_compressors.flashrank_rerank",
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
_import_attribute = create_importer(__package__, deprecated_lookups=DEPRECATED_LOOKUP)
|
|
@@ -73,8 +73,8 @@ class LLMListwiseRerank(BaseDocumentCompressor):
|
|
|
73
73
|
"""
|
|
74
74
|
|
|
75
75
|
reranker: Runnable[dict, list[Document]]
|
|
76
|
-
"""LLM-based reranker to use for filtering documents. Expected to take in a dict
|
|
77
|
-
with 'documents: Sequence[Document]' and 'query: str' keys and output a
|
|
76
|
+
"""LLM-based reranker to use for filtering documents. Expected to take in a dict
|
|
77
|
+
with 'documents: Sequence[Document]' and 'query: str' keys and output a
|
|
78
78
|
List[Document]."""
|
|
79
79
|
|
|
80
80
|
top_n: int = 3
|
|
@@ -92,7 +92,8 @@ class LLMListwiseRerank(BaseDocumentCompressor):
|
|
|
92
92
|
) -> Sequence[Document]:
|
|
93
93
|
"""Filter down documents based on their relevance to the query."""
|
|
94
94
|
results = self.reranker.invoke(
|
|
95
|
-
{"documents": documents, "query": query},
|
|
95
|
+
{"documents": documents, "query": query},
|
|
96
|
+
config={"callbacks": callbacks},
|
|
96
97
|
)
|
|
97
98
|
return results[: self.top_n]
|
|
98
99
|
|
|
@@ -117,9 +118,10 @@ class LLMListwiseRerank(BaseDocumentCompressor):
|
|
|
117
118
|
"""
|
|
118
119
|
|
|
119
120
|
if llm.with_structured_output == BaseLanguageModel.with_structured_output:
|
|
120
|
-
|
|
121
|
+
msg = (
|
|
121
122
|
f"llm of type {type(llm)} does not implement `with_structured_output`."
|
|
122
123
|
)
|
|
124
|
+
raise ValueError(msg)
|
|
123
125
|
|
|
124
126
|
class RankDocuments(BaseModel):
|
|
125
127
|
"""Rank the documents by their relevance to the user question.
|
|
@@ -137,6 +139,6 @@ class LLMListwiseRerank(BaseDocumentCompressor):
|
|
|
137
139
|
reranker = RunnablePassthrough.assign(
|
|
138
140
|
ranking=RunnableLambda(_get_prompt_input)
|
|
139
141
|
| _prompt
|
|
140
|
-
| llm.with_structured_output(RankDocuments)
|
|
142
|
+
| llm.with_structured_output(RankDocuments),
|
|
141
143
|
) | RunnableLambda(_parse_ranking)
|
|
142
144
|
return cls(reranker=reranker, **kwargs)
|
langchain/retrievers/ensemble.py
CHANGED
|
@@ -28,6 +28,7 @@ from langchain_core.runnables.utils import (
|
|
|
28
28
|
get_unique_config_specs,
|
|
29
29
|
)
|
|
30
30
|
from pydantic import model_validator
|
|
31
|
+
from typing_extensions import override
|
|
31
32
|
|
|
32
33
|
T = TypeVar("T")
|
|
33
34
|
H = TypeVar("H", bound=Hashable)
|
|
@@ -86,8 +87,12 @@ class EnsembleRetriever(BaseRetriever):
|
|
|
86
87
|
values["weights"] = [1 / n_retrievers] * n_retrievers
|
|
87
88
|
return values
|
|
88
89
|
|
|
90
|
+
@override
|
|
89
91
|
def invoke(
|
|
90
|
-
self,
|
|
92
|
+
self,
|
|
93
|
+
input: str,
|
|
94
|
+
config: Optional[RunnableConfig] = None,
|
|
95
|
+
**kwargs: Any,
|
|
91
96
|
) -> list[Document]:
|
|
92
97
|
from langchain_core.callbacks import CallbackManager
|
|
93
98
|
|
|
@@ -111,7 +116,7 @@ class EnsembleRetriever(BaseRetriever):
|
|
|
111
116
|
result = self.rank_fusion(input, run_manager=run_manager, config=config)
|
|
112
117
|
except Exception as e:
|
|
113
118
|
run_manager.on_retriever_error(e)
|
|
114
|
-
raise
|
|
119
|
+
raise
|
|
115
120
|
else:
|
|
116
121
|
run_manager.on_retriever_end(
|
|
117
122
|
result,
|
|
@@ -119,8 +124,12 @@ class EnsembleRetriever(BaseRetriever):
|
|
|
119
124
|
)
|
|
120
125
|
return result
|
|
121
126
|
|
|
127
|
+
@override
|
|
122
128
|
async def ainvoke(
|
|
123
|
-
self,
|
|
129
|
+
self,
|
|
130
|
+
input: str,
|
|
131
|
+
config: Optional[RunnableConfig] = None,
|
|
132
|
+
**kwargs: Any,
|
|
124
133
|
) -> list[Document]:
|
|
125
134
|
from langchain_core.callbacks import AsyncCallbackManager
|
|
126
135
|
|
|
@@ -142,11 +151,13 @@ class EnsembleRetriever(BaseRetriever):
|
|
|
142
151
|
)
|
|
143
152
|
try:
|
|
144
153
|
result = await self.arank_fusion(
|
|
145
|
-
input,
|
|
154
|
+
input,
|
|
155
|
+
run_manager=run_manager,
|
|
156
|
+
config=config,
|
|
146
157
|
)
|
|
147
158
|
except Exception as e:
|
|
148
159
|
await run_manager.on_retriever_error(e)
|
|
149
|
-
raise
|
|
160
|
+
raise
|
|
150
161
|
else:
|
|
151
162
|
await run_manager.on_retriever_end(
|
|
152
163
|
result,
|
|
@@ -171,9 +182,7 @@ class EnsembleRetriever(BaseRetriever):
|
|
|
171
182
|
"""
|
|
172
183
|
|
|
173
184
|
# Get fused result of the retrievers.
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
return fused_documents
|
|
185
|
+
return self.rank_fusion(query, run_manager)
|
|
177
186
|
|
|
178
187
|
async def _aget_relevant_documents(
|
|
179
188
|
self,
|
|
@@ -192,9 +201,7 @@ class EnsembleRetriever(BaseRetriever):
|
|
|
192
201
|
"""
|
|
193
202
|
|
|
194
203
|
# Get fused result of the retrievers.
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
return fused_documents
|
|
204
|
+
return await self.arank_fusion(query, run_manager)
|
|
198
205
|
|
|
199
206
|
def rank_fusion(
|
|
200
207
|
self,
|
|
@@ -219,7 +226,8 @@ class EnsembleRetriever(BaseRetriever):
|
|
|
219
226
|
retriever.invoke(
|
|
220
227
|
query,
|
|
221
228
|
patch_config(
|
|
222
|
-
config,
|
|
229
|
+
config,
|
|
230
|
+
callbacks=run_manager.get_child(tag=f"retriever_{i + 1}"),
|
|
223
231
|
),
|
|
224
232
|
)
|
|
225
233
|
for i, retriever in enumerate(self.retrievers)
|
|
@@ -233,9 +241,7 @@ class EnsembleRetriever(BaseRetriever):
|
|
|
233
241
|
]
|
|
234
242
|
|
|
235
243
|
# apply rank fusion
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
return fused_documents
|
|
244
|
+
return self.weighted_reciprocal_rank(retriever_docs)
|
|
239
245
|
|
|
240
246
|
async def arank_fusion(
|
|
241
247
|
self,
|
|
@@ -266,7 +272,7 @@ class EnsembleRetriever(BaseRetriever):
|
|
|
266
272
|
),
|
|
267
273
|
)
|
|
268
274
|
for i, retriever in enumerate(self.retrievers)
|
|
269
|
-
]
|
|
275
|
+
],
|
|
270
276
|
)
|
|
271
277
|
|
|
272
278
|
# Enforce that retrieved docs are Documents for each list in retriever_docs
|
|
@@ -277,12 +283,11 @@ class EnsembleRetriever(BaseRetriever):
|
|
|
277
283
|
]
|
|
278
284
|
|
|
279
285
|
# apply rank fusion
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
return fused_documents
|
|
286
|
+
return self.weighted_reciprocal_rank(retriever_docs)
|
|
283
287
|
|
|
284
288
|
def weighted_reciprocal_rank(
|
|
285
|
-
self,
|
|
289
|
+
self,
|
|
290
|
+
doc_lists: list[list[Document]],
|
|
286
291
|
) -> list[Document]:
|
|
287
292
|
"""
|
|
288
293
|
Perform weighted Reciprocal Rank Fusion on multiple rank lists.
|
|
@@ -297,9 +302,8 @@ class EnsembleRetriever(BaseRetriever):
|
|
|
297
302
|
scores in descending order.
|
|
298
303
|
"""
|
|
299
304
|
if len(doc_lists) != len(self.weights):
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
)
|
|
305
|
+
msg = "Number of rank lists must be equal to the number of weights."
|
|
306
|
+
raise ValueError(msg)
|
|
303
307
|
|
|
304
308
|
# Associate each doc's content with its RRF score for later sorting by it
|
|
305
309
|
# Duplicated contents across retrievers are collapsed & scored cumulatively
|
|
@@ -316,7 +320,7 @@ class EnsembleRetriever(BaseRetriever):
|
|
|
316
320
|
|
|
317
321
|
# Docs are deduplicated by their contents then sorted by their scores
|
|
318
322
|
all_docs = chain.from_iterable(doc_lists)
|
|
319
|
-
|
|
323
|
+
return sorted(
|
|
320
324
|
unique_by_key(
|
|
321
325
|
all_docs,
|
|
322
326
|
lambda doc: (
|
|
@@ -330,4 +334,3 @@ class EnsembleRetriever(BaseRetriever):
|
|
|
330
334
|
doc.page_content if self.id_key is None else doc.metadata[self.id_key]
|
|
331
335
|
],
|
|
332
336
|
)
|
|
333
|
-
return sorted_docs
|
|
@@ -9,7 +9,7 @@ if TYPE_CHECKING:
|
|
|
9
9
|
# Used to consolidate logic for raising deprecation warnings and
|
|
10
10
|
# handling optional imports.
|
|
11
11
|
DEPRECATED_LOOKUP = {
|
|
12
|
-
"GoogleDocumentAIWarehouseRetriever": "langchain_community.retrievers"
|
|
12
|
+
"GoogleDocumentAIWarehouseRetriever": "langchain_community.retrievers",
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
_import_attribute = create_importer(__package__, deprecated_lookups=DEPRECATED_LOOKUP)
|