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
|
@@ -29,13 +29,16 @@ class LoadingCallable(Protocol):
|
|
|
29
29
|
"""Interface for loading the combine documents chain."""
|
|
30
30
|
|
|
31
31
|
def __call__(
|
|
32
|
-
self,
|
|
32
|
+
self,
|
|
33
|
+
llm: BaseLanguageModel,
|
|
34
|
+
**kwargs: Any,
|
|
33
35
|
) -> BaseCombineDocumentsChain:
|
|
34
36
|
"""Callable to load the combine documents chain."""
|
|
35
37
|
|
|
36
38
|
|
|
37
39
|
def _load_map_rerank_chain(
|
|
38
40
|
llm: BaseLanguageModel,
|
|
41
|
+
*,
|
|
39
42
|
prompt: BasePromptTemplate = MAP_RERANK_PROMPT,
|
|
40
43
|
verbose: bool = False,
|
|
41
44
|
document_variable_name: str = "context",
|
|
@@ -65,6 +68,7 @@ def _load_map_rerank_chain(
|
|
|
65
68
|
|
|
66
69
|
def _load_stuff_chain(
|
|
67
70
|
llm: BaseLanguageModel,
|
|
71
|
+
*,
|
|
68
72
|
prompt: Optional[BasePromptTemplate] = None,
|
|
69
73
|
document_variable_name: str = "context",
|
|
70
74
|
verbose: Optional[bool] = None,
|
|
@@ -93,6 +97,7 @@ def _load_stuff_chain(
|
|
|
93
97
|
|
|
94
98
|
def _load_map_reduce_chain(
|
|
95
99
|
llm: BaseLanguageModel,
|
|
100
|
+
*,
|
|
96
101
|
question_prompt: Optional[BasePromptTemplate] = None,
|
|
97
102
|
combine_prompt: Optional[BasePromptTemplate] = None,
|
|
98
103
|
combine_document_variable_name: str = "summaries",
|
|
@@ -138,10 +143,11 @@ def _load_map_reduce_chain(
|
|
|
138
143
|
if collapse_prompt is None:
|
|
139
144
|
collapse_chain = None
|
|
140
145
|
if collapse_llm is not None:
|
|
141
|
-
|
|
146
|
+
msg = (
|
|
142
147
|
"collapse_llm provided, but collapse_prompt was not: please "
|
|
143
148
|
"provide one or stop providing collapse_llm."
|
|
144
149
|
)
|
|
150
|
+
raise ValueError(msg)
|
|
145
151
|
else:
|
|
146
152
|
_collapse_llm = collapse_llm or llm
|
|
147
153
|
collapse_chain = StuffDocumentsChain(
|
|
@@ -175,6 +181,7 @@ def _load_map_reduce_chain(
|
|
|
175
181
|
|
|
176
182
|
def _load_refine_chain(
|
|
177
183
|
llm: BaseLanguageModel,
|
|
184
|
+
*,
|
|
178
185
|
question_prompt: Optional[BasePromptTemplate] = None,
|
|
179
186
|
refine_prompt: Optional[BasePromptTemplate] = None,
|
|
180
187
|
document_variable_name: str = "context_str",
|
|
@@ -189,7 +196,7 @@ def _load_refine_chain(
|
|
|
189
196
|
question_prompt or refine_prompts.QUESTION_PROMPT_SELECTOR.get_prompt(llm)
|
|
190
197
|
)
|
|
191
198
|
_refine_prompt = refine_prompt or refine_prompts.REFINE_PROMPT_SELECTOR.get_prompt(
|
|
192
|
-
llm
|
|
199
|
+
llm,
|
|
193
200
|
)
|
|
194
201
|
initial_chain = LLMChain(
|
|
195
202
|
llm=llm,
|
|
@@ -224,10 +231,10 @@ def _load_refine_chain(
|
|
|
224
231
|
message=(
|
|
225
232
|
"This class is deprecated. See the following migration guides for replacements "
|
|
226
233
|
"based on `chain_type`:\n"
|
|
227
|
-
"stuff: https://python.langchain.com/docs/versions/migrating_chains/stuff_docs_chain\n"
|
|
228
|
-
"map_reduce: https://python.langchain.com/docs/versions/migrating_chains/map_reduce_chain\n"
|
|
229
|
-
"refine: https://python.langchain.com/docs/versions/migrating_chains/refine_chain\n"
|
|
230
|
-
"map_rerank: https://python.langchain.com/docs/versions/migrating_chains/map_rerank_docs_chain\n"
|
|
234
|
+
"stuff: https://python.langchain.com/docs/versions/migrating_chains/stuff_docs_chain\n"
|
|
235
|
+
"map_reduce: https://python.langchain.com/docs/versions/migrating_chains/map_reduce_chain\n"
|
|
236
|
+
"refine: https://python.langchain.com/docs/versions/migrating_chains/refine_chain\n"
|
|
237
|
+
"map_rerank: https://python.langchain.com/docs/versions/migrating_chains/map_rerank_docs_chain\n"
|
|
231
238
|
"\nSee also guides on retrieval and question-answering here: "
|
|
232
239
|
"https://python.langchain.com/docs/how_to/#qa-with-rag"
|
|
233
240
|
),
|
|
@@ -235,7 +242,7 @@ def _load_refine_chain(
|
|
|
235
242
|
def load_qa_chain(
|
|
236
243
|
llm: BaseLanguageModel,
|
|
237
244
|
chain_type: str = "stuff",
|
|
238
|
-
verbose: Optional[bool] = None,
|
|
245
|
+
verbose: Optional[bool] = None, # noqa: FBT001
|
|
239
246
|
callback_manager: Optional[BaseCallbackManager] = None,
|
|
240
247
|
**kwargs: Any,
|
|
241
248
|
) -> BaseCombineDocumentsChain:
|
|
@@ -259,10 +266,14 @@ def load_qa_chain(
|
|
|
259
266
|
"map_rerank": _load_map_rerank_chain,
|
|
260
267
|
}
|
|
261
268
|
if chain_type not in loader_mapping:
|
|
262
|
-
|
|
269
|
+
msg = (
|
|
263
270
|
f"Got unsupported chain type: {chain_type}. "
|
|
264
271
|
f"Should be one of {loader_mapping.keys()}"
|
|
265
272
|
)
|
|
273
|
+
raise ValueError(msg)
|
|
266
274
|
return loader_mapping[chain_type](
|
|
267
|
-
llm,
|
|
275
|
+
llm,
|
|
276
|
+
verbose=verbose,
|
|
277
|
+
callback_manager=callback_manager,
|
|
278
|
+
**kwargs,
|
|
268
279
|
)
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# flake8: noqa
|
|
2
|
-
from langchain.chains.prompt_selector import ConditionalPromptSelector, is_chat_model
|
|
3
1
|
from langchain_core.prompts.chat import (
|
|
4
2
|
ChatPromptTemplate,
|
|
5
3
|
HumanMessagePromptTemplate,
|
|
@@ -7,18 +5,20 @@ from langchain_core.prompts.chat import (
|
|
|
7
5
|
)
|
|
8
6
|
from langchain_core.prompts.prompt import PromptTemplate
|
|
9
7
|
|
|
10
|
-
|
|
8
|
+
from langchain.chains.prompt_selector import ConditionalPromptSelector, is_chat_model
|
|
9
|
+
|
|
10
|
+
question_prompt_template = """Use the following portion of a long document to see if any of the text is relevant to answer the question.
|
|
11
11
|
Return any relevant text verbatim.
|
|
12
12
|
{context}
|
|
13
13
|
Question: {question}
|
|
14
|
-
Relevant text, if any:"""
|
|
14
|
+
Relevant text, if any:""" # noqa: E501
|
|
15
15
|
QUESTION_PROMPT = PromptTemplate(
|
|
16
16
|
template=question_prompt_template, input_variables=["context", "question"]
|
|
17
17
|
)
|
|
18
|
-
system_template = """Use the following portion of a long document to see if any of the text is relevant to answer the question.
|
|
18
|
+
system_template = """Use the following portion of a long document to see if any of the text is relevant to answer the question.
|
|
19
19
|
Return any relevant text verbatim.
|
|
20
20
|
______________________
|
|
21
|
-
{context}"""
|
|
21
|
+
{context}""" # noqa: E501
|
|
22
22
|
messages = [
|
|
23
23
|
SystemMessagePromptTemplate.from_template(system_template),
|
|
24
24
|
HumanMessagePromptTemplate.from_template("{question}"),
|
|
@@ -30,7 +30,7 @@ QUESTION_PROMPT_SELECTOR = ConditionalPromptSelector(
|
|
|
30
30
|
default_prompt=QUESTION_PROMPT, conditionals=[(is_chat_model, CHAT_QUESTION_PROMPT)]
|
|
31
31
|
)
|
|
32
32
|
|
|
33
|
-
combine_prompt_template = """Given the following extracted parts of a long document and a question, create a final answer.
|
|
33
|
+
combine_prompt_template = """Given the following extracted parts of a long document and a question, create a final answer.
|
|
34
34
|
If you don't know the answer, just say that you don't know. Don't try to make up an answer.
|
|
35
35
|
|
|
36
36
|
QUESTION: Which state/country's law governs the interpretation of the contract?
|
|
@@ -45,13 +45,13 @@ FINAL ANSWER: This Agreement is governed by English law.
|
|
|
45
45
|
|
|
46
46
|
QUESTION: What did the president say about Michael Jackson?
|
|
47
47
|
=========
|
|
48
|
-
Content: Madam Speaker, Madam Vice President, our First Lady and Second Gentleman. Members of Congress and the Cabinet. Justices of the Supreme Court. My fellow Americans. \n\nLast year COVID-19 kept us apart. This year we are finally together again. \n\nTonight, we meet as Democrats Republicans and Independents. But most importantly as Americans. \n\nWith a duty to one another to the American people to the Constitution. \n\nAnd with an unwavering resolve that freedom will always triumph over tyranny. \n\nSix days ago, Russia
|
|
48
|
+
Content: Madam Speaker, Madam Vice President, our First Lady and Second Gentleman. Members of Congress and the Cabinet. Justices of the Supreme Court. My fellow Americans. \n\nLast year COVID-19 kept us apart. This year we are finally together again. \n\nTonight, we meet as Democrats Republicans and Independents. But most importantly as Americans. \n\nWith a duty to one another to the American people to the Constitution. \n\nAnd with an unwavering resolve that freedom will always triumph over tyranny. \n\nSix days ago, Russia's Vladimir Putin sought to shake the foundations of the free world thinking he could make it bend to his menacing ways. But he badly miscalculated. \n\nHe thought he could roll into Ukraine and the world would roll over. Instead he met a wall of strength he never imagined. \n\nHe met the Ukrainian people. \n\nFrom President Zelenskyy to every Ukrainian, their fearlessness, their courage, their determination, inspires the world. \n\nGroups of citizens blocking tanks with their bodies. Everyone from students to retirees teachers turned soldiers defending their homeland.
|
|
49
49
|
|
|
50
|
-
Content: And we won
|
|
50
|
+
Content: And we won't stop. \n\nWe have lost so much to COVID-19. Time with one another. And worst of all, so much loss of life. \n\nLet's use this moment to reset. Let's stop looking at COVID-19 as a partisan dividing line and see it for what it is: A God-awful disease. \n\nLet's stop seeing each other as enemies, and start seeing each other for who we really are: Fellow Americans. \n\nWe can't change how divided we've been. But we can change how we move forward—on COVID-19 and other issues we must face together. \n\nI recently visited the New York City Police Department days after the funerals of Officer Wilbert Mora and his partner, Officer Jason Rivera. \n\nThey were responding to a 9-1-1 call when a man shot and killed them with a stolen gun. \n\nOfficer Mora was 27 years old. \n\nOfficer Rivera was 22. \n\nBoth Dominican Americans who'd grown up on the same streets they later chose to patrol as police officers. \n\nI spoke with their families and told them that we are forever in debt for their sacrifice, and we will carry on their mission to restore the trust and safety every community deserves.
|
|
51
51
|
|
|
52
|
-
Content: And a proud Ukrainian people, who have known 30 years of independence, have repeatedly shown that they will not tolerate anyone who tries to take their country backwards. \n\nTo all Americans, I will be honest with you, as I
|
|
52
|
+
Content: And a proud Ukrainian people, who have known 30 years of independence, have repeatedly shown that they will not tolerate anyone who tries to take their country backwards. \n\nTo all Americans, I will be honest with you, as I've always promised. A Russian dictator, invading a foreign country, has costs around the world. \n\nAnd I'm taking robust action to make sure the pain of our sanctions is targeted at Russia's economy. And I will use every tool at our disposal to protect American businesses and consumers. \n\nTonight, I can announce that the United States has worked with 30 other countries to release 60 Million barrels of oil from reserves around the world. \n\nAmerica will lead that effort, releasing 30 Million barrels from our own Strategic Petroleum Reserve. And we stand ready to do more if necessary, unified with our allies. \n\nThese steps will help blunt gas prices here at home. And I know the news about what's happening can seem alarming. \n\nBut I want you to know that we are going to be okay.
|
|
53
53
|
|
|
54
|
-
Content: More support for patients and families. \n\nTo get there, I call on Congress to fund ARPA-H, the Advanced Research Projects Agency for Health. \n\nIt
|
|
54
|
+
Content: More support for patients and families. \n\nTo get there, I call on Congress to fund ARPA-H, the Advanced Research Projects Agency for Health. \n\nIt's based on DARPA—the Defense Department project that led to the Internet, GPS, and so much more. \n\nARPA-H will have a singular purpose—to drive breakthroughs in cancer, Alzheimer's, diabetes, and more. \n\nA unity agenda for the nation. \n\nWe can do this. \n\nMy fellow Americans—tonight , we have gathered in a sacred space—the citadel of our democracy. \n\nIn this Capitol, generation after generation, Americans have debated great questions amid great strife, and have done great things. \n\nWe have fought for freedom, expanded liberty, defeated totalitarianism and terror. \n\nAnd built the strongest, freest, and most prosperous nation the world has ever known. \n\nNow is the hour. \n\nOur moment of responsibility. \n\nOur test of resolve and conscience, of history itself. \n\nIt is in this moment that our character is formed. Our purpose is found. Our future is forged. \n\nWell I know this nation.
|
|
55
55
|
=========
|
|
56
56
|
FINAL ANSWER: The president did not mention Michael Jackson.
|
|
57
57
|
|
|
@@ -59,15 +59,15 @@ QUESTION: {question}
|
|
|
59
59
|
=========
|
|
60
60
|
{summaries}
|
|
61
61
|
=========
|
|
62
|
-
FINAL ANSWER:"""
|
|
62
|
+
FINAL ANSWER:""" # noqa: E501
|
|
63
63
|
COMBINE_PROMPT = PromptTemplate(
|
|
64
64
|
template=combine_prompt_template, input_variables=["summaries", "question"]
|
|
65
65
|
)
|
|
66
66
|
|
|
67
|
-
system_template = """Given the following extracted parts of a long document and a question, create a final answer.
|
|
67
|
+
system_template = """Given the following extracted parts of a long document and a question, create a final answer.
|
|
68
68
|
If you don't know the answer, just say that you don't know. Don't try to make up an answer.
|
|
69
69
|
______________________
|
|
70
|
-
{summaries}"""
|
|
70
|
+
{summaries}""" # noqa: E501
|
|
71
71
|
messages = [
|
|
72
72
|
SystemMessagePromptTemplate.from_template(system_template),
|
|
73
73
|
HumanMessagePromptTemplate.from_template("{question}"),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
# flake8: noqa
|
|
2
|
-
from langchain.output_parsers.regex import RegexParser
|
|
3
1
|
from langchain_core.prompts import PromptTemplate
|
|
4
2
|
|
|
3
|
+
from langchain.output_parsers.regex import RegexParser
|
|
4
|
+
|
|
5
5
|
output_parser = RegexParser(
|
|
6
6
|
regex=r"(.*?)\nScore: (\d*)",
|
|
7
7
|
output_keys=["answer", "score"],
|
|
@@ -58,7 +58,7 @@ Context:
|
|
|
58
58
|
{context}
|
|
59
59
|
---------
|
|
60
60
|
Question: {question}
|
|
61
|
-
Helpful Answer:"""
|
|
61
|
+
Helpful Answer:""" # noqa: E501
|
|
62
62
|
PROMPT = PromptTemplate(
|
|
63
63
|
template=prompt_template,
|
|
64
64
|
input_variables=["context", "question"],
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
# flake8: noqa
|
|
2
|
-
from langchain.chains.prompt_selector import ConditionalPromptSelector, is_chat_model
|
|
3
1
|
from langchain_core.prompts.chat import (
|
|
4
|
-
AIMessagePromptTemplate,
|
|
5
2
|
ChatPromptTemplate,
|
|
6
|
-
HumanMessagePromptTemplate,
|
|
7
|
-
SystemMessagePromptTemplate,
|
|
8
3
|
)
|
|
9
4
|
from langchain_core.prompts.prompt import PromptTemplate
|
|
10
5
|
|
|
6
|
+
from langchain.chains.prompt_selector import ConditionalPromptSelector, is_chat_model
|
|
7
|
+
|
|
11
8
|
DEFAULT_REFINE_PROMPT_TMPL = (
|
|
12
9
|
"The original question is as follows: {question}\n"
|
|
13
10
|
"We have provided an existing answer: {existing_answer}\n"
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# flake8: noqa
|
|
2
|
-
from langchain.chains.prompt_selector import ConditionalPromptSelector, is_chat_model
|
|
3
1
|
from langchain_core.prompts import PromptTemplate
|
|
4
2
|
from langchain_core.prompts.chat import (
|
|
5
3
|
ChatPromptTemplate,
|
|
@@ -7,20 +5,22 @@ from langchain_core.prompts.chat import (
|
|
|
7
5
|
SystemMessagePromptTemplate,
|
|
8
6
|
)
|
|
9
7
|
|
|
8
|
+
from langchain.chains.prompt_selector import ConditionalPromptSelector, is_chat_model
|
|
9
|
+
|
|
10
10
|
prompt_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.
|
|
11
11
|
|
|
12
12
|
{context}
|
|
13
13
|
|
|
14
14
|
Question: {question}
|
|
15
|
-
Helpful Answer:"""
|
|
15
|
+
Helpful Answer:""" # noqa: E501
|
|
16
16
|
PROMPT = PromptTemplate(
|
|
17
17
|
template=prompt_template, input_variables=["context", "question"]
|
|
18
18
|
)
|
|
19
19
|
|
|
20
|
-
system_template = """Use the following pieces of context to answer the user's question.
|
|
20
|
+
system_template = """Use the following pieces of context to answer the user's question.
|
|
21
21
|
If you don't know the answer, just say that you don't know, don't try to make up an answer.
|
|
22
22
|
----------------
|
|
23
|
-
{context}"""
|
|
23
|
+
{context}""" # noqa: E501
|
|
24
24
|
messages = [
|
|
25
25
|
SystemMessagePromptTemplate.from_template(system_template),
|
|
26
26
|
HumanMessagePromptTemplate.from_template("{question}"),
|
langchain/chains/retrieval.py
CHANGED
|
@@ -60,10 +60,8 @@ def create_retrieval_chain(
|
|
|
60
60
|
else:
|
|
61
61
|
retrieval_docs = (lambda x: x["input"]) | retriever
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
return (
|
|
64
64
|
RunnablePassthrough.assign(
|
|
65
65
|
context=retrieval_docs.with_config(run_name="retrieve_documents"),
|
|
66
66
|
).assign(answer=combine_docs_chain)
|
|
67
67
|
).with_config(run_name="retrieval_chain")
|
|
68
|
-
|
|
69
|
-
return retrieval_chain
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import inspect
|
|
6
|
-
import warnings
|
|
7
6
|
from abc import abstractmethod
|
|
8
7
|
from typing import Any, Optional
|
|
9
8
|
|
|
@@ -69,7 +68,7 @@ class BaseRetrievalQA(Chain):
|
|
|
69
68
|
"""
|
|
70
69
|
_output_keys = [self.output_key]
|
|
71
70
|
if self.return_source_documents:
|
|
72
|
-
_output_keys = _output_keys
|
|
71
|
+
_output_keys = [*_output_keys, "source_documents"]
|
|
73
72
|
return _output_keys
|
|
74
73
|
|
|
75
74
|
@classmethod
|
|
@@ -84,10 +83,14 @@ class BaseRetrievalQA(Chain):
|
|
|
84
83
|
"""Initialize from LLM."""
|
|
85
84
|
_prompt = prompt or PROMPT_SELECTOR.get_prompt(llm)
|
|
86
85
|
llm_chain = LLMChain(
|
|
87
|
-
llm=llm,
|
|
86
|
+
llm=llm,
|
|
87
|
+
prompt=_prompt,
|
|
88
|
+
callbacks=callbacks,
|
|
89
|
+
**(llm_chain_kwargs or {}),
|
|
88
90
|
)
|
|
89
91
|
document_prompt = PromptTemplate(
|
|
90
|
-
input_variables=["page_content"],
|
|
92
|
+
input_variables=["page_content"],
|
|
93
|
+
template="Context:\n{page_content}",
|
|
91
94
|
)
|
|
92
95
|
combine_documents_chain = StuffDocumentsChain(
|
|
93
96
|
llm_chain=llm_chain,
|
|
@@ -113,7 +116,9 @@ class BaseRetrievalQA(Chain):
|
|
|
113
116
|
"""Load chain from chain type."""
|
|
114
117
|
_chain_type_kwargs = chain_type_kwargs or {}
|
|
115
118
|
combine_documents_chain = load_qa_chain(
|
|
116
|
-
llm,
|
|
119
|
+
llm,
|
|
120
|
+
chain_type=chain_type,
|
|
121
|
+
**_chain_type_kwargs,
|
|
117
122
|
)
|
|
118
123
|
return cls(combine_documents_chain=combine_documents_chain, **kwargs)
|
|
119
124
|
|
|
@@ -152,13 +157,14 @@ class BaseRetrievalQA(Chain):
|
|
|
152
157
|
else:
|
|
153
158
|
docs = self._get_docs(question) # type: ignore[call-arg]
|
|
154
159
|
answer = self.combine_documents_chain.run(
|
|
155
|
-
input_documents=docs,
|
|
160
|
+
input_documents=docs,
|
|
161
|
+
question=question,
|
|
162
|
+
callbacks=_run_manager.get_child(),
|
|
156
163
|
)
|
|
157
164
|
|
|
158
165
|
if self.return_source_documents:
|
|
159
166
|
return {self.output_key: answer, "source_documents": docs}
|
|
160
|
-
|
|
161
|
-
return {self.output_key: answer}
|
|
167
|
+
return {self.output_key: answer}
|
|
162
168
|
|
|
163
169
|
@abstractmethod
|
|
164
170
|
async def _aget_docs(
|
|
@@ -195,13 +201,14 @@ class BaseRetrievalQA(Chain):
|
|
|
195
201
|
else:
|
|
196
202
|
docs = await self._aget_docs(question) # type: ignore[call-arg]
|
|
197
203
|
answer = await self.combine_documents_chain.arun(
|
|
198
|
-
input_documents=docs,
|
|
204
|
+
input_documents=docs,
|
|
205
|
+
question=question,
|
|
206
|
+
callbacks=_run_manager.get_child(),
|
|
199
207
|
)
|
|
200
208
|
|
|
201
209
|
if self.return_source_documents:
|
|
202
210
|
return {self.output_key: answer, "source_documents": docs}
|
|
203
|
-
|
|
204
|
-
return {self.output_key: answer}
|
|
211
|
+
return {self.output_key: answer}
|
|
205
212
|
|
|
206
213
|
|
|
207
214
|
@deprecated(
|
|
@@ -269,7 +276,8 @@ class RetrievalQA(BaseRetrievalQA):
|
|
|
269
276
|
) -> list[Document]:
|
|
270
277
|
"""Get docs."""
|
|
271
278
|
return self.retriever.invoke(
|
|
272
|
-
question,
|
|
279
|
+
question,
|
|
280
|
+
config={"callbacks": run_manager.get_child()},
|
|
273
281
|
)
|
|
274
282
|
|
|
275
283
|
async def _aget_docs(
|
|
@@ -280,7 +288,8 @@ class RetrievalQA(BaseRetrievalQA):
|
|
|
280
288
|
) -> list[Document]:
|
|
281
289
|
"""Get docs."""
|
|
282
290
|
return await self.retriever.ainvoke(
|
|
283
|
-
question,
|
|
291
|
+
question,
|
|
292
|
+
config={"callbacks": run_manager.get_child()},
|
|
284
293
|
)
|
|
285
294
|
|
|
286
295
|
@property
|
|
@@ -310,15 +319,6 @@ class VectorDBQA(BaseRetrievalQA):
|
|
|
310
319
|
search_kwargs: dict[str, Any] = Field(default_factory=dict)
|
|
311
320
|
"""Extra search args."""
|
|
312
321
|
|
|
313
|
-
@model_validator(mode="before")
|
|
314
|
-
@classmethod
|
|
315
|
-
def raise_deprecation(cls, values: dict) -> Any:
|
|
316
|
-
warnings.warn(
|
|
317
|
-
"`VectorDBQA` is deprecated - "
|
|
318
|
-
"please use `from langchain.chains import RetrievalQA`"
|
|
319
|
-
)
|
|
320
|
-
return values
|
|
321
|
-
|
|
322
322
|
@model_validator(mode="before")
|
|
323
323
|
@classmethod
|
|
324
324
|
def validate_search_type(cls, values: dict) -> Any:
|
|
@@ -326,7 +326,8 @@ class VectorDBQA(BaseRetrievalQA):
|
|
|
326
326
|
if "search_type" in values:
|
|
327
327
|
search_type = values["search_type"]
|
|
328
328
|
if search_type not in ("similarity", "mmr"):
|
|
329
|
-
|
|
329
|
+
msg = f"search_type of {search_type} not allowed."
|
|
330
|
+
raise ValueError(msg)
|
|
330
331
|
return values
|
|
331
332
|
|
|
332
333
|
def _get_docs(
|
|
@@ -338,14 +339,19 @@ class VectorDBQA(BaseRetrievalQA):
|
|
|
338
339
|
"""Get docs."""
|
|
339
340
|
if self.search_type == "similarity":
|
|
340
341
|
docs = self.vectorstore.similarity_search(
|
|
341
|
-
question,
|
|
342
|
+
question,
|
|
343
|
+
k=self.k,
|
|
344
|
+
**self.search_kwargs,
|
|
342
345
|
)
|
|
343
346
|
elif self.search_type == "mmr":
|
|
344
347
|
docs = self.vectorstore.max_marginal_relevance_search(
|
|
345
|
-
question,
|
|
348
|
+
question,
|
|
349
|
+
k=self.k,
|
|
350
|
+
**self.search_kwargs,
|
|
346
351
|
)
|
|
347
352
|
else:
|
|
348
|
-
|
|
353
|
+
msg = f"search_type of {self.search_type} not allowed."
|
|
354
|
+
raise ValueError(msg)
|
|
349
355
|
return docs
|
|
350
356
|
|
|
351
357
|
async def _aget_docs(
|
|
@@ -355,7 +361,8 @@ class VectorDBQA(BaseRetrievalQA):
|
|
|
355
361
|
run_manager: AsyncCallbackManagerForChainRun,
|
|
356
362
|
) -> list[Document]:
|
|
357
363
|
"""Get docs."""
|
|
358
|
-
|
|
364
|
+
msg = "VectorDBQA does not support async"
|
|
365
|
+
raise NotImplementedError(msg)
|
|
359
366
|
|
|
360
367
|
@property
|
|
361
368
|
def _chain_type(self) -> str:
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# flake8: noqa
|
|
2
1
|
from langchain_core.prompts import PromptTemplate
|
|
3
2
|
|
|
4
3
|
prompt_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.
|
|
@@ -6,7 +5,7 @@ prompt_template = """Use the following pieces of context to answer the question
|
|
|
6
5
|
{context}
|
|
7
6
|
|
|
8
7
|
Question: {question}
|
|
9
|
-
Helpful Answer:"""
|
|
8
|
+
Helpful Answer:""" # noqa: E501
|
|
10
9
|
PROMPT = PromptTemplate(
|
|
11
10
|
template=prompt_template, input_variables=["context", "question"]
|
|
12
11
|
)
|
|
@@ -4,9 +4,9 @@ from langchain.chains.router.multi_prompt import MultiPromptChain
|
|
|
4
4
|
from langchain.chains.router.multi_retrieval_qa import MultiRetrievalQAChain
|
|
5
5
|
|
|
6
6
|
__all__ = [
|
|
7
|
-
"
|
|
8
|
-
"MultiRouteChain",
|
|
7
|
+
"LLMRouterChain",
|
|
9
8
|
"MultiPromptChain",
|
|
10
9
|
"MultiRetrievalQAChain",
|
|
11
|
-
"
|
|
10
|
+
"MultiRouteChain",
|
|
11
|
+
"RouterChain",
|
|
12
12
|
]
|
langchain/chains/router/base.py
CHANGED
|
@@ -43,7 +43,9 @@ class RouterChain(Chain, ABC):
|
|
|
43
43
|
return Route(result["destination"], result["next_inputs"])
|
|
44
44
|
|
|
45
45
|
async def aroute(
|
|
46
|
-
self,
|
|
46
|
+
self,
|
|
47
|
+
inputs: dict[str, Any],
|
|
48
|
+
callbacks: Callbacks = None,
|
|
47
49
|
) -> Route:
|
|
48
50
|
result = await self.acall(inputs, callbacks=callbacks)
|
|
49
51
|
return Route(result["destination"], result["next_inputs"])
|
|
@@ -59,7 +61,7 @@ class MultiRouteChain(Chain):
|
|
|
59
61
|
default_chain: Chain
|
|
60
62
|
"""Default chain to use when none of the destination chains are suitable."""
|
|
61
63
|
silent_errors: bool = False
|
|
62
|
-
"""If True, use default_chain when an invalid destination name is provided.
|
|
64
|
+
"""If True, use default_chain when an invalid destination name is provided.
|
|
63
65
|
Defaults to False."""
|
|
64
66
|
|
|
65
67
|
model_config = ConfigDict(
|
|
@@ -93,20 +95,20 @@ class MultiRouteChain(Chain):
|
|
|
93
95
|
route = self.router_chain.route(inputs, callbacks=callbacks)
|
|
94
96
|
|
|
95
97
|
_run_manager.on_text(
|
|
96
|
-
str(route.destination) + ": " + str(route.next_inputs),
|
|
98
|
+
str(route.destination) + ": " + str(route.next_inputs),
|
|
99
|
+
verbose=self.verbose,
|
|
97
100
|
)
|
|
98
101
|
if not route.destination:
|
|
99
102
|
return self.default_chain(route.next_inputs, callbacks=callbacks)
|
|
100
|
-
|
|
103
|
+
if route.destination in self.destination_chains:
|
|
101
104
|
return self.destination_chains[route.destination](
|
|
102
|
-
route.next_inputs,
|
|
105
|
+
route.next_inputs,
|
|
106
|
+
callbacks=callbacks,
|
|
103
107
|
)
|
|
104
|
-
|
|
108
|
+
if self.silent_errors:
|
|
105
109
|
return self.default_chain(route.next_inputs, callbacks=callbacks)
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
f"Received invalid destination chain name '{route.destination}'"
|
|
109
|
-
)
|
|
110
|
+
msg = f"Received invalid destination chain name '{route.destination}'"
|
|
111
|
+
raise ValueError(msg)
|
|
110
112
|
|
|
111
113
|
async def _acall(
|
|
112
114
|
self,
|
|
@@ -118,21 +120,23 @@ class MultiRouteChain(Chain):
|
|
|
118
120
|
route = await self.router_chain.aroute(inputs, callbacks=callbacks)
|
|
119
121
|
|
|
120
122
|
await _run_manager.on_text(
|
|
121
|
-
str(route.destination) + ": " + str(route.next_inputs),
|
|
123
|
+
str(route.destination) + ": " + str(route.next_inputs),
|
|
124
|
+
verbose=self.verbose,
|
|
122
125
|
)
|
|
123
126
|
if not route.destination:
|
|
124
127
|
return await self.default_chain.acall(
|
|
125
|
-
route.next_inputs,
|
|
128
|
+
route.next_inputs,
|
|
129
|
+
callbacks=callbacks,
|
|
126
130
|
)
|
|
127
|
-
|
|
131
|
+
if route.destination in self.destination_chains:
|
|
128
132
|
return await self.destination_chains[route.destination].acall(
|
|
129
|
-
route.next_inputs,
|
|
133
|
+
route.next_inputs,
|
|
134
|
+
callbacks=callbacks,
|
|
130
135
|
)
|
|
131
|
-
|
|
136
|
+
if self.silent_errors:
|
|
132
137
|
return await self.default_chain.acall(
|
|
133
|
-
route.next_inputs,
|
|
134
|
-
|
|
135
|
-
else:
|
|
136
|
-
raise ValueError(
|
|
137
|
-
f"Received invalid destination chain name '{route.destination}'"
|
|
138
|
+
route.next_inputs,
|
|
139
|
+
callbacks=callbacks,
|
|
138
140
|
)
|
|
141
|
+
msg = f"Received invalid destination chain name '{route.destination}'"
|
|
142
|
+
raise ValueError(msg)
|
|
@@ -63,10 +63,12 @@ class EmbeddingRouterChain(RouterChain):
|
|
|
63
63
|
"""Convenience constructor."""
|
|
64
64
|
documents = []
|
|
65
65
|
for name, descriptions in names_and_descriptions:
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
documents.extend(
|
|
67
|
+
[
|
|
68
68
|
Document(page_content=description, metadata={"name": name})
|
|
69
|
-
|
|
69
|
+
for description in descriptions
|
|
70
|
+
]
|
|
71
|
+
)
|
|
70
72
|
vectorstore = vectorstore_cls.from_documents(documents, embeddings)
|
|
71
73
|
return cls(vectorstore=vectorstore, **kwargs)
|
|
72
74
|
|
|
@@ -80,10 +82,12 @@ class EmbeddingRouterChain(RouterChain):
|
|
|
80
82
|
) -> EmbeddingRouterChain:
|
|
81
83
|
"""Convenience constructor."""
|
|
82
84
|
documents = []
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
documents.extend(
|
|
86
|
+
[
|
|
87
|
+
Document(page_content=description, metadata={"name": name})
|
|
88
|
+
for name, descriptions in names_and_descriptions
|
|
89
|
+
for description in descriptions
|
|
90
|
+
]
|
|
91
|
+
)
|
|
88
92
|
vectorstore = await vectorstore_cls.afrom_documents(documents, embeddings)
|
|
89
93
|
return cls(vectorstore=vectorstore, **kwargs)
|