Как заставить 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"}