Как заставить ChatGPT возвращать источник информации, возвращаемый при обучении на собственных данных

Я пытаюсь использовать свои собственные данные для обучения с ChatGPT, сохраняя данные в векторной базе данных (Pinecone). Я использую плагин извлечения ChatGPT для векторизации данных и сохранения их в Python. Плагин можно найти здесь: https://github.com/openai/chatgpt-retrieval-plugin .

Следуя руководству https://betterprogramming.pub/enhancing-chatgpt-with-infinite-external-memory-using-vector-database-and-chatgpt-retrieval-plugin-b6f4ea16ab8, пока все хорошо. Однако у меня возникла проблема с доступом к метаданным, то есть источнику информации, который может быть автором, URL-адресом и т. д.

Я считаю, что это необходимо сделать в приведенной ниже функции. Обратите внимание, что я сам добавил часть метаданных:

      def upsert_file(directory: str):
    """
    Upload all files under a directory to the vector database.
    """
    url = "http://0.0.0.0:8000/upsert-file"
    headers = {"Authorization": "Bearer " + DATABASE_INTERFACE_BEARER_TOKEN}
    files = []
    for filename in os.listdir(directory):
        if os.path.isfile(os.path.join(directory, filename)):
            file_path = os.path.join(directory, filename)
            with open(file_path, "rb") as f:
                file_content = f.read()
                # files.append(("file", (filename, file_content, "text/plain")))
                metadata = {
                    "source": filename,  # Add your metadata values
                    "author": "Tim Cook",
                    "url": "Some fake url"
                    # Add more metadata fields as needed
                }
                print(metadata)
                files = {
                    "file": (filename, file_content, "text/plain"),
                    "metadata": (None, json.dumps(metadata), "application/json"),
                }
                # response = requests.post(url, headers=headers, files=files, timeout=600)

            response = requests.post(url,
                                     headers=headers,
                                     files=files,
                                    #  data={"metadata": json.dumps(metadata)},
                                     timeout=600)
            if response.status_code == 200:
                print(filename + " uploaded successfully.")
            else:
                print(
                    f"Error: {response.status_code} {response.content} for uploading "
                    + filename)

Моя проблема заключается в том, что файлы по-прежнему векторизуются/сохраняются в сосновой шишке, но метаданные по-прежнему возвращаются, как показано ниже:

      metadata': {'source': 'file', 'source_id': None, 'url': None, 'created_at': None, 'author': None, 'document_id': 'Some_Doc_Id_here_that_is_not_None'}

Мой вопрос: как мне получить метаданные? Почему для такого количества полей возвращается None? Я также должен упомянуть о строке:

      "metadata": (None, json.dumps(metadata), "application/json")

Если я изменюсьNoneк чему-нибудь еще, скажиtesting, при попытке вставить файлы я получаю следующую ошибку:

      Error: 422 b'{"detail":[{"loc":["body","metadata"],"msg":"str type expected","type":"type_error.str"}]}'

1 ответ

Для тех, кто сталкивается с той же проблемой, причина, по которой отображаются метаданныеNoneпотому что метаданные должны содержать правильные атрибуты. Если копнуть глубже в код плагина GPT, правильные атрибуты:

      class DocumentMetadata(BaseModel):
    source: Optional[Source] = None
    source_id: Optional[str] = None
    url: Optional[str] = None
    created_at: Optional[str] = None
    author: Optional[str] = None

class Source(str, Enum):
    email = "email"
    file = "file"
    chat = "chat"

Я дал источнику имя файла, которое не было допустимым атрибутом дляSourceобъект.

В итоге я обновил метаданные до чего-то вроде ниже, и теперь я могу получить метаданные:

      metadata = {"source": "file", "source_id": filename, "url": "https://example.com", "created_at":  str(date.today()), "author": "Tim Cook"}
Другие вопросы по тегам