python - 我无法使用本地 Python 脚本中的矢量填充 Azure 上托管的 Redis Enterprise 矢量数据库

标签 python database azure redis chatbot

我正在尝试将本地 Python 脚本连接到 Azure 上托管的 Redis Enterprise 矢量数据库,并使用我将用于实现聊天机器人的矢量填充该数据库。我能够与 redis_client.ping() 建立连接,但问题出现在 VectorStore = Redis.from_texts(texts, embeddings, redis_conn=redis_client) 行。我也尝试过 Redis.from_documents 和 Redis.from_texts_return_keys,但我遇到了同样的问题。发生的错误如下: ValueError:未找到 redis_url,请添加包含它的环境变量“REDIS_URL”,或将“redis_url”作为命名参数传递,或 ConnectionError:连接被服务器关闭。 Redis 矢量存储。根据Redis.from_texts函数的不同参数,错误会有所不同。当我们将脚本连接到本地 Redis 和 Pinecone 数据库时,该脚本运行良好。我的代码如下:

#db:redis/docker, source:pdf, webapp:streamlit

 

import os

import redis

import streamlit as st

from PyPDF2 import PdfReader

from langchain.embeddings.openai import OpenAIEmbeddings

from langchain.text_splitter import CharacterTextSplitter

from langchain.vectorstores.redis import Redis

from langchain.llms import OpenAI

from langchain.chains.question_answering import load_qa_chain

from langchain.vectorstores import Pinecone

from urllib.parse import quote_plus

import pinecone

import spacy

import redis

from apikey import apikey




os.environ["OPENAI_API_KEY"] = apikey

 


# Postavke za povezivanje na Azure Redis

redis_host = '#######'

redis_port = '#######'

redis_password = '#######'



encoding='utf-8'

decode_responses=True

 



redis_client = redis.StrictRedis(

    host=redis_host,

    port=redis_port,

    password=redis_password,

    ssl=True,

    ssl_cert_reqs=None,  # Za neobavezne SSL certifikate

    ssl_ca_certs=None  # Putanja do CA certifikata ako je potrebno

)

 


try:

              
 # Testiranje pinga na Redis server

    result = redis_client.ping()

    if result:

        st.write("Veza s Redis serverom je uspešno uspostavljena!")

    else:

        st.write("Neuspešno testiranje veze s Redis serverom.")

 

except Exception as e:

    st.write("Došlo je do greške pri povezivanju s Redis serverom:", e)

 



with st.sidebar:

 

    st.title('🤗💬 Chat with your Data')

 

   

 

def split_text_into_chunks(text, max_chunk_size):

    nlp = spacy.load("en_core_web_sm")

    # Tokenizacija teksta na rečenice

    doc = nlp(text)

    #doc=text

    sentences = [sent.text for sent in doc.sents]

 

    chunks = []

    current_chunk = ""

    for sentence in sentences:

        if len(current_chunk) + len(sentence) <= max_chunk_size:

            current_chunk += sentence

        else:

            chunks.append(current_chunk.strip())

            current_chunk = sentence

    chunks.append(current_chunk.strip())

   

    return chunks

 

 

 

def main():

 

    st.header("Chat with your own PDF")

    pdf = 'Serbia.pdf'

    

    if pdf is not None:

 

        pdf_reader = PdfReader(pdf)

 

        texts = []

 

        for page in pdf_reader.pages:

 

            text = page.extract_text()

 

            page_chunks = split_text_into_chunks(text,50)

 

            texts.extend(page_chunks)

 

            st.write(texts)


 

        embeddings = OpenAIEmbeddings()

 

        VectorStore = Redis.from_texts(texts, embeddings, redis_conn=redis_client)

        VectorStore.url = None

 

      

 

        query = st.text_input("Ask questions related to your PDF")

 

        st.write(embeddings)

 


        if query:

            results = VectorStore.similarity_search(query=query, k=3)

            llm = OpenAI()

            chain = load_qa_chain(llm=llm, chain_type="stuff")

            response = chain.run(input_documents=results, question=query)

            st.write(response)

 

 

if __name__ == '__main__':

 

    main()

最佳答案

看起来您正在使用 Langchain。他们期望的是 url 而不是客户端。它在本地工作得很好,因为默认是redis的默认本地主机地址。您传入的初始化连接不执行任何操作。

尝试以下操作:

import redis

def format_redis_conn_from_env(using_ssl=False):
    start = "rediss://" if using_ssl else "redis://"
    # if using RBAC
    password = os.getenv("REDIS_PASSWORD", None)
    username = os.getenv("REDIS_USERNAME", "default")
    if password is not None:
        start += f"{username}:{password}@"

    return start + f"{os.getenv('REDIS_ADDRESS')}:{os.getenv('REDIS_PORT')}"


# make using_ssl=True to use SSL with ACRE (Azure redis enterprise)
redis_address = format_redis_conn_from_env(using_ssl=False)


# pass url to langchain
from langchain.vectorstores import Redis
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
redisearch = RediSearch.from_texts(
   texts,
   embeddings,
   redis_url=redis_address
)  

关于python - 我无法使用本地 Python 脚本中的矢量填充 Azure 上托管的 Redis Enterprise 矢量数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76869454/

相关文章:

python - 文件中的奇怪字符无声地中断 for 循环

database - 如何备份驻留在 Informix 中的数据库空间中的单个数据库?

sql - 连接到我的 VPS PostgreSQL

c# - 从 Azure Functions NET5 迁移到 NET6 - 现在如何注册中间件

没有队列或主题的 Azure 服务总线流量

python - 在 python 中,如何计算函数中满足条件的次数?

python - 将队列转储到python中的列表/数组中

mysql - 获取父级的所有子层次结构

Azure blob GET 请求授权 header "x-ms-date"字段问题

python - 导入错误 : No module named pjsip