Как разрешить повторяющиеся совпадения векторов в хранилище векторов 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) является:

  1. from_existing_index(обязательно передайте схему, если используете метаданные)
  2. затем либо использовать в качестве ретривера в цепочке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

Если это не сработает, я бы попробовал запустить более простые примеры с вашей кодовой базой и посмотреть, работает ли более тривиальный пример.

Другие вопросы по тегам