在langchain_community.vectorstores.qdrant中存在BUG,

yvfmudvl  于 6个月前  发布在  其他
关注(0)|答案(1)|浏览(43)

检查其他资源

  • 为这个问题添加了一个非常描述性的标题。
  • 使用集成搜索在LangChain文档中进行了搜索。
  • 使用GitHub搜索找到了一个类似的问题,但没有找到。
  • 我确信这是LangChain中的一个bug,而不是我的代码。
  • 通过更新到LangChain的最新稳定版本(或特定集成包)无法解决此bug。

示例代码

问题描述

在使用Langchain Qdrant集成中的Qdrant.from_existing_collection方法时遇到了问题。以下是我使用的代码:

from langchain_community.vectorstores.qdrant import Qdrant

url = "http://localhost:6333"
collection_name = "unique_case_2020"

qdrant = Qdrant.from_existing_collection(
    embedding=embeddings,  # Please set according to actual situation
    collection_name=collection_name,
    url=url
)

当我运行这段代码时,我得到了以下错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[21], line 7
      3 url = "http://localhost:6333"
      4 collection_name = "unique_case_2020"
----> 7 qdrant = Qdrant.from_existing_collection(
      8     embedding=embeddings,  # Please set according to actual situation
      9     collection_name=collection_name,
     10     url=url
     11 )

TypeError: Qdrant.from_existing_collection() missing 1 required positional argument: 'path'

为了解决这个问题,我添加了path参数,但遇到了另一个错误:

qdrant = Qdrant.from_existing_collection(
    embedding=embeddings,  # Please set according to actual situation
    collection_name=collection_name,
    url=url,
    path=""
)

这引发了以下错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[23], line 7
      3 url = "http://localhost:6333"
      4 collection_name = "unique_case_2020"
----> 7 qdrant = Qdrant.from_existing_collection(
      8     embedding=embeddings,  # Please set according to actual situation
      9     collection_name=collection_name,
     10     url=url,
     11     path=""
     12 )

File ~/.local/lib/python3.10/site-packages/langchain_community/vectorstores/qdrant.py:1397, in Qdrant.from_existing_collection(cls, embedding, path, collection_name, location, url, port, grpc_port, prefer_grpc, https, api_key, prefix, timeout, host, **kwargs)
   1374 @classmethod
   1375 def from_existing_collection(
   1376     cls: Type[Qdrant],
   (...)
   1390     **kwargs: Any,
   1391 ) -> Qdrant:
   1392     """
   1393     Get instance of an existing Qdrant collection.
   1394     This method will return the instance of the store without inserting any new
   1395     embeddings
   1396     """
-> 1397     client, async_client = cls._generate_clients(
   1398         location=location,
   1399         url=url,
   1400         port=port,
   1401         grpc_port=grpc_port,
   1402         prefer_grpc=prefer_grpc,
   1403         https=https,
   1404         api_key=api_key,
   1405         prefix=prefix,
   1406         timeout=timeout,
   1407         host=host,
   1408         path=path,
   1409         **kwargs,
   1410     )
   1411     return cls(
   1412         client=client,
   1413         async_client=async_client,
   (...)
   1416         **kwargs,
   1417     )

File ~/.local/lib/python3.10/site-packages/langchain_community/vectorstores/qdrant.py:2250, in Qdrant._generate_clients(location, url, port, grpc_port, prefer_grpc, https, api_key, prefix, timeout, host, path, **kwargs)
   2233 @staticmethod
   2234 def _generate_clients(
   2235     location: Optional[str] = None,
   (...)
   2246     **kwargs: Any,
   2247 ) -> Tuple[Any, Any]:
   2248     from qdrant_client import AsyncQdrantClient, QdrantClient
-> 2250     sync_client = QdrantClient(
   2251         location=location,
   2252         url=url,
   2253         port=port,
   2254         grpc_port=grpc_port,
   2255         prefer_grpc=prefer_grpc,
   2256         https=https,
   2257         api_key=api_key,
   2258         prefix=prefix,
   2259         timeout=timeout,
   2260         host=host,
   2261         path=path,
   2262         **kwargs,
   2263     )
   2265     if location == ":memory:" or path is not None:
   2266         # Local Qdrant cannot co-exist with Sync and Async clients
   2267         # We fallback to sync operations in this case
   2268         async_client = None

File ~/.local/lib/python3.10/site-packages/qdrant_client/qdrant_client.py:107, in QdrantClient.__init__(self, location, url, port, grpc_port, prefer_grpc, https, api_key, prefix, timeout, host, path, force_disable_check_same_thread, grpc_options, auth_token_provider, **kwargs)
    104 self._client: QdrantBase
    106 if sum([param is not None for param in (location, url, host, path)]) > 1:
--> 107     raise ValueError(
    108         "Only one of <location>, <url>, <host> or <path> should be specified."
    109     )
    111 if location == ":memory:":
    112     self._client = QdrantLocal(
    113         location=location,
    114         force_disable_check_same_thread=force_disable_check_same_thread,
    115     )

ValueError: Only one of <location>, <url>, <host> or <path> should be specified.

错误信息和堆栈跟踪(如果适用)

  • 无响应*

描述

预期行为

from_existing_collection方法应该允许path参数是可选的,因为指定urlpath会导致冲突,而当提供url时,path不应该被强制执行。

实际行为

  • 当未提供path时,会引发一个TypeError,指示path是一个必需的位置参数。
  • 当提供path时,会引发一个ValueError,指示只应指定其中一个<location><url><host><path>

建议修复

  • 更新from_existing_collection方法,使path参数变为可选。
  • 调整内部逻辑以处理在提供url的情况下不要求提供x20n20的情况。

重现步骤

  1. 使用提供的代码从现有集合示例化一个 x22n22 对象。
  2. 在未提供 x23n23 时观察 x24n24。
  3. 在提供 x25n25 和 x26n26 时观察 x27n27。
    感谢您查看此问题。

系统信息

环境

  • Python版本:3.10
  • 名称:langchain-community

版本:0.2.2
摘要:社区贡献的LangChain集成。
主页: x29f0xf
作者:
作者-邮箱:
许可证:MIT
位置:/home/lighthouse/.local/lib/python3.10/site-packages
需要:aiohttp, dataclasses-json, langchain, langchain-core, langsmith, numpy, PyYAML, requests, SQLAlchemy, tenacity
由:langchain-experimental所需的

aelbi1ox

aelbi1ox1#

你好@deepslit。
请使用包含此修复的新版langchain-qdrant。社区版本已不再维护。

pip install langchain-qdrant
from langchain_qdrant import Qdrant

相关问题