Как разрешить повторяющиеся совпадения векторов в хранилище векторов Redis с помощью Langchain Framework?
В настоящее время я использую Redis Vector Store в сочетании с инфраструктурой Langchain. Мое приложение настроено на получение четырех отдельных фрагментов, но я заметил, что иногда все четыре фрагмента идентичны. Это приводит к некоторой неэффективности и не является ожидаемым поведением. Кто-нибудь знает, почему это может происходить, и есть ли какие-либо рекомендации по решению этой проблемы?
def getVectorStore(database: str, index_name: str = "KU_RULE_05") -> Redis:
if database not in vectorstore:
raise ValueError(f"{database} does not exist in vectorstore list in utils.py")
if database == "Redis":
VectorStore = Redis.from_existing_index(
embedding=embedding(),
redis_url=os.getenv("REDIS_URL"),
index_name=index_name)
return VectorStore
def getRelatedDocs(content: str, database="Redis"):
VectorStore = getVectorStore(database=database, index_name=index_name)
RelatedDocs = []
for index, documents in enumerate(VectorStore.similarity_search(query=content)):
RelatedDocs.append("{}: {}".format(index + 1, documents.page_content))
return RelatedDocs
Мы тщательно проверили базу данных на наличие дубликатов документов, чтобы выяснить, не являются ли они причиной проблемы, но дубликатов не обнаружено.
1 ответ
Хорошо, скорее всего, вы продолжаете использовать метод изgetVectorStore
функцию, когда вам действительно следует использовать этот метод. Вероятно, вы каждый раз повторно создаете и загружаете вложения, каждое из которых имеет уникальный UUID, следовательно, и дубликаты.
Поток повторного использования индекса после его создания (как вfrom_documents
) является:
-
from_existing_index
(обязательно передайте схему, если используете метаданные) - затем либо использовать в качестве ретривера в цепочке
as_retriever
или использовать методы поиска напрямую, т.е.similarity_search
.
пример
from langchain.vectorstores.redis import Redis
metadata = [
{
"user": "john",
"age": 18,
"job": "engineer",
"credit_score": "high",
},
{
"user": "derrick",
"age": 45,
"job": "doctor",
"credit_score": "low",
}
]
texts = ["foo", "foo"]
rds = Redis.from_texts(
texts,
embeddings,
metadatas=metadata,
redis_url="redis://localhost:6379",
index_name="users"
)
results = rds.similarity_search("foo")
print(results[0].page_content)
затем, чтобы инициализировать существующий индекс, вы можете сделать
new_rds = Redis.from_existing_index(
embeddings,
index_name="users",
redis_url="redis://localhost:6379",
schema="redis_schema.yaml"
)
results = new_rds.similarity_search("foo", k=3)
print(results[0].metadata)
Обратите внимание, я передаю схему выше. Если вы используете метаданные, вы можете записать файл схемы, используя командуwrite_schema
метод.
# write the schema to a yaml file
new_rds.write_schema("redis_schema.yaml")
Я настоятельно рекомендую также просмотреть документацию для новой версии интеграции Redis.
https://python.langchain.com/docs/integrations/vectorstores/redis
Хорошо, теперь, учитывая ваш код, я не уверен, что на самом деле вызывает эту ошибку, поскольку вы уверены, что курировали содержимое своей базы данных, но не могли бы вы попробовать
def getRelatedDocs(content: str, database="Redis"):
VectorStore = getVectorStore(database=database, index_name=index_name)
RelatedDocs = []
docs = VectorStore.similarity_search(query=content)
for i, document in enumerate(docs, start=1):
RelatedDocs.append(f"{i}: {doc.page_content}")
return RelatedDocs
Если это не сработает, я бы попробовал запустить более простые примеры с вашей кодовой базой и посмотреть, работает ли более тривиальный пример.