赞
踩
https://microsoft.github.io/graphrag/posts/get_started/
根据官方的步骤,修改setting到ollama本地,会出现如下两个常见问题:
找起来很费时间 ,分享给大家希望有帮助
解决办法:
I found out that my local Ollama instance (0.3.0) seemed to ignore the system prompt and I got it working by manually stitching together the two prompts into one: File: /graphrag/query/structured_search/global_search/search.py ,
https://github.com/microsoft/graphrag/issues/575
一定要看清楚报错的是哪个文件夹下的/graphrag/query/structured_search/global_search/search.py
修改这个search.py
搜索:_map_response_single_batch,然后修改
- map_response_single_batch
- #search_messages = [
- # {"role": "system", "content": search_prompt},
- # {"role": "user", "content": query},
- #]
- search_messages = [ {"role": "user", "content": search_prompt + "\n\n### USER QUESTION ### \n\n" + query} ]
解决办法:
Yes this is due to your locally run embedding model, not returning the weights in a correct format. OpenAI uses internally base64 encoded floats, and most other models will return floats as numbers.
https://github.com/microsoft/graphrag/issues/619
https://github.com/microsoft/graphrag/issues/345
一定要看清楚报错的是哪个文件夹下的graphrag\query\llm\oai\embedding.py
修改这个embedding.py
- # Copyright (c) 2024 Microsoft Corporation.
- # Licensed under the MIT License
-
- """OpenAI Embedding model implementation."""
-
- import asyncio
- from collections.abc import Callable
- from typing import Any
-
- import numpy as np
- import tiktoken
- from tenacity import (
- AsyncRetrying,
- RetryError,
- Retrying,
- retry_if_exception_type,
- stop_after_attempt,
- wait_exponential_jitter,
- )
-
- from graphrag.query.llm.base import BaseTextEmbedding
- from graphrag.query.llm.oai.base import OpenAILLMImpl
- from graphrag.query.llm.oai.typing import (
- OPENAI_RETRY_ERROR_TYPES,
- OpenaiApiType,
- )
- from graphrag.query.llm.text_utils import chunk_text
- from graphrag.query.progress import StatusReporter
-
- from langchain_community.embeddings import OllamaEmbeddings
-
-
- class OpenAIEmbedding(BaseTextEmbedding, OpenAILLMImpl):
- """Wrapper for OpenAI Embedding models."""
-
- def __init__(
- self,
- api_key: str | None = None,
- azure_ad_token_provider: Callable | None = None,
- model: str = "text-embedding-3-small",
- deployment_name: str | None = None,
- api_base: str | None = None,
- api_version: str | None = None,
- api_type: OpenaiApiType = OpenaiApiType.OpenAI,
- organization: str | None = None,
- encoding_name: str = "cl100k_base",
- max_tokens: int = 8191,
- max_retries: int = 10,
- request_timeout: float = 180.0,
- retry_error_types: tuple[type[BaseException]] = OPENAI_RETRY_ERROR_TYPES, # type: ignore
- reporter: StatusReporter | None = None,
- ):
- OpenAILLMImpl.__init__(
- self=self,
- api_key=api_key,
- azure_ad_token_provider=azure_ad_token_provider,
- deployment_name=deployment_name,
- api_base=api_base,
- api_version=api_version,
- api_type=api_type, # type: ignore
- organization=organization,
- max_retries=max_retries,
- request_timeout=request_timeout,
- reporter=reporter,
- )
-
- self.model = model
- self.encoding_name = encoding_name
- self.max_tokens = max_tokens
- self.token_encoder = tiktoken.get_encoding(self.encoding_name)
- self.retry_error_types = retry_error_types
-
- def embed(self, text: str, **kwargs: Any) -> list[float]:
- """
- Embed text using OpenAI Embedding's sync function.
- For text longer than max_tokens, chunk texts into max_tokens, embed each chunk, then combine using weighted average.
- Please refer to: https://github.com/openai/openai-cookbook/blob/main/examples/Embedding_long_inputs.ipynb
- """
- token_chunks = chunk_text(
- text=text, token_encoder=self.token_encoder, max_tokens=self.max_tokens
- )
- chunk_embeddings = []
- chunk_lens = []
- for chunk in token_chunks:
- try:
- embedding, chunk_len = self._embed_with_retry(chunk, **kwargs)
- chunk_embeddings.append(embedding)
- chunk_lens.append(chunk_len)
- # TODO: catch a more specific exception
- except Exception as e: # noqa BLE001
- self._reporter.error(
- message="Error embedding chunk",
- details={self.__class__.__name__: str(e)},
- )
-
- continue
- chunk_embeddings = np.average(chunk_embeddings, axis=0, weights=chunk_lens)
- chunk_embeddings = chunk_embeddings / np.linalg.norm(chunk_embeddings)
- return chunk_embeddings.tolist()
-
- async def aembed(self, text: str, **kwargs: Any) -> list[float]:
- """
- Embed text using OpenAI Embedding's async function.
- For text longer than max_tokens, chunk texts into max_tokens, embed each chunk, then combine using weighted average.
- """
- token_chunks = chunk_text(
- text=text, token_encoder=self.token_encoder, max_tokens=self.max_tokens
- )
- chunk_embeddings = []
- chunk_lens = []
- embedding_results = await asyncio.gather(*[
- self._aembed_with_retry(chunk, **kwargs) for chunk in token_chunks
- ])
- embedding_results = [result for result in embedding_results if result[0]]
- chunk_embeddings = [result[0] for result in embedding_results]
- chunk_lens = [result[1] for result in embedding_results]
- chunk_embeddings = np.average(chunk_embeddings, axis=0, weights=chunk_lens) # type: ignore
- chunk_embeddings = chunk_embeddings / np.linalg.norm(chunk_embeddings)
- return chunk_embeddings.tolist()
-
- def _embed_with_retry(
- self, text: str | tuple, **kwargs: Any
- ) -> tuple[list[float], int]:
- try:
- retryer = Retrying(
- stop=stop_after_attempt(self.max_retries),
- wait=wait_exponential_jitter(max=10),
- reraise=True,
- retry=retry_if_exception_type(self.retry_error_types),
- )
- for attempt in retryer:
- with attempt:
- embedding = (
- OllamaEmbeddings(
- model=self.model,
- ).embed_query(text)
- or []
- )
- return (embedding, len(text))
- except RetryError as e:
- self._reporter.error(
- message="Error at embed_with_retry()",
- details={self.__class__.__name__: str(e)},
- )
- return ([], 0)
- else:
- # TODO: why not just throw in this case?
- return ([], 0)
-
- async def _aembed_with_retry(
- self, text: str | tuple, **kwargs: Any
- ) -> tuple[list[float], int]:
- try:
- retryer = AsyncRetrying(
- stop=stop_after_attempt(self.max_retries),
- wait=wait_exponential_jitter(max=10),
- reraise=True,
- retry=retry_if_exception_type(self.retry_error_types),
- )
- async for attempt in retryer:
- with attempt:
- embedding = (
- await OllamaEmbeddings(
- model=self.model,
- ).embed_query(text) or [] )
- return (embedding, len(text))
- except RetryError as e:
- self._reporter.error(
- message="Error at embed_with_retry()",
- details={self.__class__.__name__: str(e)},
- )
- return ([], 0)
- else:
- # TODO: why not just throw in this case?
- return ([], 0)
改了哪些部分?
增加了一行
from langchain_community.embeddings import OllamaEmbeddings
然后修改两处embedding
搜索:for attempt in retryer:
搜索:async for attempt in retryer: with attempt:
你会发现不一样的地方 替换掉
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。