diff --git a/libs/core/langchain_core/language_models/base.py b/libs/core/langchain_core/language_models/base.py index 570076290e09f..bbfbda56afaba 100644 --- a/libs/core/langchain_core/language_models/base.py +++ b/libs/core/langchain_core/language_models/base.py @@ -2,6 +2,7 @@ from __future__ import annotations +import importlib.util import warnings from abc import ABC, abstractmethod from collections.abc import Callable, Mapping, Sequence @@ -38,12 +39,7 @@ if TYPE_CHECKING: from langchain_core.outputs import LLMResult -try: - from transformers import GPT2TokenizerFast # type: ignore[import-not-found] - - _HAS_TRANSFORMERS = True -except ImportError: - _HAS_TRANSFORMERS = False +_HAS_TRANSFORMERS = importlib.util.find_spec("transformers") is not None class LangSmithParams(TypedDict, total=False): @@ -93,6 +89,11 @@ def get_tokenizer() -> Any: "Please install it with `pip install transformers`." ) raise ImportError(msg) + + from transformers import ( # type: ignore[import-not-found] # noqa: PLC0415 + GPT2TokenizerFast, + ) + # create a GPT-2 tokenizer instance return GPT2TokenizerFast.from_pretrained("gpt2") diff --git a/libs/core/langchain_core/vectorstores/in_memory.py b/libs/core/langchain_core/vectorstores/in_memory.py index ef3c78ab603f6..4d9eff6893d12 100644 --- a/libs/core/langchain_core/vectorstores/in_memory.py +++ b/libs/core/langchain_core/vectorstores/in_memory.py @@ -2,6 +2,7 @@ from __future__ import annotations +import importlib.util import json import uuid from pathlib import Path @@ -23,12 +24,7 @@ from langchain_core.embeddings import Embeddings -try: - import numpy as np - - _HAS_NUMPY = True -except ImportError: - _HAS_NUMPY = False +_HAS_NUMPY = importlib.util.find_spec("numpy") is not None class InMemoryVectorStore(VectorStore): @@ -439,6 +435,8 @@ def max_marginal_relevance_search_by_vector( ) raise ImportError(msg) + import numpy as np # noqa: PLC0415 + mmr_chosen_indices = maximal_marginal_relevance( np.array(embedding, dtype=np.float32), [vector for _, _, vector in prefetch_hits], diff --git a/libs/core/langchain_core/vectorstores/utils.py b/libs/core/langchain_core/vectorstores/utils.py index 551524beb3bfb..82c3a34f22a7e 100644 --- a/libs/core/langchain_core/vectorstores/utils.py +++ b/libs/core/langchain_core/vectorstores/utils.py @@ -8,27 +8,21 @@ from __future__ import annotations +import importlib.util import logging import warnings from typing import TYPE_CHECKING, cast -try: - import numpy as np - - _HAS_NUMPY = True -except ImportError: - _HAS_NUMPY = False - -try: - import simsimd as simd # type: ignore[import-not-found] +_HAS_NUMPY = importlib.util.find_spec("numpy") is not None +_HAS_SIMSIMD = importlib.util.find_spec("simsimd") is not None - _HAS_SIMSIMD = True -except ImportError: - _HAS_SIMSIMD = False if TYPE_CHECKING: + import numpy as np + Matrix = list[list[float]] | list[np.ndarray] | np.ndarray + logger = logging.getLogger(__name__) @@ -54,6 +48,8 @@ def _cosine_similarity(x: Matrix, y: Matrix) -> np.ndarray: ) raise ImportError(msg) + import numpy as np # noqa: PLC0415 + if len(x) == 0 or len(y) == 0: return np.array([[]]) @@ -98,6 +94,8 @@ def _cosine_similarity(x: Matrix, y: Matrix) -> np.ndarray: similarity[np.isnan(similarity) | np.isinf(similarity)] = 0.0 return cast("np.ndarray", similarity) + import simsimd as simd # type: ignore[import-not-found] # noqa: PLC0415 + x = np.array(x, dtype=np.float32) y = np.array(y, dtype=np.float32) return 1 - np.array(simd.cdist(x, y, metric="cosine")) @@ -130,6 +128,8 @@ def maximal_marginal_relevance( ) raise ImportError(msg) + import numpy as np # noqa: PLC0415 + if min(k, len(embedding_list)) <= 0: return [] if query_embedding.ndim == 1: