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
|
@@ -11,6 +11,7 @@ from langchain_core.language_models import BaseLanguageModel
|
|
|
11
11
|
from langchain_core.output_parsers import BaseOutputParser
|
|
12
12
|
from langchain_core.prompts.prompt import PromptTemplate
|
|
13
13
|
from pydantic import ConfigDict, Field
|
|
14
|
+
from typing_extensions import override
|
|
14
15
|
|
|
15
16
|
from langchain.chains.constitutional_ai.models import ConstitutionalPrinciple
|
|
16
17
|
from langchain.chains.llm import LLMChain
|
|
@@ -69,7 +70,7 @@ def resolve_pairwise_criteria(
|
|
|
69
70
|
Criteria.DEPTH,
|
|
70
71
|
]
|
|
71
72
|
return {k.value: _SUPPORTED_CRITERIA[k] for k in _default_criteria}
|
|
72
|
-
|
|
73
|
+
if isinstance(criteria, Criteria):
|
|
73
74
|
criteria_ = {criteria.value: _SUPPORTED_CRITERIA[criteria]}
|
|
74
75
|
elif isinstance(criteria, str):
|
|
75
76
|
if criteria in _SUPPORTED_CRITERIA:
|
|
@@ -86,11 +87,12 @@ def resolve_pairwise_criteria(
|
|
|
86
87
|
}
|
|
87
88
|
else:
|
|
88
89
|
if not criteria:
|
|
89
|
-
|
|
90
|
+
msg = (
|
|
90
91
|
"Criteria cannot be empty. "
|
|
91
92
|
"Please provide a criterion name or a mapping of the criterion name"
|
|
92
93
|
" to its description."
|
|
93
94
|
)
|
|
95
|
+
raise ValueError(msg)
|
|
94
96
|
criteria_ = dict(criteria)
|
|
95
97
|
return criteria_
|
|
96
98
|
|
|
@@ -132,11 +134,12 @@ class PairwiseStringResultOutputParser(BaseOutputParser[dict]):
|
|
|
132
134
|
verdict = match.group(1)
|
|
133
135
|
|
|
134
136
|
if not match or verdict not in {"A", "B", "C"}:
|
|
135
|
-
|
|
137
|
+
msg = (
|
|
136
138
|
f"Invalid output: {text}. "
|
|
137
139
|
"Output must contain a double bracketed string\
|
|
138
140
|
with the verdict 'A', 'B', or 'C'."
|
|
139
141
|
)
|
|
142
|
+
raise ValueError(msg)
|
|
140
143
|
# C means the models are tied. Return 'None' meaning no preference
|
|
141
144
|
verdict_ = None if verdict == "C" else verdict
|
|
142
145
|
score = {
|
|
@@ -184,7 +187,7 @@ class PairwiseStringEvalChain(PairwiseStringEvaluator, LLMEvalChain, LLMChain):
|
|
|
184
187
|
|
|
185
188
|
output_key: str = "results" #: :meta private:
|
|
186
189
|
output_parser: BaseOutputParser = Field(
|
|
187
|
-
default_factory=PairwiseStringResultOutputParser
|
|
190
|
+
default_factory=PairwiseStringResultOutputParser,
|
|
188
191
|
)
|
|
189
192
|
|
|
190
193
|
@classmethod
|
|
@@ -256,16 +259,17 @@ class PairwiseStringEvalChain(PairwiseStringEvaluator, LLMEvalChain, LLMChain):
|
|
|
256
259
|
if not hasattr(llm, "model_name") or not llm.model_name.startswith("gpt-4"):
|
|
257
260
|
logger.warning(
|
|
258
261
|
"This chain was only tested with GPT-4. \
|
|
259
|
-
Performance may be significantly worse with other models."
|
|
262
|
+
Performance may be significantly worse with other models.",
|
|
260
263
|
)
|
|
261
264
|
|
|
262
265
|
expected_input_vars = {"prediction", "prediction_b", "input", "criteria"}
|
|
263
266
|
prompt_ = prompt or COMPARISON_TEMPLATE.partial(reference="")
|
|
264
267
|
if expected_input_vars != set(prompt_.input_variables):
|
|
265
|
-
|
|
268
|
+
msg = (
|
|
266
269
|
f"Input variables should be {expected_input_vars}, "
|
|
267
270
|
f"but got {prompt_.input_variables}"
|
|
268
271
|
)
|
|
272
|
+
raise ValueError(msg)
|
|
269
273
|
criteria_ = resolve_pairwise_criteria(criteria)
|
|
270
274
|
criteria_str = "\n".join(f"{k}: {v}" if v else k for k, v in criteria_.items())
|
|
271
275
|
criteria_str = CRITERIA_INSTRUCTIONS + criteria_str if criteria_str else ""
|
|
@@ -275,7 +279,7 @@ Performance may be significantly worse with other models."
|
|
|
275
279
|
self,
|
|
276
280
|
prediction: str,
|
|
277
281
|
prediction_b: str,
|
|
278
|
-
|
|
282
|
+
input_: Optional[str],
|
|
279
283
|
reference: Optional[str],
|
|
280
284
|
) -> dict:
|
|
281
285
|
"""Prepare the input for the chain.
|
|
@@ -283,21 +287,21 @@ Performance may be significantly worse with other models."
|
|
|
283
287
|
Args:
|
|
284
288
|
prediction (str): The output string from the first model.
|
|
285
289
|
prediction_b (str): The output string from the second model.
|
|
286
|
-
|
|
290
|
+
input_ (str, optional): The input or task string.
|
|
287
291
|
reference (str, optional): The reference string, if any.
|
|
288
292
|
|
|
289
293
|
Returns:
|
|
290
294
|
dict: The prepared input for the chain.
|
|
291
295
|
|
|
292
296
|
"""
|
|
293
|
-
|
|
297
|
+
input_dict = {
|
|
294
298
|
"prediction": prediction,
|
|
295
299
|
"prediction_b": prediction_b,
|
|
296
|
-
"input":
|
|
300
|
+
"input": input_,
|
|
297
301
|
}
|
|
298
302
|
if self.requires_reference:
|
|
299
|
-
|
|
300
|
-
return
|
|
303
|
+
input_dict["reference"] = reference
|
|
304
|
+
return input_dict
|
|
301
305
|
|
|
302
306
|
def _prepare_output(self, result: dict) -> dict:
|
|
303
307
|
"""Prepare the output."""
|
|
@@ -306,6 +310,7 @@ Performance may be significantly worse with other models."
|
|
|
306
310
|
parsed[RUN_KEY] = result[RUN_KEY]
|
|
307
311
|
return parsed
|
|
308
312
|
|
|
313
|
+
@override
|
|
309
314
|
def _evaluate_string_pairs(
|
|
310
315
|
self,
|
|
311
316
|
*,
|
|
@@ -348,6 +353,7 @@ Performance may be significantly worse with other models."
|
|
|
348
353
|
)
|
|
349
354
|
return self._prepare_output(result)
|
|
350
355
|
|
|
356
|
+
@override
|
|
351
357
|
async def _aevaluate_string_pairs(
|
|
352
358
|
self,
|
|
353
359
|
*,
|
|
@@ -444,10 +450,11 @@ class LabeledPairwiseStringEvalChain(PairwiseStringEvalChain):
|
|
|
444
450
|
}
|
|
445
451
|
prompt_ = prompt or COMPARISON_TEMPLATE_WITH_REFERENCE
|
|
446
452
|
if expected_input_vars != set(prompt_.input_variables):
|
|
447
|
-
|
|
453
|
+
msg = (
|
|
448
454
|
f"Input variables should be {expected_input_vars}, "
|
|
449
455
|
f"but got {prompt_.input_variables}"
|
|
450
456
|
)
|
|
457
|
+
raise ValueError(msg)
|
|
451
458
|
criteria_ = resolve_pairwise_criteria(criteria)
|
|
452
459
|
criteria_str = "\n".join(f"{k}: {v}" for k, v in criteria_.items())
|
|
453
460
|
criteria_str = CRITERIA_INSTRUCTIONS + criteria_str if criteria_str else ""
|
|
@@ -3,9 +3,8 @@
|
|
|
3
3
|
This prompt is used to compare two responses and evaluate which one best follows the instructions
|
|
4
4
|
and answers the question. The prompt is based on the paper from
|
|
5
5
|
Zheng, et. al. https://arxiv.org/abs/2306.05685
|
|
6
|
-
"""
|
|
6
|
+
""" # noqa: E501
|
|
7
7
|
|
|
8
|
-
# flake8: noqa
|
|
9
8
|
from langchain_core.prompts.chat import ChatPromptTemplate
|
|
10
9
|
|
|
11
10
|
SYSTEM_MESSAGE = 'Please act as an impartial judge and evaluate the quality \
|
|
@@ -10,6 +10,7 @@ from langchain_core.language_models import BaseLanguageModel
|
|
|
10
10
|
from langchain_core.output_parsers import BaseOutputParser
|
|
11
11
|
from langchain_core.prompts import BasePromptTemplate
|
|
12
12
|
from pydantic import ConfigDict, Field
|
|
13
|
+
from typing_extensions import override
|
|
13
14
|
|
|
14
15
|
from langchain.chains.constitutional_ai.models import ConstitutionalPrinciple
|
|
15
16
|
from langchain.chains.llm import LLMChain
|
|
@@ -156,11 +157,12 @@ def resolve_criteria(
|
|
|
156
157
|
criteria_ = {criteria.name: criteria.critique_request}
|
|
157
158
|
else:
|
|
158
159
|
if not criteria:
|
|
159
|
-
|
|
160
|
+
msg = (
|
|
160
161
|
"Criteria cannot be empty. "
|
|
161
162
|
"Please provide a criterion name or a mapping of the criterion name"
|
|
162
163
|
" to its description."
|
|
163
164
|
)
|
|
165
|
+
raise ValueError(msg)
|
|
164
166
|
criteria_ = dict(criteria)
|
|
165
167
|
return criteria_
|
|
166
168
|
|
|
@@ -271,15 +273,17 @@ class CriteriaEvalChain(StringEvaluator, LLMEvalChain, LLMChain):
|
|
|
271
273
|
|
|
272
274
|
@classmethod
|
|
273
275
|
def _resolve_prompt(
|
|
274
|
-
cls,
|
|
276
|
+
cls,
|
|
277
|
+
prompt: Optional[BasePromptTemplate] = None,
|
|
275
278
|
) -> BasePromptTemplate:
|
|
276
279
|
expected_input_vars = {"input", "output", "criteria"}
|
|
277
280
|
prompt_ = prompt or PROMPT
|
|
278
281
|
if expected_input_vars != set(prompt_.input_variables):
|
|
279
|
-
|
|
282
|
+
msg = (
|
|
280
283
|
f"Input variables should be {expected_input_vars}, "
|
|
281
284
|
f"but got {prompt_.input_variables}"
|
|
282
285
|
)
|
|
286
|
+
raise ValueError(msg)
|
|
283
287
|
return prompt_
|
|
284
288
|
|
|
285
289
|
@classmethod
|
|
@@ -360,12 +364,13 @@ class CriteriaEvalChain(StringEvaluator, LLMEvalChain, LLMChain):
|
|
|
360
364
|
"""
|
|
361
365
|
prompt_ = cls._resolve_prompt(prompt)
|
|
362
366
|
if criteria == Criteria.CORRECTNESS:
|
|
363
|
-
|
|
367
|
+
msg = (
|
|
364
368
|
"Correctness should not be used in the reference-free"
|
|
365
369
|
" 'criteria' evaluator (CriteriaEvalChain)."
|
|
366
370
|
" Please use the 'labeled_criteria' evaluator"
|
|
367
371
|
" (LabeledCriteriaEvalChain) instead."
|
|
368
372
|
)
|
|
373
|
+
raise ValueError(msg)
|
|
369
374
|
criteria_ = cls.resolve_criteria(criteria)
|
|
370
375
|
criteria_str = "\n".join(f"{k}: {v}" for k, v in criteria_.items())
|
|
371
376
|
prompt_ = prompt_.partial(criteria=criteria_str)
|
|
@@ -380,16 +385,16 @@ class CriteriaEvalChain(StringEvaluator, LLMEvalChain, LLMChain):
|
|
|
380
385
|
self,
|
|
381
386
|
prediction: str,
|
|
382
387
|
reference: Optional[str],
|
|
383
|
-
|
|
388
|
+
input_: Optional[str],
|
|
384
389
|
) -> dict:
|
|
385
390
|
"""Get the evaluation input."""
|
|
386
|
-
|
|
387
|
-
"input":
|
|
391
|
+
input_dict = {
|
|
392
|
+
"input": input_,
|
|
388
393
|
"output": prediction,
|
|
389
394
|
}
|
|
390
395
|
if self.requires_reference:
|
|
391
|
-
|
|
392
|
-
return
|
|
396
|
+
input_dict["reference"] = reference
|
|
397
|
+
return input_dict
|
|
393
398
|
|
|
394
399
|
def _prepare_output(self, result: dict) -> dict:
|
|
395
400
|
"""Prepare the output."""
|
|
@@ -398,6 +403,7 @@ class CriteriaEvalChain(StringEvaluator, LLMEvalChain, LLMChain):
|
|
|
398
403
|
parsed[RUN_KEY] = result[RUN_KEY]
|
|
399
404
|
return parsed
|
|
400
405
|
|
|
406
|
+
@override
|
|
401
407
|
def _evaluate_strings(
|
|
402
408
|
self,
|
|
403
409
|
*,
|
|
@@ -453,6 +459,7 @@ class CriteriaEvalChain(StringEvaluator, LLMEvalChain, LLMChain):
|
|
|
453
459
|
)
|
|
454
460
|
return self._prepare_output(result)
|
|
455
461
|
|
|
462
|
+
@override
|
|
456
463
|
async def _aevaluate_strings(
|
|
457
464
|
self,
|
|
458
465
|
*,
|
|
@@ -523,15 +530,17 @@ class LabeledCriteriaEvalChain(CriteriaEvalChain):
|
|
|
523
530
|
|
|
524
531
|
@classmethod
|
|
525
532
|
def _resolve_prompt(
|
|
526
|
-
cls,
|
|
533
|
+
cls,
|
|
534
|
+
prompt: Optional[BasePromptTemplate] = None,
|
|
527
535
|
) -> BasePromptTemplate:
|
|
528
536
|
expected_input_vars = {"input", "output", "criteria", "reference"}
|
|
529
537
|
prompt_ = prompt or PROMPT_WITH_REFERENCES
|
|
530
538
|
if expected_input_vars != set(prompt_.input_variables):
|
|
531
|
-
|
|
539
|
+
msg = (
|
|
532
540
|
f"Input variables should be {expected_input_vars}, "
|
|
533
541
|
f"but got {prompt_.input_variables}"
|
|
534
542
|
)
|
|
543
|
+
raise ValueError(msg)
|
|
535
544
|
return prompt_
|
|
536
545
|
|
|
537
546
|
@classmethod
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# flake8: noqa
|
|
2
1
|
# Credit to https://github.com/openai/evals/tree/main
|
|
3
2
|
|
|
4
3
|
from langchain_core.prompts import PromptTemplate
|
|
@@ -13,7 +12,7 @@ template = """You are assessing a submitted answer on a given task or input base
|
|
|
13
12
|
[Criteria]: {criteria}
|
|
14
13
|
***
|
|
15
14
|
[END DATA]
|
|
16
|
-
Does the submission meet the Criteria? First, write out in a step by step manner your reasoning about each criterion to be sure that your conclusion is correct. Avoid simply stating the correct answers at the outset. Then print only the single character "Y" or "N" (without quotes or punctuation) on its own line corresponding to the correct answer of whether the submission meets all criteria. At the end, repeat just the letter again by itself on a new line."""
|
|
15
|
+
Does the submission meet the Criteria? First, write out in a step by step manner your reasoning about each criterion to be sure that your conclusion is correct. Avoid simply stating the correct answers at the outset. Then print only the single character "Y" or "N" (without quotes or punctuation) on its own line corresponding to the correct answer of whether the submission meets all criteria. At the end, repeat just the letter again by itself on a new line.""" # noqa: E501
|
|
17
16
|
|
|
18
17
|
PROMPT = PromptTemplate(
|
|
19
18
|
input_variables=["input", "output", "criteria"], template=template
|
|
@@ -31,7 +30,7 @@ template = """You are assessing a submitted answer on a given task or input base
|
|
|
31
30
|
[Reference]: {reference}
|
|
32
31
|
***
|
|
33
32
|
[END DATA]
|
|
34
|
-
Does the submission meet the Criteria? First, write out in a step by step manner your reasoning about each criterion to be sure that your conclusion is correct. Avoid simply stating the correct answers at the outset. Then print only the single character "Y" or "N" (without quotes or punctuation) on its own line corresponding to the correct answer of whether the submission meets all criteria. At the end, repeat just the letter again by itself on a new line."""
|
|
33
|
+
Does the submission meet the Criteria? First, write out in a step by step manner your reasoning about each criterion to be sure that your conclusion is correct. Avoid simply stating the correct answers at the outset. Then print only the single character "Y" or "N" (without quotes or punctuation) on its own line corresponding to the correct answer of whether the submission meets all criteria. At the end, repeat just the letter again by itself on a new line.""" # noqa: E501
|
|
35
34
|
|
|
36
35
|
PROMPT_WITH_REFERENCES = PromptTemplate(
|
|
37
36
|
input_variables=["input", "output", "criteria", "reference"], template=template
|
|
@@ -23,12 +23,10 @@ from langchain.schema import RUN_KEY
|
|
|
23
23
|
def _import_numpy() -> Any:
|
|
24
24
|
try:
|
|
25
25
|
import numpy as np
|
|
26
|
-
|
|
27
|
-
return np
|
|
28
26
|
except ImportError as e:
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
msg = "Could not import numpy, please install with `pip install numpy`."
|
|
28
|
+
raise ImportError(msg) from e
|
|
29
|
+
return np
|
|
32
30
|
|
|
33
31
|
|
|
34
32
|
logger = logging.getLogger(__name__)
|
|
@@ -43,7 +41,7 @@ def _check_numpy() -> bool:
|
|
|
43
41
|
"langchain will use a pure Python implementation for embedding distance "
|
|
44
42
|
"operations, which may significantly impact performance, especially for large "
|
|
45
43
|
"datasets. For optimal speed and efficiency, consider installing NumPy: "
|
|
46
|
-
"pip install numpy"
|
|
44
|
+
"pip install numpy",
|
|
47
45
|
)
|
|
48
46
|
return False
|
|
49
47
|
|
|
@@ -63,11 +61,12 @@ def _embedding_factory() -> Embeddings:
|
|
|
63
61
|
from langchain_community.embeddings.openai import ( # type: ignore[no-redef]
|
|
64
62
|
OpenAIEmbeddings,
|
|
65
63
|
)
|
|
66
|
-
except ImportError:
|
|
67
|
-
|
|
64
|
+
except ImportError as e:
|
|
65
|
+
msg = (
|
|
68
66
|
"Could not import OpenAIEmbeddings. Please install the "
|
|
69
67
|
"OpenAIEmbeddings package using `pip install langchain-openai`."
|
|
70
68
|
)
|
|
69
|
+
raise ImportError(msg) from e
|
|
71
70
|
return OpenAIEmbeddings()
|
|
72
71
|
|
|
73
72
|
|
|
@@ -130,21 +129,23 @@ class _EmbeddingDistanceChainMixin(Chain):
|
|
|
130
129
|
pass
|
|
131
130
|
|
|
132
131
|
if not types_:
|
|
133
|
-
|
|
132
|
+
msg = (
|
|
134
133
|
"Could not import OpenAIEmbeddings. Please install the "
|
|
135
134
|
"OpenAIEmbeddings package using `pip install langchain-openai`."
|
|
136
135
|
)
|
|
136
|
+
raise ImportError(msg)
|
|
137
137
|
|
|
138
138
|
if isinstance(embeddings, tuple(types_)):
|
|
139
139
|
try:
|
|
140
140
|
import tiktoken # noqa: F401
|
|
141
|
-
except ImportError:
|
|
142
|
-
|
|
141
|
+
except ImportError as e:
|
|
142
|
+
msg = (
|
|
143
143
|
"The tiktoken library is required to use the default "
|
|
144
144
|
"OpenAI embeddings with embedding distance evaluators."
|
|
145
145
|
" Please either manually select a different Embeddings object"
|
|
146
146
|
" or install tiktoken using `pip install tiktoken`."
|
|
147
147
|
)
|
|
148
|
+
raise ImportError(msg) from e
|
|
148
149
|
return values
|
|
149
150
|
|
|
150
151
|
model_config = ConfigDict(
|
|
@@ -184,8 +185,8 @@ class _EmbeddingDistanceChainMixin(Chain):
|
|
|
184
185
|
}
|
|
185
186
|
if metric in metrics:
|
|
186
187
|
return metrics[metric]
|
|
187
|
-
|
|
188
|
-
|
|
188
|
+
msg = f"Invalid metric: {metric}"
|
|
189
|
+
raise ValueError(msg)
|
|
189
190
|
|
|
190
191
|
@staticmethod
|
|
191
192
|
def _cosine_distance(a: Any, b: Any) -> Any:
|
|
@@ -200,12 +201,13 @@ class _EmbeddingDistanceChainMixin(Chain):
|
|
|
200
201
|
"""
|
|
201
202
|
try:
|
|
202
203
|
from langchain_community.utils.math import cosine_similarity
|
|
203
|
-
except ImportError:
|
|
204
|
-
|
|
204
|
+
except ImportError as e:
|
|
205
|
+
msg = (
|
|
205
206
|
"The cosine_similarity function is required to compute cosine distance."
|
|
206
207
|
" Please install the langchain-community package using"
|
|
207
208
|
" `pip install langchain-community`."
|
|
208
209
|
)
|
|
210
|
+
raise ImportError(msg) from e
|
|
209
211
|
return 1.0 - cosine_similarity(a, b)
|
|
210
212
|
|
|
211
213
|
@staticmethod
|
|
@@ -343,7 +345,7 @@ class EmbeddingDistanceEvalChain(_EmbeddingDistanceChainMixin, StringEvaluator):
|
|
|
343
345
|
Dict[str, Any]: The computed score.
|
|
344
346
|
"""
|
|
345
347
|
vectors = self.embeddings.embed_documents(
|
|
346
|
-
[inputs["prediction"], inputs["reference"]]
|
|
348
|
+
[inputs["prediction"], inputs["reference"]],
|
|
347
349
|
)
|
|
348
350
|
if _check_numpy():
|
|
349
351
|
np = _import_numpy()
|
|
@@ -370,7 +372,7 @@ class EmbeddingDistanceEvalChain(_EmbeddingDistanceChainMixin, StringEvaluator):
|
|
|
370
372
|
[
|
|
371
373
|
inputs["prediction"],
|
|
372
374
|
inputs["reference"],
|
|
373
|
-
]
|
|
375
|
+
],
|
|
374
376
|
)
|
|
375
377
|
if _check_numpy():
|
|
376
378
|
np = _import_numpy()
|
|
@@ -448,7 +450,8 @@ class EmbeddingDistanceEvalChain(_EmbeddingDistanceChainMixin, StringEvaluator):
|
|
|
448
450
|
|
|
449
451
|
|
|
450
452
|
class PairwiseEmbeddingDistanceEvalChain(
|
|
451
|
-
_EmbeddingDistanceChainMixin,
|
|
453
|
+
_EmbeddingDistanceChainMixin,
|
|
454
|
+
PairwiseStringEvaluator,
|
|
452
455
|
):
|
|
453
456
|
"""Use embedding distances to score semantic difference between two predictions.
|
|
454
457
|
|
|
@@ -491,7 +494,7 @@ class PairwiseEmbeddingDistanceEvalChain(
|
|
|
491
494
|
[
|
|
492
495
|
inputs["prediction"],
|
|
493
496
|
inputs["prediction_b"],
|
|
494
|
-
]
|
|
497
|
+
],
|
|
495
498
|
)
|
|
496
499
|
if _check_numpy():
|
|
497
500
|
np = _import_numpy()
|
|
@@ -518,7 +521,7 @@ class PairwiseEmbeddingDistanceEvalChain(
|
|
|
518
521
|
[
|
|
519
522
|
inputs["prediction"],
|
|
520
523
|
inputs["prediction_b"],
|
|
521
|
-
]
|
|
524
|
+
],
|
|
522
525
|
)
|
|
523
526
|
if _check_numpy():
|
|
524
527
|
np = _import_numpy()
|
langchain/evaluation/loading.py
CHANGED
|
@@ -61,18 +61,20 @@ def load_dataset(uri: str) -> list[dict]:
|
|
|
61
61
|
"""
|
|
62
62
|
try:
|
|
63
63
|
from datasets import load_dataset
|
|
64
|
-
except ImportError:
|
|
65
|
-
|
|
64
|
+
except ImportError as e:
|
|
65
|
+
msg = (
|
|
66
66
|
"load_dataset requires the `datasets` package."
|
|
67
67
|
" Please install with `pip install datasets`"
|
|
68
68
|
)
|
|
69
|
+
raise ImportError(msg) from e
|
|
69
70
|
|
|
70
71
|
dataset = load_dataset(f"LangChainDatasets/{uri}")
|
|
71
|
-
return
|
|
72
|
+
return list(dataset["train"])
|
|
72
73
|
|
|
73
74
|
|
|
74
75
|
_EVALUATOR_MAP: dict[
|
|
75
|
-
EvaluatorType,
|
|
76
|
+
EvaluatorType,
|
|
77
|
+
Union[type[LLMEvalChain], type[Chain], type[StringEvaluator]],
|
|
76
78
|
] = {
|
|
77
79
|
EvaluatorType.QA: QAEvalChain,
|
|
78
80
|
EvaluatorType.COT_QA: CotQAEvalChain,
|
|
@@ -125,10 +127,11 @@ def load_evaluator(
|
|
|
125
127
|
>>> evaluator = load_evaluator(EvaluatorType.QA)
|
|
126
128
|
"""
|
|
127
129
|
if evaluator not in _EVALUATOR_MAP:
|
|
128
|
-
|
|
130
|
+
msg = (
|
|
129
131
|
f"Unknown evaluator type: {evaluator}"
|
|
130
132
|
f"\nValid types are: {list(_EVALUATOR_MAP.keys())}"
|
|
131
133
|
)
|
|
134
|
+
raise ValueError(msg)
|
|
132
135
|
evaluator_cls = _EVALUATOR_MAP[evaluator]
|
|
133
136
|
if issubclass(evaluator_cls, LLMEvalChain):
|
|
134
137
|
try:
|
|
@@ -139,27 +142,28 @@ def load_evaluator(
|
|
|
139
142
|
from langchain_community.chat_models.openai import ( # type: ignore[no-redef]
|
|
140
143
|
ChatOpenAI,
|
|
141
144
|
)
|
|
142
|
-
except ImportError:
|
|
143
|
-
|
|
145
|
+
except ImportError as e:
|
|
146
|
+
msg = (
|
|
144
147
|
"Could not import langchain_openai or fallback onto "
|
|
145
148
|
"langchain_community. Please install langchain_openai "
|
|
146
149
|
"or specify a language model explicitly. "
|
|
147
150
|
"It's recommended to install langchain_openai AND "
|
|
148
151
|
"specify a language model explicitly."
|
|
149
152
|
)
|
|
153
|
+
raise ImportError(msg) from e
|
|
150
154
|
|
|
151
155
|
llm = llm or ChatOpenAI(model="gpt-4", seed=42, temperature=0)
|
|
152
156
|
except Exception as e:
|
|
153
|
-
|
|
157
|
+
msg = (
|
|
154
158
|
f"Evaluation with the {evaluator_cls} requires a "
|
|
155
159
|
"language model to function."
|
|
156
160
|
" Failed to create the default 'gpt-4' model."
|
|
157
161
|
" Please manually provide an evaluation LLM"
|
|
158
162
|
" or check your openai credentials."
|
|
159
|
-
)
|
|
163
|
+
)
|
|
164
|
+
raise ValueError(msg) from e
|
|
160
165
|
return evaluator_cls.from_llm(llm=llm, **kwargs)
|
|
161
|
-
|
|
162
|
-
return evaluator_cls(**kwargs)
|
|
166
|
+
return evaluator_cls(**kwargs)
|
|
163
167
|
|
|
164
168
|
|
|
165
169
|
def load_evaluators(
|
|
@@ -5,6 +5,7 @@ from operator import eq
|
|
|
5
5
|
from typing import Any, Callable, Optional, Union, cast
|
|
6
6
|
|
|
7
7
|
from langchain_core.utils.json import parse_json_markdown
|
|
8
|
+
from typing_extensions import override
|
|
8
9
|
|
|
9
10
|
from langchain.evaluation.schema import StringEvaluator
|
|
10
11
|
|
|
@@ -49,6 +50,7 @@ class JsonValidityEvaluator(StringEvaluator):
|
|
|
49
50
|
def evaluation_name(self) -> str:
|
|
50
51
|
return "json_validity"
|
|
51
52
|
|
|
53
|
+
@override
|
|
52
54
|
def _evaluate_strings(
|
|
53
55
|
self,
|
|
54
56
|
prediction: str,
|
|
@@ -72,9 +74,9 @@ class JsonValidityEvaluator(StringEvaluator):
|
|
|
72
74
|
"""
|
|
73
75
|
try:
|
|
74
76
|
parse_json_markdown(prediction, parser=json.loads)
|
|
75
|
-
return {"score": 1}
|
|
76
77
|
except Exception as e:
|
|
77
78
|
return {"score": 0, "reasoning": str(e)}
|
|
79
|
+
return {"score": 1}
|
|
78
80
|
|
|
79
81
|
|
|
80
82
|
class JsonEqualityEvaluator(StringEvaluator):
|
|
@@ -132,6 +134,7 @@ class JsonEqualityEvaluator(StringEvaluator):
|
|
|
132
134
|
return parse_json_markdown(string)
|
|
133
135
|
return string
|
|
134
136
|
|
|
137
|
+
@override
|
|
135
138
|
def _evaluate_strings(
|
|
136
139
|
self,
|
|
137
140
|
prediction: str,
|
|
@@ -2,6 +2,7 @@ import json
|
|
|
2
2
|
from typing import Any, Callable, Optional, Union
|
|
3
3
|
|
|
4
4
|
from langchain_core.utils.json import parse_json_markdown
|
|
5
|
+
from typing_extensions import override
|
|
5
6
|
|
|
6
7
|
from langchain.evaluation.schema import StringEvaluator
|
|
7
8
|
|
|
@@ -47,13 +48,14 @@ class JsonEditDistanceEvaluator(StringEvaluator):
|
|
|
47
48
|
else:
|
|
48
49
|
try:
|
|
49
50
|
from rapidfuzz import distance as rfd
|
|
50
|
-
except ImportError:
|
|
51
|
-
|
|
51
|
+
except ImportError as e:
|
|
52
|
+
msg = (
|
|
52
53
|
"The default string_distance operator for the "
|
|
53
54
|
" JsonEditDistanceEvaluator requires installation of "
|
|
54
55
|
"the rapidfuzz package. "
|
|
55
56
|
"Please install it with `pip install rapidfuzz`."
|
|
56
57
|
)
|
|
58
|
+
raise ImportError(msg) from e
|
|
57
59
|
self._string_distance = rfd.DamerauLevenshtein.normalized_distance
|
|
58
60
|
if canonicalize is not None:
|
|
59
61
|
self._canonicalize = canonicalize
|
|
@@ -81,6 +83,7 @@ class JsonEditDistanceEvaluator(StringEvaluator):
|
|
|
81
83
|
return parse_json_markdown(node)
|
|
82
84
|
return node
|
|
83
85
|
|
|
86
|
+
@override
|
|
84
87
|
def _evaluate_strings(
|
|
85
88
|
self,
|
|
86
89
|
prediction: str,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from typing import Any, Union
|
|
2
2
|
|
|
3
3
|
from langchain_core.utils.json import parse_json_markdown
|
|
4
|
+
from typing_extensions import override
|
|
4
5
|
|
|
5
6
|
from langchain.evaluation.schema import StringEvaluator
|
|
6
7
|
|
|
@@ -44,11 +45,12 @@ class JsonSchemaEvaluator(StringEvaluator):
|
|
|
44
45
|
super().__init__()
|
|
45
46
|
try:
|
|
46
47
|
import jsonschema # noqa: F401
|
|
47
|
-
except ImportError:
|
|
48
|
-
|
|
48
|
+
except ImportError as e:
|
|
49
|
+
msg = (
|
|
49
50
|
"The JsonSchemaEvaluator requires the jsonschema package."
|
|
50
51
|
" Please install it with `pip install jsonschema`."
|
|
51
52
|
)
|
|
53
|
+
raise ImportError(msg) from e
|
|
52
54
|
|
|
53
55
|
@property
|
|
54
56
|
def requires_input(self) -> bool:
|
|
@@ -68,9 +70,12 @@ class JsonSchemaEvaluator(StringEvaluator):
|
|
|
68
70
|
def _parse_json(self, node: Any) -> Union[dict, list, None, float, bool, int, str]:
|
|
69
71
|
if isinstance(node, str):
|
|
70
72
|
return parse_json_markdown(node)
|
|
71
|
-
|
|
72
|
-
# Pydantic model
|
|
73
|
-
return
|
|
73
|
+
if hasattr(node, "model_json_schema") and callable(node.model_json_schema):
|
|
74
|
+
# Pydantic v2 model
|
|
75
|
+
return node.model_json_schema()
|
|
76
|
+
if hasattr(node, "schema") and callable(node.schema):
|
|
77
|
+
# Pydantic v1 model
|
|
78
|
+
return node.schema()
|
|
74
79
|
return node
|
|
75
80
|
|
|
76
81
|
def _validate(self, prediction: Any, schema: Any) -> dict:
|
|
@@ -78,12 +83,11 @@ class JsonSchemaEvaluator(StringEvaluator):
|
|
|
78
83
|
|
|
79
84
|
try:
|
|
80
85
|
validate(instance=prediction, schema=schema)
|
|
81
|
-
return {
|
|
82
|
-
"score": True,
|
|
83
|
-
}
|
|
84
86
|
except ValidationError as e:
|
|
85
87
|
return {"score": False, "reasoning": repr(e)}
|
|
88
|
+
return {"score": True}
|
|
86
89
|
|
|
90
|
+
@override
|
|
87
91
|
def _evaluate_strings(
|
|
88
92
|
self,
|
|
89
93
|
prediction: Union[str, Any],
|
|
@@ -7,4 +7,4 @@ from langchain.evaluation.qa.eval_chain import (
|
|
|
7
7
|
)
|
|
8
8
|
from langchain.evaluation.qa.generate_chain import QAGenerateChain
|
|
9
9
|
|
|
10
|
-
__all__ = ["
|
|
10
|
+
__all__ = ["ContextQAEvalChain", "CotQAEvalChain", "QAEvalChain", "QAGenerateChain"]
|