langchain 当调用_results_to_documents()时,AzureSearch.avector_search_with_score()触发"TypeError: 'AsyncSearchItemPaged'对象不可迭代"错误,

8ljdwjyq  于 5个月前  发布在  其他
关注(0)|答案(4)|浏览(47)

检查其他资源

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

示例代码

embeddings = AzureOpenAIEmbeddings(
	azure_endpoint=azure_endpoint,
	openai_api_version=openai_api_version,
	openai_api_key=openai_api_key,
	openai_api_type=openai_api_type,
	deployment=deployment,
	chunk_size=1)

vectorstore = AzureSearch(
	azure_search_endpoint=azure_search_endpoint,
	azure_search_key=azure_search_key,
	index_name=index_name,
	embedding_function=embeddings.embed_query,
)

system_message_prompt = SystemMessagePromptTemplate.from_template(
	system_prompt)
human_message_prompt = HumanMessagePromptTemplate.from_template(
	human_template)
chat_prompt = ChatPromptTemplate.from_messages(
	[system_message_prompt, human_message_prompt])

doc_chain = load_qa_chain(
	conversation_llm, chain_type="stuff", prompt=chat_prompt, callback_manager=default_manager
)

conversation_chain = ConversationalRetrievalChain(
	retriever=vectorstore.as_retriever(search_type="similarity_score_threshold", k=rag_top_k,
									   search_kwargs={"score_threshold": rag_score_threshold}),
	combine_docs_chain=doc_chain,
	question_generator=question_generator,
	return_source_documents=True,
	callback_manager=default_manager,
	rephrase_question=False,
	memory=memory,
	max_tokens_limit=max_retrieval_tokens,
)

result = await conversation_chain.ainvoke({"question": question, "chat_history": chat_history}

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

TypeError("'AsyncSearchItemPaged'对象不可迭代")Traceback (most recent call last):
File "/Users/crobert/Code/Higher Bar AI/almitra-pilot-be/venv/lib/python3.10/site-packages/langchain/chains/base.py", line 208, in ainvoke
await self._acall(inputs, run_manager=run_manager)
File "/Users/crobert/Code/Higher Bar AI/almitra-pilot-be/venv/lib/python3.10/site-packages/langchain/chains/conversational_retrieval/base.py", line 212, in _acall
docs = await self._aget_docs(new_question, inputs, run_manager=_run_manager)
File "/Users/crobert/Code/Higher Bar AI/almitra-pilot-be/venv/lib/python3.10/site-packages/langchain/chains/conversational_retrieval/base.py", line 410, in _aget_docs
docs = await self.retriever.ainvoke(
File "/Users/crobert/Code/Higher Bar AI/almitra-pilot-be/venv/lib/python3.10/site-packages/langchain_core/retrievers.py", line 280, in ainvoke
raise e
File "/Users/crobert/Code/Higher Bar AI/almitra-pilot-be/venv/lib/python3.10/site-packages/langchain_core/retrievers.py", line 273, in ainvoke
result = await self._aget_relevant_documents(
File "/Users/crobert/Code/Higher Bar AI/almitra-pilot-be/venv/lib/python3.10/site-packages/langchain_community/vectorstores/azuresearch.py", line 1590, in _aget_relevant_documents
await self.vectorstore.asimilarity_search_with_relevance_scores(
File "/Users/crobert/Code/Higher Bar AI/almitra-pilot-be/venv/lib/python3.10/site-packages/langchain_community/vectorstores/azuresearch.py", line 663, in asimilarity_search_with_relevance_scores
result = await self.avector_search_with_score(query, k=k, **kwargs)
File "/Users/crobert/Code/Higher Bar AI/almitra-pilot-be/venv/lib/python3.10/site-packages

kadbb459

kadbb4591#

实际上,我的修复(以及,我推测,原始的异步代码)仍然有一个相当致命的缺陷:因为所有的 with 块关闭了客户端,你只能在链中进行一次调用,然后触发这个错误:
ValueError("HTTP传输已经被关闭。您可以检查是否在客户端创建之外调用了一个函数,或者是否已经在客户端上调用了 await close() 。")
而不是每次调用都重新建立连接,我尝试保持连接打开,并在删除 AzureSearch 对象时关闭它。但是所有这些都让我感到不舒服,我想知道 PR #22075 中的 @baskaryan 关于异步 Azure 搜索客户端管理的想法。一切都仍然感觉相当混乱和不完整...

yyyllmsg

yyyllmsg2#

我遇到了同样的问题,哈哈。

async def asemantic_hybrid_search_with_score_and_rerank(
    self, query: str, k: int = 4, *, filters: Optional[str] = None, **kwargs: Any
) -> List[Tuple[Document, float, float]]:
    """返回与查询最相似的文档,使用混合查询。
    

Args:
query: Text to look up documents similar to.
k: Number of Documents to return. Defaults to 4.
filters: Filtering expression.

Returns:
    List of Documents most similar to the query and score for each
"""
from azure.search.documents.models import VectorizedQuery

vector = await self._aembed_query(query)
async with self.async_client as async_client:
    results = await async_client.search(
        search_text=query,
        vector_queries=[
            VectorizedQuery(
                vector=np.array(vector, dtype=np.float32).tolist(),
                k_nearest_neighbors=k,
                fields=FIELDS_CONTENT_VECTOR,
            )
        ],
        filter=filters,
        query_type="semantic",
        semantic_configuration_name=self.semantic_configuration_name,
        query_caption="extractive",
        query_answer="extractive",
        top=k,
        **kwargs,
    )`
v2g6jxz6

v2g6jxz63#

我也遇到了同样的问题,在尝试调用AzureSearchVectorStoreRetriever上的invoke方法时,它也使用了上述描述的方法。同步调用工作正常,但异步调用在检索阶段导致错误:“'AsyncSearchItemPaged'对象不可迭代”。

j9per5c4

j9per5c44#

JuliaZamaitat,你可以重写这个类来移除with块并根据需要进行其他调整。thedavgar已经在#24921中做出了这些改变,所以你可以将其作为指导,直到它被批准并包含在发布中。希望很快异步支持就能正常工作!

相关问题