langchain 0.3.23__py3-none-any.whl → 0.3.24__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.
- langchain/_api/module_import.py +3 -3
- langchain/agents/agent.py +104 -109
- langchain/agents/agent_iterator.py +11 -15
- langchain/agents/agent_toolkits/conversational_retrieval/openai_functions.py +2 -2
- langchain/agents/agent_toolkits/vectorstore/base.py +3 -3
- langchain/agents/agent_toolkits/vectorstore/toolkit.py +4 -6
- langchain/agents/chat/base.py +7 -6
- langchain/agents/chat/output_parser.py +2 -1
- langchain/agents/conversational/base.py +5 -4
- langchain/agents/conversational_chat/base.py +9 -8
- langchain/agents/format_scratchpad/log.py +1 -3
- langchain/agents/format_scratchpad/log_to_messages.py +3 -5
- langchain/agents/format_scratchpad/openai_functions.py +4 -4
- langchain/agents/format_scratchpad/tools.py +3 -3
- langchain/agents/format_scratchpad/xml.py +1 -3
- langchain/agents/initialize.py +2 -1
- langchain/agents/json_chat/base.py +3 -2
- langchain/agents/loading.py +5 -5
- langchain/agents/mrkl/base.py +6 -5
- langchain/agents/openai_assistant/base.py +13 -17
- langchain/agents/openai_functions_agent/agent_token_buffer_memory.py +6 -6
- langchain/agents/openai_functions_agent/base.py +13 -12
- langchain/agents/openai_functions_multi_agent/base.py +15 -14
- langchain/agents/openai_tools/base.py +2 -1
- langchain/agents/output_parsers/openai_functions.py +2 -2
- langchain/agents/output_parsers/openai_tools.py +6 -6
- langchain/agents/output_parsers/react_json_single_input.py +2 -1
- langchain/agents/output_parsers/self_ask.py +2 -1
- langchain/agents/output_parsers/tools.py +7 -7
- langchain/agents/react/agent.py +3 -2
- langchain/agents/react/base.py +4 -3
- langchain/agents/schema.py +3 -3
- langchain/agents/self_ask_with_search/base.py +2 -1
- langchain/agents/structured_chat/base.py +9 -8
- langchain/agents/structured_chat/output_parser.py +2 -1
- langchain/agents/tool_calling_agent/base.py +3 -2
- langchain/agents/tools.py +4 -4
- langchain/agents/types.py +3 -3
- langchain/agents/utils.py +1 -1
- langchain/agents/xml/base.py +7 -6
- langchain/callbacks/streaming_aiter.py +3 -2
- langchain/callbacks/streaming_aiter_final_only.py +3 -3
- langchain/callbacks/streaming_stdout_final_only.py +3 -3
- langchain/chains/api/base.py +11 -12
- langchain/chains/base.py +47 -50
- langchain/chains/combine_documents/base.py +23 -23
- langchain/chains/combine_documents/map_reduce.py +12 -12
- langchain/chains/combine_documents/map_rerank.py +16 -15
- langchain/chains/combine_documents/reduce.py +17 -17
- langchain/chains/combine_documents/refine.py +12 -12
- langchain/chains/combine_documents/stuff.py +10 -10
- langchain/chains/constitutional_ai/base.py +9 -9
- langchain/chains/conversation/base.py +2 -4
- langchain/chains/conversational_retrieval/base.py +30 -30
- langchain/chains/elasticsearch_database/base.py +13 -13
- langchain/chains/example_generator.py +1 -3
- langchain/chains/flare/base.py +13 -12
- langchain/chains/flare/prompts.py +2 -4
- langchain/chains/hyde/base.py +8 -8
- langchain/chains/llm.py +31 -30
- langchain/chains/llm_checker/base.py +6 -6
- langchain/chains/llm_math/base.py +10 -10
- langchain/chains/llm_summarization_checker/base.py +6 -6
- langchain/chains/loading.py +12 -14
- langchain/chains/mapreduce.py +7 -6
- langchain/chains/moderation.py +8 -8
- langchain/chains/natbot/base.py +6 -6
- langchain/chains/openai_functions/base.py +8 -10
- langchain/chains/openai_functions/citation_fuzzy_match.py +4 -4
- langchain/chains/openai_functions/extraction.py +3 -3
- langchain/chains/openai_functions/openapi.py +12 -12
- langchain/chains/openai_functions/qa_with_structure.py +4 -4
- langchain/chains/openai_functions/utils.py +2 -2
- langchain/chains/openai_tools/extraction.py +2 -2
- langchain/chains/prompt_selector.py +3 -3
- langchain/chains/qa_generation/base.py +5 -5
- langchain/chains/qa_with_sources/base.py +21 -21
- langchain/chains/qa_with_sources/loading.py +2 -1
- langchain/chains/qa_with_sources/retrieval.py +6 -6
- langchain/chains/qa_with_sources/vector_db.py +8 -8
- langchain/chains/query_constructor/base.py +4 -3
- langchain/chains/query_constructor/parser.py +5 -4
- langchain/chains/question_answering/chain.py +3 -2
- langchain/chains/retrieval.py +2 -2
- langchain/chains/retrieval_qa/base.py +16 -16
- langchain/chains/router/base.py +12 -11
- langchain/chains/router/embedding_router.py +12 -11
- langchain/chains/router/llm_router.py +12 -12
- langchain/chains/router/multi_prompt.py +3 -3
- langchain/chains/router/multi_retrieval_qa.py +5 -4
- langchain/chains/sequential.py +18 -18
- langchain/chains/sql_database/query.py +4 -4
- langchain/chains/structured_output/base.py +14 -13
- langchain/chains/summarize/chain.py +4 -3
- langchain/chains/transform.py +12 -11
- langchain/chat_models/base.py +27 -31
- langchain/embeddings/__init__.py +1 -1
- langchain/embeddings/base.py +4 -4
- langchain/embeddings/cache.py +19 -18
- langchain/evaluation/agents/trajectory_eval_chain.py +16 -19
- langchain/evaluation/comparison/eval_chain.py +10 -10
- langchain/evaluation/criteria/eval_chain.py +11 -10
- langchain/evaluation/embedding_distance/base.py +21 -21
- langchain/evaluation/exact_match/base.py +3 -3
- langchain/evaluation/loading.py +7 -8
- langchain/evaluation/qa/eval_chain.py +7 -6
- langchain/evaluation/regex_match/base.py +3 -3
- langchain/evaluation/schema.py +6 -5
- langchain/evaluation/scoring/eval_chain.py +9 -9
- langchain/evaluation/string_distance/base.py +23 -23
- langchain/hub.py +2 -1
- langchain/indexes/_sql_record_manager.py +8 -7
- langchain/indexes/vectorstore.py +11 -11
- langchain/llms/__init__.py +3 -3
- langchain/memory/buffer.py +13 -13
- langchain/memory/buffer_window.py +5 -5
- langchain/memory/chat_memory.py +5 -5
- langchain/memory/combined.py +10 -10
- langchain/memory/entity.py +8 -7
- langchain/memory/readonly.py +4 -4
- langchain/memory/simple.py +5 -5
- langchain/memory/summary.py +8 -8
- langchain/memory/summary_buffer.py +11 -11
- langchain/memory/token_buffer.py +5 -5
- langchain/memory/utils.py +2 -2
- langchain/memory/vectorstore.py +15 -14
- langchain/memory/vectorstore_token_buffer_memory.py +7 -7
- langchain/model_laboratory.py +4 -3
- langchain/output_parsers/combining.py +5 -5
- langchain/output_parsers/datetime.py +1 -2
- langchain/output_parsers/enum.py +4 -5
- langchain/output_parsers/pandas_dataframe.py +5 -5
- langchain/output_parsers/regex.py +4 -4
- langchain/output_parsers/regex_dict.py +4 -4
- langchain/output_parsers/retry.py +2 -2
- langchain/output_parsers/structured.py +5 -5
- langchain/output_parsers/yaml.py +3 -3
- langchain/pydantic_v1/__init__.py +1 -6
- langchain/pydantic_v1/dataclasses.py +1 -5
- langchain/pydantic_v1/main.py +1 -5
- langchain/retrievers/contextual_compression.py +3 -3
- langchain/retrievers/document_compressors/base.py +3 -2
- langchain/retrievers/document_compressors/chain_extract.py +4 -3
- langchain/retrievers/document_compressors/chain_filter.py +3 -2
- langchain/retrievers/document_compressors/cohere_rerank.py +4 -3
- langchain/retrievers/document_compressors/cross_encoder.py +1 -2
- langchain/retrievers/document_compressors/cross_encoder_rerank.py +2 -1
- langchain/retrievers/document_compressors/embeddings_filter.py +3 -2
- langchain/retrievers/document_compressors/listwise_rerank.py +6 -5
- langchain/retrievers/ensemble.py +15 -19
- langchain/retrievers/merger_retriever.py +7 -12
- langchain/retrievers/multi_query.py +14 -13
- langchain/retrievers/multi_vector.py +4 -4
- langchain/retrievers/parent_document_retriever.py +9 -8
- langchain/retrievers/re_phraser.py +2 -3
- langchain/retrievers/self_query/base.py +13 -12
- langchain/retrievers/time_weighted_retriever.py +14 -14
- langchain/runnables/openai_functions.py +4 -3
- langchain/smith/evaluation/config.py +7 -6
- langchain/smith/evaluation/progress.py +3 -2
- langchain/smith/evaluation/runner_utils.py +58 -61
- langchain/smith/evaluation/string_run_evaluator.py +29 -29
- langchain/storage/encoder_backed.py +7 -11
- langchain/storage/file_system.py +5 -4
- {langchain-0.3.23.dist-info → langchain-0.3.24.dist-info}/METADATA +2 -2
- {langchain-0.3.23.dist-info → langchain-0.3.24.dist-info}/RECORD +169 -169
- {langchain-0.3.23.dist-info → langchain-0.3.24.dist-info}/WHEEL +1 -1
- langchain-0.3.24.dist-info/entry_points.txt +4 -0
- langchain-0.3.23.dist-info/entry_points.txt +0 -5
- {langchain-0.3.23.dist-info → langchain-0.3.24.dist-info}/licenses/LICENSE +0 -0
|
@@ -4,7 +4,7 @@ import functools
|
|
|
4
4
|
import logging
|
|
5
5
|
from enum import Enum
|
|
6
6
|
from importlib import util
|
|
7
|
-
from typing import Any,
|
|
7
|
+
from typing import Any, Optional
|
|
8
8
|
|
|
9
9
|
from langchain_core.callbacks.manager import (
|
|
10
10
|
AsyncCallbackManagerForChainRun,
|
|
@@ -102,7 +102,7 @@ class _EmbeddingDistanceChainMixin(Chain):
|
|
|
102
102
|
distance_metric: EmbeddingDistance = Field(default=EmbeddingDistance.COSINE)
|
|
103
103
|
|
|
104
104
|
@pre_init
|
|
105
|
-
def _validate_tiktoken_installed(cls, values:
|
|
105
|
+
def _validate_tiktoken_installed(cls, values: dict[str, Any]) -> dict[str, Any]:
|
|
106
106
|
"""Validate that the TikTok library is installed.
|
|
107
107
|
|
|
108
108
|
Args:
|
|
@@ -152,7 +152,7 @@ class _EmbeddingDistanceChainMixin(Chain):
|
|
|
152
152
|
)
|
|
153
153
|
|
|
154
154
|
@property
|
|
155
|
-
def output_keys(self) ->
|
|
155
|
+
def output_keys(self) -> list[str]:
|
|
156
156
|
"""Return the output keys of the chain.
|
|
157
157
|
|
|
158
158
|
Returns:
|
|
@@ -319,7 +319,7 @@ class EmbeddingDistanceEvalChain(_EmbeddingDistanceChainMixin, StringEvaluator):
|
|
|
319
319
|
return f"embedding_{self.distance_metric.value}_distance"
|
|
320
320
|
|
|
321
321
|
@property
|
|
322
|
-
def input_keys(self) ->
|
|
322
|
+
def input_keys(self) -> list[str]:
|
|
323
323
|
"""Return the input keys of the chain.
|
|
324
324
|
|
|
325
325
|
Returns:
|
|
@@ -329,9 +329,9 @@ class EmbeddingDistanceEvalChain(_EmbeddingDistanceChainMixin, StringEvaluator):
|
|
|
329
329
|
|
|
330
330
|
def _call(
|
|
331
331
|
self,
|
|
332
|
-
inputs:
|
|
332
|
+
inputs: dict[str, Any],
|
|
333
333
|
run_manager: Optional[CallbackManagerForChainRun] = None,
|
|
334
|
-
) ->
|
|
334
|
+
) -> dict[str, Any]:
|
|
335
335
|
"""Compute the score for a prediction and reference.
|
|
336
336
|
|
|
337
337
|
Args:
|
|
@@ -353,9 +353,9 @@ class EmbeddingDistanceEvalChain(_EmbeddingDistanceChainMixin, StringEvaluator):
|
|
|
353
353
|
|
|
354
354
|
async def _acall(
|
|
355
355
|
self,
|
|
356
|
-
inputs:
|
|
356
|
+
inputs: dict[str, Any],
|
|
357
357
|
run_manager: Optional[AsyncCallbackManagerForChainRun] = None,
|
|
358
|
-
) ->
|
|
358
|
+
) -> dict[str, Any]:
|
|
359
359
|
"""Asynchronously compute the score for a prediction and reference.
|
|
360
360
|
|
|
361
361
|
Args:
|
|
@@ -384,8 +384,8 @@ class EmbeddingDistanceEvalChain(_EmbeddingDistanceChainMixin, StringEvaluator):
|
|
|
384
384
|
prediction: str,
|
|
385
385
|
reference: Optional[str] = None,
|
|
386
386
|
callbacks: Callbacks = None,
|
|
387
|
-
tags: Optional[
|
|
388
|
-
metadata: Optional[
|
|
387
|
+
tags: Optional[list[str]] = None,
|
|
388
|
+
metadata: Optional[dict[str, Any]] = None,
|
|
389
389
|
include_run_info: bool = False,
|
|
390
390
|
**kwargs: Any,
|
|
391
391
|
) -> dict:
|
|
@@ -418,8 +418,8 @@ class EmbeddingDistanceEvalChain(_EmbeddingDistanceChainMixin, StringEvaluator):
|
|
|
418
418
|
prediction: str,
|
|
419
419
|
reference: Optional[str] = None,
|
|
420
420
|
callbacks: Callbacks = None,
|
|
421
|
-
tags: Optional[
|
|
422
|
-
metadata: Optional[
|
|
421
|
+
tags: Optional[list[str]] = None,
|
|
422
|
+
metadata: Optional[dict[str, Any]] = None,
|
|
423
423
|
include_run_info: bool = False,
|
|
424
424
|
**kwargs: Any,
|
|
425
425
|
) -> dict:
|
|
@@ -460,7 +460,7 @@ class PairwiseEmbeddingDistanceEvalChain(
|
|
|
460
460
|
"""
|
|
461
461
|
|
|
462
462
|
@property
|
|
463
|
-
def input_keys(self) ->
|
|
463
|
+
def input_keys(self) -> list[str]:
|
|
464
464
|
"""Return the input keys of the chain.
|
|
465
465
|
|
|
466
466
|
Returns:
|
|
@@ -474,9 +474,9 @@ class PairwiseEmbeddingDistanceEvalChain(
|
|
|
474
474
|
|
|
475
475
|
def _call(
|
|
476
476
|
self,
|
|
477
|
-
inputs:
|
|
477
|
+
inputs: dict[str, Any],
|
|
478
478
|
run_manager: Optional[CallbackManagerForChainRun] = None,
|
|
479
|
-
) ->
|
|
479
|
+
) -> dict[str, Any]:
|
|
480
480
|
"""Compute the score for two predictions.
|
|
481
481
|
|
|
482
482
|
Args:
|
|
@@ -501,9 +501,9 @@ class PairwiseEmbeddingDistanceEvalChain(
|
|
|
501
501
|
|
|
502
502
|
async def _acall(
|
|
503
503
|
self,
|
|
504
|
-
inputs:
|
|
504
|
+
inputs: dict[str, Any],
|
|
505
505
|
run_manager: Optional[AsyncCallbackManagerForChainRun] = None,
|
|
506
|
-
) ->
|
|
506
|
+
) -> dict[str, Any]:
|
|
507
507
|
"""Asynchronously compute the score for two predictions.
|
|
508
508
|
|
|
509
509
|
Args:
|
|
@@ -532,8 +532,8 @@ class PairwiseEmbeddingDistanceEvalChain(
|
|
|
532
532
|
prediction: str,
|
|
533
533
|
prediction_b: str,
|
|
534
534
|
callbacks: Callbacks = None,
|
|
535
|
-
tags: Optional[
|
|
536
|
-
metadata: Optional[
|
|
535
|
+
tags: Optional[list[str]] = None,
|
|
536
|
+
metadata: Optional[dict[str, Any]] = None,
|
|
537
537
|
include_run_info: bool = False,
|
|
538
538
|
**kwargs: Any,
|
|
539
539
|
) -> dict:
|
|
@@ -567,8 +567,8 @@ class PairwiseEmbeddingDistanceEvalChain(
|
|
|
567
567
|
prediction: str,
|
|
568
568
|
prediction_b: str,
|
|
569
569
|
callbacks: Callbacks = None,
|
|
570
|
-
tags: Optional[
|
|
571
|
-
metadata: Optional[
|
|
570
|
+
tags: Optional[list[str]] = None,
|
|
571
|
+
metadata: Optional[dict[str, Any]] = None,
|
|
572
572
|
include_run_info: bool = False,
|
|
573
573
|
**kwargs: Any,
|
|
574
574
|
) -> dict:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import string
|
|
2
|
-
from typing import Any
|
|
2
|
+
from typing import Any
|
|
3
3
|
|
|
4
4
|
from langchain.evaluation.schema import StringEvaluator
|
|
5
5
|
|
|
@@ -49,7 +49,7 @@ class ExactMatchStringEvaluator(StringEvaluator):
|
|
|
49
49
|
return True
|
|
50
50
|
|
|
51
51
|
@property
|
|
52
|
-
def input_keys(self) ->
|
|
52
|
+
def input_keys(self) -> list[str]:
|
|
53
53
|
"""
|
|
54
54
|
Get the input keys.
|
|
55
55
|
|
|
@@ -68,7 +68,7 @@ class ExactMatchStringEvaluator(StringEvaluator):
|
|
|
68
68
|
"""
|
|
69
69
|
return "exact_match"
|
|
70
70
|
|
|
71
|
-
def _evaluate_strings( # type: ignore[
|
|
71
|
+
def _evaluate_strings( # type: ignore[override]
|
|
72
72
|
self,
|
|
73
73
|
*,
|
|
74
74
|
prediction: str,
|
langchain/evaluation/loading.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""Loading datasets and evaluators."""
|
|
2
2
|
|
|
3
|
-
from
|
|
3
|
+
from collections.abc import Sequence
|
|
4
|
+
from typing import Any, Optional, Union
|
|
4
5
|
|
|
5
6
|
from langchain_core.language_models import BaseLanguageModel
|
|
6
7
|
|
|
@@ -36,7 +37,7 @@ from langchain.evaluation.string_distance.base import (
|
|
|
36
37
|
)
|
|
37
38
|
|
|
38
39
|
|
|
39
|
-
def load_dataset(uri: str) ->
|
|
40
|
+
def load_dataset(uri: str) -> list[dict]:
|
|
40
41
|
"""Load a dataset from the `LangChainDatasets on HuggingFace <https://huggingface.co/LangChainDatasets>`_.
|
|
41
42
|
|
|
42
43
|
Args:
|
|
@@ -70,8 +71,8 @@ def load_dataset(uri: str) -> List[Dict]:
|
|
|
70
71
|
return [d for d in dataset["train"]]
|
|
71
72
|
|
|
72
73
|
|
|
73
|
-
_EVALUATOR_MAP:
|
|
74
|
-
EvaluatorType, Union[
|
|
74
|
+
_EVALUATOR_MAP: dict[
|
|
75
|
+
EvaluatorType, Union[type[LLMEvalChain], type[Chain], type[StringEvaluator]]
|
|
75
76
|
] = {
|
|
76
77
|
EvaluatorType.QA: QAEvalChain,
|
|
77
78
|
EvaluatorType.COT_QA: CotQAEvalChain,
|
|
@@ -147,9 +148,7 @@ def load_evaluator(
|
|
|
147
148
|
"specify a language model explicitly."
|
|
148
149
|
)
|
|
149
150
|
|
|
150
|
-
llm = llm or ChatOpenAI(
|
|
151
|
-
model="gpt-4", seed=42, temperature=0
|
|
152
|
-
)
|
|
151
|
+
llm = llm or ChatOpenAI(model="gpt-4", seed=42, temperature=0)
|
|
153
152
|
except Exception as e:
|
|
154
153
|
raise ValueError(
|
|
155
154
|
f"Evaluation with the {evaluator_cls} requires a "
|
|
@@ -169,7 +168,7 @@ def load_evaluators(
|
|
|
169
168
|
llm: Optional[BaseLanguageModel] = None,
|
|
170
169
|
config: Optional[dict] = None,
|
|
171
170
|
**kwargs: Any,
|
|
172
|
-
) ->
|
|
171
|
+
) -> list[Union[Chain, StringEvaluator]]:
|
|
173
172
|
"""Load evaluators specified by a list of evaluator types.
|
|
174
173
|
|
|
175
174
|
Parameters
|
|
@@ -4,7 +4,8 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import re
|
|
6
6
|
import string
|
|
7
|
-
from
|
|
7
|
+
from collections.abc import Sequence
|
|
8
|
+
from typing import Any, Optional
|
|
8
9
|
|
|
9
10
|
from langchain_core.callbacks.manager import Callbacks
|
|
10
11
|
from langchain_core.language_models import BaseLanguageModel
|
|
@@ -17,7 +18,7 @@ from langchain.evaluation.schema import LLMEvalChain, StringEvaluator
|
|
|
17
18
|
from langchain.schema import RUN_KEY
|
|
18
19
|
|
|
19
20
|
|
|
20
|
-
def _get_score(text: str) -> Optional[
|
|
21
|
+
def _get_score(text: str) -> Optional[tuple[str, int]]:
|
|
21
22
|
match = re.search(r"grade:\s*(correct|incorrect)", text.strip(), re.IGNORECASE)
|
|
22
23
|
if match:
|
|
23
24
|
if match.group(1).upper() == "CORRECT":
|
|
@@ -133,7 +134,7 @@ class QAEvalChain(LLMChain, StringEvaluator, LLMEvalChain):
|
|
|
133
134
|
prediction_key: str = "result",
|
|
134
135
|
*,
|
|
135
136
|
callbacks: Callbacks = None,
|
|
136
|
-
) ->
|
|
137
|
+
) -> list[dict]:
|
|
137
138
|
"""Evaluate question answering examples and predictions."""
|
|
138
139
|
inputs = [
|
|
139
140
|
{
|
|
@@ -267,14 +268,14 @@ class ContextQAEvalChain(LLMChain, StringEvaluator, LLMEvalChain):
|
|
|
267
268
|
|
|
268
269
|
def evaluate(
|
|
269
270
|
self,
|
|
270
|
-
examples:
|
|
271
|
-
predictions:
|
|
271
|
+
examples: list[dict],
|
|
272
|
+
predictions: list[dict],
|
|
272
273
|
question_key: str = "query",
|
|
273
274
|
context_key: str = "context",
|
|
274
275
|
prediction_key: str = "result",
|
|
275
276
|
*,
|
|
276
277
|
callbacks: Callbacks = None,
|
|
277
|
-
) ->
|
|
278
|
+
) -> list[dict]:
|
|
278
279
|
"""Evaluate question answering examples and predictions."""
|
|
279
280
|
inputs = [
|
|
280
281
|
{
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import re
|
|
2
|
-
from typing import Any
|
|
2
|
+
from typing import Any
|
|
3
3
|
|
|
4
4
|
from langchain.evaluation.schema import StringEvaluator
|
|
5
5
|
|
|
@@ -46,7 +46,7 @@ class RegexMatchStringEvaluator(StringEvaluator):
|
|
|
46
46
|
return True
|
|
47
47
|
|
|
48
48
|
@property
|
|
49
|
-
def input_keys(self) ->
|
|
49
|
+
def input_keys(self) -> list[str]:
|
|
50
50
|
"""
|
|
51
51
|
Get the input keys.
|
|
52
52
|
|
|
@@ -65,7 +65,7 @@ class RegexMatchStringEvaluator(StringEvaluator):
|
|
|
65
65
|
"""
|
|
66
66
|
return "regex_match"
|
|
67
67
|
|
|
68
|
-
def _evaluate_strings( # type: ignore[
|
|
68
|
+
def _evaluate_strings( # type: ignore[override]
|
|
69
69
|
self,
|
|
70
70
|
*,
|
|
71
71
|
prediction: str,
|
langchain/evaluation/schema.py
CHANGED
|
@@ -4,8 +4,9 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import logging
|
|
6
6
|
from abc import ABC, abstractmethod
|
|
7
|
+
from collections.abc import Sequence
|
|
7
8
|
from enum import Enum
|
|
8
|
-
from typing import Any, Optional,
|
|
9
|
+
from typing import Any, Optional, Union
|
|
9
10
|
from warnings import warn
|
|
10
11
|
|
|
11
12
|
from langchain_core.agents import AgentAction
|
|
@@ -372,7 +373,7 @@ class AgentTrajectoryEvaluator(_EvalArgsMixin, ABC):
|
|
|
372
373
|
self,
|
|
373
374
|
*,
|
|
374
375
|
prediction: str,
|
|
375
|
-
agent_trajectory: Sequence[
|
|
376
|
+
agent_trajectory: Sequence[tuple[AgentAction, str]],
|
|
376
377
|
input: str,
|
|
377
378
|
reference: Optional[str] = None,
|
|
378
379
|
**kwargs: Any,
|
|
@@ -394,7 +395,7 @@ class AgentTrajectoryEvaluator(_EvalArgsMixin, ABC):
|
|
|
394
395
|
self,
|
|
395
396
|
*,
|
|
396
397
|
prediction: str,
|
|
397
|
-
agent_trajectory: Sequence[
|
|
398
|
+
agent_trajectory: Sequence[tuple[AgentAction, str]],
|
|
398
399
|
input: str,
|
|
399
400
|
reference: Optional[str] = None,
|
|
400
401
|
**kwargs: Any,
|
|
@@ -425,7 +426,7 @@ class AgentTrajectoryEvaluator(_EvalArgsMixin, ABC):
|
|
|
425
426
|
self,
|
|
426
427
|
*,
|
|
427
428
|
prediction: str,
|
|
428
|
-
agent_trajectory: Sequence[
|
|
429
|
+
agent_trajectory: Sequence[tuple[AgentAction, str]],
|
|
429
430
|
input: str,
|
|
430
431
|
reference: Optional[str] = None,
|
|
431
432
|
**kwargs: Any,
|
|
@@ -455,7 +456,7 @@ class AgentTrajectoryEvaluator(_EvalArgsMixin, ABC):
|
|
|
455
456
|
self,
|
|
456
457
|
*,
|
|
457
458
|
prediction: str,
|
|
458
|
-
agent_trajectory: Sequence[
|
|
459
|
+
agent_trajectory: Sequence[tuple[AgentAction, str]],
|
|
459
460
|
input: str,
|
|
460
461
|
reference: Optional[str] = None,
|
|
461
462
|
**kwargs: Any,
|
|
@@ -4,7 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import logging
|
|
6
6
|
import re
|
|
7
|
-
from typing import Any,
|
|
7
|
+
from typing import Any, Optional, Union
|
|
8
8
|
|
|
9
9
|
from langchain_core.callbacks.manager import Callbacks
|
|
10
10
|
from langchain_core.language_models import BaseLanguageModel
|
|
@@ -50,7 +50,7 @@ _SUPPORTED_CRITERIA = {
|
|
|
50
50
|
|
|
51
51
|
|
|
52
52
|
def resolve_criteria(
|
|
53
|
-
criteria: Optional[Union[CRITERIA_TYPE, str,
|
|
53
|
+
criteria: Optional[Union[CRITERIA_TYPE, str, list[CRITERIA_TYPE]]],
|
|
54
54
|
) -> dict:
|
|
55
55
|
"""Resolve the criteria for the pairwise evaluator.
|
|
56
56
|
|
|
@@ -113,7 +113,7 @@ class ScoreStringResultOutputParser(BaseOutputParser[dict]):
|
|
|
113
113
|
"""
|
|
114
114
|
return "pairwise_string_result"
|
|
115
115
|
|
|
116
|
-
def parse(self, text: str) ->
|
|
116
|
+
def parse(self, text: str) -> dict[str, Any]:
|
|
117
117
|
"""Parse the output text.
|
|
118
118
|
|
|
119
119
|
Args:
|
|
@@ -144,7 +144,7 @@ class ScoreStringResultOutputParser(BaseOutputParser[dict]):
|
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
|
|
147
|
-
class ScoreStringEvalChain(StringEvaluator, LLMEvalChain, LLMChain):
|
|
147
|
+
class ScoreStringEvalChain(StringEvaluator, LLMEvalChain, LLMChain):
|
|
148
148
|
"""A chain for scoring on a scale of 1-10 the output of a model.
|
|
149
149
|
|
|
150
150
|
Attributes:
|
|
@@ -328,8 +328,8 @@ Performance may be significantly worse with other models."
|
|
|
328
328
|
input: Optional[str] = None,
|
|
329
329
|
reference: Optional[str] = None,
|
|
330
330
|
callbacks: Callbacks = None,
|
|
331
|
-
tags: Optional[
|
|
332
|
-
metadata: Optional[
|
|
331
|
+
tags: Optional[list[str]] = None,
|
|
332
|
+
metadata: Optional[dict[str, Any]] = None,
|
|
333
333
|
include_run_info: bool = False,
|
|
334
334
|
**kwargs: Any,
|
|
335
335
|
) -> dict:
|
|
@@ -365,8 +365,8 @@ Performance may be significantly worse with other models."
|
|
|
365
365
|
reference: Optional[str] = None,
|
|
366
366
|
input: Optional[str] = None,
|
|
367
367
|
callbacks: Callbacks = None,
|
|
368
|
-
tags: Optional[
|
|
369
|
-
metadata: Optional[
|
|
368
|
+
tags: Optional[list[str]] = None,
|
|
369
|
+
metadata: Optional[dict[str, Any]] = None,
|
|
370
370
|
include_run_info: bool = False,
|
|
371
371
|
**kwargs: Any,
|
|
372
372
|
) -> dict:
|
|
@@ -396,7 +396,7 @@ Performance may be significantly worse with other models."
|
|
|
396
396
|
return self._prepare_output(result)
|
|
397
397
|
|
|
398
398
|
|
|
399
|
-
class LabeledScoreStringEvalChain(ScoreStringEvalChain):
|
|
399
|
+
class LabeledScoreStringEvalChain(ScoreStringEvalChain):
|
|
400
400
|
"""A chain for scoring the output of a model on a scale of 1-10.
|
|
401
401
|
|
|
402
402
|
Attributes:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""String distance evaluators based on the RapidFuzz library."""
|
|
2
2
|
|
|
3
3
|
from enum import Enum
|
|
4
|
-
from typing import Any, Callable,
|
|
4
|
+
from typing import Any, Callable, Optional
|
|
5
5
|
|
|
6
6
|
from langchain_core.callbacks.manager import (
|
|
7
7
|
AsyncCallbackManagerForChainRun,
|
|
@@ -65,7 +65,7 @@ class _RapidFuzzChainMixin(Chain):
|
|
|
65
65
|
Applies only to the Levenshtein and Damerau-Levenshtein distances."""
|
|
66
66
|
|
|
67
67
|
@pre_init
|
|
68
|
-
def validate_dependencies(cls, values:
|
|
68
|
+
def validate_dependencies(cls, values: dict[str, Any]) -> dict[str, Any]:
|
|
69
69
|
"""
|
|
70
70
|
Validate that the rapidfuzz library is installed.
|
|
71
71
|
|
|
@@ -79,7 +79,7 @@ class _RapidFuzzChainMixin(Chain):
|
|
|
79
79
|
return values
|
|
80
80
|
|
|
81
81
|
@property
|
|
82
|
-
def output_keys(self) ->
|
|
82
|
+
def output_keys(self) -> list[str]:
|
|
83
83
|
"""
|
|
84
84
|
Get the output keys.
|
|
85
85
|
|
|
@@ -88,7 +88,7 @@ class _RapidFuzzChainMixin(Chain):
|
|
|
88
88
|
"""
|
|
89
89
|
return ["score"]
|
|
90
90
|
|
|
91
|
-
def _prepare_output(self, result:
|
|
91
|
+
def _prepare_output(self, result: dict[str, Any]) -> dict[str, Any]:
|
|
92
92
|
"""
|
|
93
93
|
Prepare the output dictionary.
|
|
94
94
|
|
|
@@ -119,7 +119,7 @@ class _RapidFuzzChainMixin(Chain):
|
|
|
119
119
|
"""
|
|
120
120
|
from rapidfuzz import distance as rf_distance
|
|
121
121
|
|
|
122
|
-
module_map:
|
|
122
|
+
module_map: dict[str, Any] = {
|
|
123
123
|
StringDistance.DAMERAU_LEVENSHTEIN: rf_distance.DamerauLevenshtein,
|
|
124
124
|
StringDistance.LEVENSHTEIN: rf_distance.Levenshtein,
|
|
125
125
|
StringDistance.JARO: rf_distance.Jaro,
|
|
@@ -202,7 +202,7 @@ class StringDistanceEvalChain(StringEvaluator, _RapidFuzzChainMixin):
|
|
|
202
202
|
return True
|
|
203
203
|
|
|
204
204
|
@property
|
|
205
|
-
def input_keys(self) ->
|
|
205
|
+
def input_keys(self) -> list[str]:
|
|
206
206
|
"""
|
|
207
207
|
Get the input keys.
|
|
208
208
|
|
|
@@ -223,9 +223,9 @@ class StringDistanceEvalChain(StringEvaluator, _RapidFuzzChainMixin):
|
|
|
223
223
|
|
|
224
224
|
def _call(
|
|
225
225
|
self,
|
|
226
|
-
inputs:
|
|
226
|
+
inputs: dict[str, Any],
|
|
227
227
|
run_manager: Optional[CallbackManagerForChainRun] = None,
|
|
228
|
-
) ->
|
|
228
|
+
) -> dict[str, Any]:
|
|
229
229
|
"""
|
|
230
230
|
Compute the string distance between the prediction and the reference.
|
|
231
231
|
|
|
@@ -241,9 +241,9 @@ class StringDistanceEvalChain(StringEvaluator, _RapidFuzzChainMixin):
|
|
|
241
241
|
|
|
242
242
|
async def _acall(
|
|
243
243
|
self,
|
|
244
|
-
inputs:
|
|
244
|
+
inputs: dict[str, Any],
|
|
245
245
|
run_manager: Optional[AsyncCallbackManagerForChainRun] = None,
|
|
246
|
-
) ->
|
|
246
|
+
) -> dict[str, Any]:
|
|
247
247
|
"""
|
|
248
248
|
Asynchronously compute the string distance between the prediction
|
|
249
249
|
and the reference.
|
|
@@ -265,8 +265,8 @@ class StringDistanceEvalChain(StringEvaluator, _RapidFuzzChainMixin):
|
|
|
265
265
|
reference: Optional[str] = None,
|
|
266
266
|
input: Optional[str] = None,
|
|
267
267
|
callbacks: Callbacks = None,
|
|
268
|
-
tags: Optional[
|
|
269
|
-
metadata: Optional[
|
|
268
|
+
tags: Optional[list[str]] = None,
|
|
269
|
+
metadata: Optional[dict[str, Any]] = None,
|
|
270
270
|
include_run_info: bool = False,
|
|
271
271
|
**kwargs: Any,
|
|
272
272
|
) -> dict:
|
|
@@ -300,8 +300,8 @@ class StringDistanceEvalChain(StringEvaluator, _RapidFuzzChainMixin):
|
|
|
300
300
|
reference: Optional[str] = None,
|
|
301
301
|
input: Optional[str] = None,
|
|
302
302
|
callbacks: Callbacks = None,
|
|
303
|
-
tags: Optional[
|
|
304
|
-
metadata: Optional[
|
|
303
|
+
tags: Optional[list[str]] = None,
|
|
304
|
+
metadata: Optional[dict[str, Any]] = None,
|
|
305
305
|
include_run_info: bool = False,
|
|
306
306
|
**kwargs: Any,
|
|
307
307
|
) -> dict:
|
|
@@ -333,7 +333,7 @@ class PairwiseStringDistanceEvalChain(PairwiseStringEvaluator, _RapidFuzzChainMi
|
|
|
333
333
|
"""Compute string edit distances between two predictions."""
|
|
334
334
|
|
|
335
335
|
@property
|
|
336
|
-
def input_keys(self) ->
|
|
336
|
+
def input_keys(self) -> list[str]:
|
|
337
337
|
"""
|
|
338
338
|
Get the input keys.
|
|
339
339
|
|
|
@@ -354,9 +354,9 @@ class PairwiseStringDistanceEvalChain(PairwiseStringEvaluator, _RapidFuzzChainMi
|
|
|
354
354
|
|
|
355
355
|
def _call(
|
|
356
356
|
self,
|
|
357
|
-
inputs:
|
|
357
|
+
inputs: dict[str, Any],
|
|
358
358
|
run_manager: Optional[CallbackManagerForChainRun] = None,
|
|
359
|
-
) ->
|
|
359
|
+
) -> dict[str, Any]:
|
|
360
360
|
"""
|
|
361
361
|
Compute the string distance between two predictions.
|
|
362
362
|
|
|
@@ -374,9 +374,9 @@ class PairwiseStringDistanceEvalChain(PairwiseStringEvaluator, _RapidFuzzChainMi
|
|
|
374
374
|
|
|
375
375
|
async def _acall(
|
|
376
376
|
self,
|
|
377
|
-
inputs:
|
|
377
|
+
inputs: dict[str, Any],
|
|
378
378
|
run_manager: Optional[AsyncCallbackManagerForChainRun] = None,
|
|
379
|
-
) ->
|
|
379
|
+
) -> dict[str, Any]:
|
|
380
380
|
"""
|
|
381
381
|
Asynchronously compute the string distance between two predictions.
|
|
382
382
|
|
|
@@ -398,8 +398,8 @@ class PairwiseStringDistanceEvalChain(PairwiseStringEvaluator, _RapidFuzzChainMi
|
|
|
398
398
|
prediction: str,
|
|
399
399
|
prediction_b: str,
|
|
400
400
|
callbacks: Callbacks = None,
|
|
401
|
-
tags: Optional[
|
|
402
|
-
metadata: Optional[
|
|
401
|
+
tags: Optional[list[str]] = None,
|
|
402
|
+
metadata: Optional[dict[str, Any]] = None,
|
|
403
403
|
include_run_info: bool = False,
|
|
404
404
|
**kwargs: Any,
|
|
405
405
|
) -> dict:
|
|
@@ -432,8 +432,8 @@ class PairwiseStringDistanceEvalChain(PairwiseStringEvaluator, _RapidFuzzChainMi
|
|
|
432
432
|
prediction: str,
|
|
433
433
|
prediction_b: str,
|
|
434
434
|
callbacks: Callbacks = None,
|
|
435
|
-
tags: Optional[
|
|
436
|
-
metadata: Optional[
|
|
435
|
+
tags: Optional[list[str]] = None,
|
|
436
|
+
metadata: Optional[dict[str, Any]] = None,
|
|
437
437
|
include_run_info: bool = False,
|
|
438
438
|
**kwargs: Any,
|
|
439
439
|
) -> dict:
|
langchain/hub.py
CHANGED
|
@@ -17,7 +17,8 @@ allow it to work with a variety of SQL as a backend.
|
|
|
17
17
|
import contextlib
|
|
18
18
|
import decimal
|
|
19
19
|
import uuid
|
|
20
|
-
from
|
|
20
|
+
from collections.abc import AsyncGenerator, Generator, Sequence
|
|
21
|
+
from typing import Any, Optional, Union
|
|
21
22
|
|
|
22
23
|
from langchain_core.indexing import RecordManager
|
|
23
24
|
from sqlalchemy import (
|
|
@@ -44,7 +45,7 @@ try:
|
|
|
44
45
|
from sqlalchemy.ext.asyncio import async_sessionmaker
|
|
45
46
|
except ImportError:
|
|
46
47
|
# dummy for sqlalchemy < 2
|
|
47
|
-
async_sessionmaker = type("async_sessionmaker", (type,), {}) # type: ignore
|
|
48
|
+
async_sessionmaker = type("async_sessionmaker", (type,), {}) # type: ignore[assignment,misc]
|
|
48
49
|
|
|
49
50
|
Base = declarative_base()
|
|
50
51
|
|
|
@@ -90,7 +91,7 @@ class SQLRecordManager(RecordManager):
|
|
|
90
91
|
*,
|
|
91
92
|
engine: Optional[Union[Engine, AsyncEngine]] = None,
|
|
92
93
|
db_url: Union[None, str, URL] = None,
|
|
93
|
-
engine_kwargs: Optional[
|
|
94
|
+
engine_kwargs: Optional[dict[str, Any]] = None,
|
|
94
95
|
async_mode: bool = False,
|
|
95
96
|
) -> None:
|
|
96
97
|
"""Initialize the SQLRecordManager.
|
|
@@ -403,7 +404,7 @@ class SQLRecordManager(RecordManager):
|
|
|
403
404
|
await session.execute(stmt)
|
|
404
405
|
await session.commit()
|
|
405
406
|
|
|
406
|
-
def exists(self, keys: Sequence[str]) ->
|
|
407
|
+
def exists(self, keys: Sequence[str]) -> list[bool]:
|
|
407
408
|
"""Check if the given keys exist in the SQLite database."""
|
|
408
409
|
session: Session
|
|
409
410
|
with self._make_session() as session:
|
|
@@ -417,7 +418,7 @@ class SQLRecordManager(RecordManager):
|
|
|
417
418
|
found_keys = set(r.key for r in records)
|
|
418
419
|
return [k in found_keys for k in keys]
|
|
419
420
|
|
|
420
|
-
async def aexists(self, keys: Sequence[str]) ->
|
|
421
|
+
async def aexists(self, keys: Sequence[str]) -> list[bool]:
|
|
421
422
|
"""Check if the given keys exist in the SQLite database."""
|
|
422
423
|
async with self._amake_session() as session:
|
|
423
424
|
records = (
|
|
@@ -444,7 +445,7 @@ class SQLRecordManager(RecordManager):
|
|
|
444
445
|
after: Optional[float] = None,
|
|
445
446
|
group_ids: Optional[Sequence[str]] = None,
|
|
446
447
|
limit: Optional[int] = None,
|
|
447
|
-
) ->
|
|
448
|
+
) -> list[str]:
|
|
448
449
|
"""List records in the SQLite database based on the provided date range."""
|
|
449
450
|
session: Session
|
|
450
451
|
with self._make_session() as session:
|
|
@@ -471,7 +472,7 @@ class SQLRecordManager(RecordManager):
|
|
|
471
472
|
after: Optional[float] = None,
|
|
472
473
|
group_ids: Optional[Sequence[str]] = None,
|
|
473
474
|
limit: Optional[int] = None,
|
|
474
|
-
) ->
|
|
475
|
+
) -> list[str]:
|
|
475
476
|
"""List records in the SQLite database based on the provided date range."""
|
|
476
477
|
session: AsyncSession
|
|
477
478
|
async with self._amake_session() as session:
|