如何在LangChain中正确配置PolarDB/MySQL作为VectorStore?
配置PolarDB/MySQL作为LangChain RAG向量存储的详细指南
1. 前置准备
- 确保PolarDB/MySQL实例已启动,且应用服务器可通过网络访问(开放3306端口、配置安全组/防火墙规则)
- 安装依赖包:
若使用本地嵌入模型(如HuggingFace模型),需额外安装:pip install langchain langchain_community langchain_openai mysql-connector-python python-dotenvpip install transformers torch langchain_huggingface - 准备嵌入模型(如OpenAI Embeddings、HuggingFace开源模型)
2. 创建向量存储表结构
PolarDB兼容MySQL的VECTOR类型(MySQL 8.0.34+也支持),可手动创建表或让LangChain自动生成。手动创建执行以下SQL:
CREATE TABLE IF NOT EXISTS langchain_vector_store ( id VARCHAR(36) NOT NULL PRIMARY KEY, embedding VECTOR(1536) NOT NULL, -- 维度需与嵌入模型输出一致,如OpenAI是1536 document TEXT NOT NULL, metadata JSON, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
若使用自动创建,初始化向量存储时指定table_name即可。
3. 初始化向量存储连接
创建Python脚本,配置数据库连接与向量存储:
from dotenv import load_dotenv import os from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import MySQL # 加载环境变量(建议用.env文件管理敏感信息) load_dotenv() # 数据库连接参数 db_config = { "host": os.getenv("POLARDB_HOST"), "port": int(os.getenv("POLARDB_PORT", 3306)), "user": os.getenv("POLARDB_USER"), "password": os.getenv("POLARDB_PASSWORD"), "database": os.getenv("POLARDB_DB_NAME") } # 初始化OpenAI嵌入模型(替换为你的模型) embeddings = OpenAIEmbeddings(api_key=os.getenv("OPENAI_API_KEY")) # 连接PolarDB并初始化向量存储 vector_store = MySQL.from_connection_string( connection_string=f"mysql+mysqlconnector://{db_config['user']}:{db_config['password']}@{db_config['host']}:{db_config['port']}/{db_config['database']}", embedding=embeddings, table_name="langchain_vector_store", vector_dimension=1536 )
若使用HuggingFace本地模型,替换嵌入模型初始化代码:
from langchain_huggingface import HuggingFaceEmbeddings embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2") vector_store = MySQL.from_connection_string( # 同上连接字符串 embedding=embeddings, table_name="langchain_vector_store", vector_dimension=384 # all-MiniLM-L6-v2的输出维度为384 )
4. 向向量存储添加文档
加载并拆分文档后存入PolarDB:
from langchain_text_splitters import RecursiveCharacterTextSplitter # 示例文档(实际可替换为本地文件、网页内容等) raw_documents = [ "PolarDB是阿里云推出的云原生关系型数据库,兼容MySQL、PostgreSQL和Oracle协议。", "RAG即检索增强生成,通过检索外部知识库提升大模型回答的准确性与时效性。", "LangChain是构建LLM应用的框架,提供了多种向量存储的原生集成能力。" ] # 拆分长文档(避免向量嵌入丢失信息) text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) split_docs = text_splitter.create_documents(raw_documents) # 批量添加到向量存储 vector_store.add_documents(split_docs)
5. 检索文档用于RAG流程
在RAG中检索与查询相关的文档:
# 初始化检索器(k为返回的相似文档数量) retriever = vector_store.as_retriever(search_kwargs={"k": 3}) # 执行检索 query = "PolarDB可以作为LangChain的向量存储吗?" relevant_docs = retriever.get_relevant_documents(query) # 打印检索结果 for doc in relevant_docs: print(f"相关内容:{doc.page_content}")
6. 构建完整RAG应用
结合大模型实现端到端的问答功能:
from langchain_openai import ChatOpenAI from langchain.chains import RetrievalQA # 初始化大模型 llm = ChatOpenAI(api_key=os.getenv("OPENAI_API_KEY"), model_name="gpt-3.5-turbo") # 构建QA链 qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", # 可选stuff/map_reduce/refine等链类型 retriever=retriever, return_source_documents=True # 返回检索到的源文档 ) # 执行问答 result = qa_chain.invoke({"query": "如何用PolarDB搭建LangChain的RAG应用?"}) print(f"回答:{result['result']}") print("\n参考文档:") for doc in result["source_documents"]: print(doc.page_content)
7. 性能与安全优化
- 向量索引优化:为
embedding字段创建HNSW近似索引,提升检索速度:CREATE INDEX idx_embedding ON langchain_vector_store USING HNSW (embedding vector_l2_ops); - 权限控制:创建专用数据库用户,最小化权限:
CREATE USER 'langchain_user'@'%' IDENTIFIED BY 'your_secure_password'; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER ON your_database.* TO 'langchain_user'@'%'; FLUSH PRIVILEGES; - 维度匹配:确保表中
VECTOR字段维度与嵌入模型输出维度完全一致,否则会导致插入失败 - 敏感信息管理:禁止硬编码数据库密码、API密钥,使用
.env文件或环境变量管理
内容的提问来源于stack exchange,提问作者Jacki
相关产品推荐
相关产品推荐

