Open
Description
Bug Description
Initially I was following these tutorials:
- Neo4J Graph Store
- Using Qdrant Vector Store
- Llama Index PG Index
- Defining a Custom Property Graph Retriever
Which was working on Neo4J local free version (running on docker), but when I switched to Neo4J Aura DB (which is the cloud version), I started to get some error.
Version
llama-index 0.11.23
llama-index-agent-openai 0.3.4
llama-index-cli 0.3.1
llama-index-core 0.12.1
llama-index-embeddings-fastembed 0.2.0
llama-index-embeddings-openai 0.2.5
llama-index-graph-stores-neo4j 0.4.0
llama-index-indices-managed-llama-cloud 0.4.0
llama-index-legacy 0.9.48.post4
llama-index-llms-openai 0.2.16
llama-index-multi-modal-llms-openai 0.2.3
llama-index-program-openai 0.2.0
llama-index-question-gen-openai 0.2.0
llama-index-readers-file 0.3.0
llama-index-readers-llama-parse 0.3.0
llama-index-vector-stores-qdrant 0.3.3
Steps to Reproduce
import nest_asyncio
from dotenv import load_dotenv
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core import SimpleDirectoryReader
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
from kg_extractor import BetterKGExtractor
nest_asyncio.apply()
load_dotenv()
embedding_model_name="text-embedding-3-small"
llm = OpenAI(model="gpt-4o-mini")
embedding_model = OpenAIEmbedding(model=embedding_model_name)
documents = SimpleDirectoryReader(input_dir="./documents").load_data()
splitter = SentenceSplitter(
chunk_size=512,
chunk_overlap=0
)
nodes = splitter.get_nodes_from_documents(documents=documents)
nodes = nodes[:30]
from llama_index.graph_stores.neo4j import Neo4jPropertyGraphStore
username="neo4j"
password="xxxx"
url="neo4j+s://xxxxx.neo4j.io"
database="neo4j"
store = Neo4jPropertyGraphStore(
username=username,
password=password,
url=url,
database=database
)
from llama_index.core import PropertyGraphIndex
index = PropertyGraphIndex(
nodes=nodes,
kg_extractors=[BetterKGExtractor(llm=llm, embedding_model_name=embedding_model_name)],
show_progress=True,
embed_kg_nodes=True,
property_graph_store=store
)
Till here everything was working fine, I could even see the visualization inside my cloud database. Now problem starts when doing retrieval
from llama_index.core.retrievers import VectorContextRetriever
retriever = VectorContextRetriever(
graph_store=store,
include_properties=True,
embed_model=embedding_model,
similarity_top_k=4
)
retriever.retrieve("What is the formula of liquid neural networks")
Above lines of code gave error, so tried different method
query = "What is the formula of liquid neural networks"
index.as_retriever(similarity_top_k=4).retrieve(query)
This also gave me the same error.
Relevant Logs/Tracbacks
index.as_retriever(similarity_top_k=4).retrieve(query)
I got this error:
```bash
╭─────────────────────────────────────── Traceback (most recent call last) ───────────────────────────────────────╮
│ in <module>:2 │
│ │
│ 1 query = "What is the formula of liquid neural networks" │
│ ❱ 2 index.as_retriever(similarity_top_k=4).retrieve(query) │
│ 3 │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/instrumentation/dispatcher.py: │
│ 311 in wrapper │
│ │
│ 308 │ │ │ │ │ │ _logger.debug(f"Failed to reset active_span_id: {e}") │
│ 309 │ │ │ │
│ 310 │ │ │ try: │
│ ❱ 311 │ │ │ │ result = func(*args, **kwargs) │
│ 312 │ │ │ │ if isinstance(result, asyncio.Future): │
│ 313 │ │ │ │ │ # If the result is a Future, wrap it │
│ 314 │ │ │ │ │ new_future = asyncio.ensure_future(result) │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/base/base_retriever.py:245 in │
│ retrieve │
│ │
│ 242 │ │ │ │ CBEventType.RETRIEVE, │
│ 243 │ │ │ │ payload={EventPayload.QUERY_STR: query_bundle.query_str}, │
│ 244 │ │ │ ) as retrieve_event: │
│ ❱ 245 │ │ │ │ nodes = self._retrieve(query_bundle) │
│ 246 │ │ │ │ nodes = self._handle_recursive_retrieval(query_bundle, nodes) │
│ 247 │ │ │ │ retrieve_event.on_end( │
│ 248 │ │ │ │ │ payload={EventPayload.NODES: nodes}, │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/instrumentation/dispatcher.py: │
│ 311 in wrapper │
│ │
│ 308 │ │ │ │ │ │ _logger.debug(f"Failed to reset active_span_id: {e}") │
│ 309 │ │ │ │
│ 310 │ │ │ try: │
│ ❱ 311 │ │ │ │ result = func(*args, **kwargs) │
│ 312 │ │ │ │ if isinstance(result, asyncio.Future): │
│ 313 │ │ │ │ │ # If the result is a Future, wrap it │
│ 314 │ │ │ │ │ new_future = asyncio.ensure_future(result) │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/indices/property_graph/retriev │
│ er.py:52 in _retrieve │
│ │
│ 49 │ def _retrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]: │
│ 50 │ │ results = [] │
│ 51 │ │ if self.use_async: │
│ ❱ 52 │ │ │ return asyncio_run(self._aretrieve(query_bundle)) │
│ 53 │ │ │
│ 54 │ │ for sub_retriever in tqdm(self.sub_retrievers, disable=not self.show_progress): │
│ 55 │ │ │ results.extend(sub_retriever.retrieve(query_bundle)) │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/async_utils.py:33 in │
│ asyncio_run │
│ │
│ 30 │ │ loop = asyncio.get_event_loop() │
│ 31 │ │ │
│ 32 │ │ # If we're here, there's an existing loop but it's not running │
│ ❱ 33 │ │ return loop.run_until_complete(coro) │
│ 34 │ │
│ 35 │ except RuntimeError as e: │
│ 36 │ │ # If we can't get the event loop, we're likely in a different thread, or its alr │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/nest_asyncio.py:98 in run_until_complete │
│ │
│ 95 │ │ │ if not f.done(): │
│ 96 │ │ │ │ raise RuntimeError( │
│ 97 │ │ │ │ │ 'Event loop stopped before Future completed.') │
│ ❱ 98 │ │ │ return f.result() │
│ 99 │ │
│ 100 │ def _run_once(self): │
│ 101 │ │ """ │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/asyncio/futures.py:201 in result │
│ │
│ 198 │ │ │ raise exceptions.InvalidStateError('Result is not ready.') │
│ 199 │ │ self.__log_traceback = False │
│ 200 │ │ if self._exception is not None: │
│ ❱ 201 │ │ │ raise self._exception.with_traceback(self._exception_tb) │
│ 202 │ │ return self._result │
│ 203 │ │
│ 204 │ def exception(self): │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/asyncio/tasks.py:234 in __step │
│ │
│ 231 │ │ │ │ # don't have `__iter__` and `__next__` methods. │
│ 232 │ │ │ │ result = coro.send(None) │
│ 233 │ │ │ else: │
│ ❱ 234 │ │ │ │ result = coro.throw(exc) │
│ 235 │ │ except StopIteration as exc: │
│ 236 │ │ │ if self._must_cancel: │
│ 237 │ │ │ │ # Task is cancelled right before coro stops. │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/indices/property_graph/retriev │
│ er.py:64 in _aretrieve │
│ │
│ 61 │ │ for sub_retriever in self.sub_retrievers: │
│ 62 │ │ │ tasks.append(sub_retriever.aretrieve(query_bundle)) │
│ 63 │ │ │
│ ❱ 64 │ │ async_results = await run_jobs( │
│ 65 │ │ │ tasks, workers=self.num_workers, show_progress=self.show_progress │
│ 66 │ │ ) │
│ 67 │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/instrumentation/dispatcher.py: │
│ 357 in async_wrapper │
│ │
│ 354 │ │ │ │ tags=tags, │
│ 355 │ │ │ ) │
│ 356 │ │ │ try: │
│ ❱ 357 │ │ │ │ result = await func(*args, **kwargs) │
│ 358 │ │ │ except BaseException as e: │
│ 359 │ │ │ │ self.event(SpanDropEvent(span_id=id_, err_str=str(e))) │
│ 360 │ │ │ │ self.span_drop(id_=id_, bound_args=bound_args, instance=instance, err=e) │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/async_utils.py:148 in run_jobs │
│ │
│ 145 │ │ │
│ 146 │ │ results = await tqdm_asyncio.gather(*pool_jobs, desc=desc) │
│ 147 │ else: │
│ ❱ 148 │ │ results = await asyncio.gather(*pool_jobs) │
│ 149 │ │
│ 150 │ return results │
│ 151 │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/asyncio/tasks.py:304 in __wakeup │
│ │
│ 301 │ │
│ 302 │ def __wakeup(self, future): │
│ 303 │ │ try: │
│ ❱ 304 │ │ │ future.result() │
│ 305 │ │ except BaseException as exc: │
│ 306 │ │ │ # This may also be a cancellation. │
│ 307 │ │ │ self.__step(exc) │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/asyncio/tasks.py:232 in __step │
│ │
│ 229 │ │ │ if exc is None: │
│ 230 │ │ │ │ # We use the `send` method directly, because coroutines │
│ 231 │ │ │ │ # don't have `__iter__` and `__next__` methods. │
│ ❱ 232 │ │ │ │ result = coro.send(None) │
│ 233 │ │ │ else: │
│ 234 │ │ │ │ result = coro.throw(exc) │
│ 235 │ │ except StopIteration as exc: │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/instrumentation/dispatcher.py: │
│ 357 in async_wrapper │
│ │
│ 354 │ │ │ │ tags=tags, │
│ 355 │ │ │ ) │
│ 356 │ │ │ try: │
│ ❱ 357 │ │ │ │ result = await func(*args, **kwargs) │
│ 358 │ │ │ except BaseException as e: │
│ 359 │ │ │ │ self.event(SpanDropEvent(span_id=id_, err_str=str(e))) │
│ 360 │ │ │ │ self.span_drop(id_=id_, bound_args=bound_args, instance=instance, err=e) │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/async_utils.py:139 in worker │
│ │
│ 136 │ @dispatcher.span │
│ 137 │ async def worker(job: Coroutine) -> Any: │
│ 138 │ │ async with semaphore: │
│ ❱ 139 │ │ │ return await job │
│ 140 │ │
│ 141 │ pool_jobs = [worker(job) for job in jobs] │
│ 142 │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/instrumentation/dispatcher.py: │
│ 357 in async_wrapper │
│ │
│ 354 │ │ │ │ tags=tags, │
│ 355 │ │ │ ) │
│ 356 │ │ │ try: │
│ ❱ 357 │ │ │ │ result = await func(*args, **kwargs) │
│ 358 │ │ │ except BaseException as e: │
│ 359 │ │ │ │ self.event(SpanDropEvent(span_id=id_, err_str=str(e))) │
│ 360 │ │ │ │ self.span_drop(id_=id_, bound_args=bound_args, instance=instance, err=e) │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/base/base_retriever.py:276 in │
│ aretrieve │
│ │
│ 273 │ │ │ │ CBEventType.RETRIEVE, │
│ 274 │ │ │ │ payload={EventPayload.QUERY_STR: query_bundle.query_str}, │
│ 275 │ │ │ ) as retrieve_event: │
│ ❱ 276 │ │ │ │ nodes = await self._aretrieve(query_bundle=query_bundle) │
│ 277 │ │ │ │ nodes = await self._ahandle_recursive_retrieval( │
│ 278 │ │ │ │ │ query_bundle=query_bundle, nodes=nodes │
│ 279 │ │ │ │ ) │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/indices/property_graph/sub_ret │
│ rievers/base.py:150 in _aretrieve │
│ │
│ 147 │ async def _aretrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]: │
│ 148 │ │ nodes = await self.aretrieve_from_graph(query_bundle) │
│ 149 │ │ if self.include_text and nodes: │
│ ❱ 150 │ │ │ nodes = await self.async_add_source_text(nodes) │
│ 151 │ │ return nodes │
│ 152 │ │
│ 153 │ @abstractmethod │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/indices/property_graph/sub_ret │
│ rievers/base.py:139 in async_add_source_text │
│ │
│ 136 │ │ ) │
│ 137 │ │ og_node_map = {node.node_id: node for node in og_nodes} │
│ 138 │ │ │
│ ❱ 139 │ │ return self._add_source_text(nodes, og_node_map) │
│ 140 │ │
│ 141 │ def _retrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]: │
│ 142 │ │ nodes = self.retrieve_from_graph(query_bundle) │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/indices/property_graph/sub_ret │
│ rievers/base.py:108 in _add_source_text │
│ │
│ 105 │ │ │ │ │ new_content = ( │
│ 106 │ │ │ │ │ │ preamble_text + graph_content_str + "\n\n" + cur_content │
│ 107 │ │ │ │ │ ) │
│ ❱ 108 │ │ │ │ │ mapped_node = TextNode(**mapped_node.dict()) │
│ 109 │ │ │ │ │ mapped_node.text = new_content │
│ 110 │ │ │ │ result_nodes.append( │
│ 111 │ │ │ │ │ NodeWithScore( │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/schema.py:108 in dict │
│ │
│ 105 │ │ return data │
│ 106 │ │
│ 107 │ def dict(self, **kwargs: Any) -> Dict[str, Any]: │
│ ❱ 108 │ │ return self.model_dump(**kwargs) │
│ 109 │ │
│ 110 │ def __getstate__(self) -> Dict[str, Any]: │
│ 111 │ │ state = super().__getstate__() │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/pydantic/main.py:364 in model_dump │
│ │
│ 361 │ │ Returns: │
│ 362 │ │ │ A dictionary representation of the model. │
│ 363 │ │ """ │
│ ❱ 364 │ │ return self.__pydantic_serializer__.to_python( │
│ 365 │ │ │ self, │
│ 366 │ │ │ mode=mode, │
│ 367 │ │ │ by_alias=by_alias, │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
PydanticSerializationError: Error calling function `<lambda>`: AttributeError: 'str' object has no attribute
'value'
And for this:
retriever.retrieve("What is the formula of liquid neural networks")
I got this error:
─────────────────────────────────────── Traceback (most recent call last) ───────────────────────────────────────╮
│ in <module>:1 │
│ │
│ ❱ 1 retriever.retrieve("What is the formula of liquid neural networks") │
│ 2 │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/instrumentation/dispatcher.py: │
│ 311 in wrapper │
│ │
│ 308 │ │ │ │ │ │ _logger.debug(f"Failed to reset active_span_id: {e}") │
│ 309 │ │ │ │
│ 310 │ │ │ try: │
│ ❱ 311 │ │ │ │ result = func(*args, **kwargs) │
│ 312 │ │ │ │ if isinstance(result, asyncio.Future): │
│ 313 │ │ │ │ │ # If the result is a Future, wrap it │
│ 314 │ │ │ │ │ new_future = asyncio.ensure_future(result) │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/base/base_retriever.py:245 in │
│ retrieve │
│ │
│ 242 │ │ │ │ CBEventType.RETRIEVE, │
│ 243 │ │ │ │ payload={EventPayload.QUERY_STR: query_bundle.query_str}, │
│ 244 │ │ │ ) as retrieve_event: │
│ ❱ 245 │ │ │ │ nodes = self._retrieve(query_bundle) │
│ 246 │ │ │ │ nodes = self._handle_recursive_retrieval(query_bundle, nodes) │
│ 247 │ │ │ │ retrieve_event.on_end( │
│ 248 │ │ │ │ │ payload={EventPayload.NODES: nodes}, │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/instrumentation/dispatcher.py: │
│ 311 in wrapper │
│ │
│ 308 │ │ │ │ │ │ _logger.debug(f"Failed to reset active_span_id: {e}") │
│ 309 │ │ │ │
│ 310 │ │ │ try: │
│ ❱ 311 │ │ │ │ result = func(*args, **kwargs) │
│ 312 │ │ │ │ if isinstance(result, asyncio.Future): │
│ 313 │ │ │ │ │ # If the result is a Future, wrap it │
│ 314 │ │ │ │ │ new_future = asyncio.ensure_future(result) │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/indices/property_graph/sub_ret │
│ rievers/base.py:144 in _retrieve │
│ │
│ 141 │ def _retrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]: │
│ 142 │ │ nodes = self.retrieve_from_graph(query_bundle) │
│ 143 │ │ if self.include_text and nodes: │
│ ❱ 144 │ │ │ nodes = self.add_source_text(nodes) │
│ 145 │ │ return nodes │
│ 146 │ │
│ 147 │ async def _aretrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]: │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/indices/property_graph/sub_ret │
│ rievers/base.py:128 in add_source_text │
│ │
│ 125 │ │ ) │
│ 126 │ │ node_map = {node.node_id: node for node in og_nodes} │
│ 127 │ │ │
│ ❱ 128 │ │ return self._add_source_text(nodes, node_map) │
│ 129 │ │
│ 130 │ async def async_add_source_text( │
│ 131 │ │ self, nodes: List[NodeWithScore] │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/indices/property_graph/sub_ret │
│ rievers/base.py:108 in _add_source_text │
│ │
│ 105 │ │ │ │ │ new_content = ( │
│ 106 │ │ │ │ │ │ preamble_text + graph_content_str + "\n\n" + cur_content │
│ 107 │ │ │ │ │ ) │
│ ❱ 108 │ │ │ │ │ mapped_node = TextNode(**mapped_node.dict()) │
│ 109 │ │ │ │ │ mapped_node.text = new_content │
│ 110 │ │ │ │ result_nodes.append( │
│ 111 │ │ │ │ │ NodeWithScore( │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/llama_index/core/schema.py:108 in dict │
│ │
│ 105 │ │ return data │
│ 106 │ │
│ 107 │ def dict(self, **kwargs: Any) -> Dict[str, Any]: │
│ ❱ 108 │ │ return self.model_dump(**kwargs) │
│ 109 │ │
│ 110 │ def __getstate__(self) -> Dict[str, Any]: │
│ 111 │ │ state = super().__getstate__() │
│ │
│ /home/anindya/miniconda3/envs/deep/lib/python3.10/site-packages/pydantic/main.py:364 in model_dump │
│ │
│ 361 │ │ Returns: │
│ 362 │ │ │ A dictionary representation of the model. │
│ 363 │ │ """ │
│ ❱ 364 │ │ return self.__pydantic_serializer__.to_python( │
│ 365 │ │ │ self, │
│ 366 │ │ │ mode=mode, │
│ 367 │ │ │ by_alias=by_alias, │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
PydanticSerializationError: Error calling function `<lambda>`: AttributeError: 'str' object has no attribute
'value'