# 在黄砖中,使用向量存储构建强大的ChatGPT聊天机器人
## 引言
在当今大数据时代,高效的数据存储和检索对许多企业至关重要。Yellowbrick作为一种云端和本地SQL数据库,以其弹性、并行处理能力和基于Kubernetes的扩展性而闻名。本文将演示如何通过使用Yellowbrick作为向量存储来实现Retrieval Augmented Generation(RAG),从而创建一个基于ChatGPT的强大聊天机器人。
## 主要内容
### 1. 创建基础聊天机器人
在我们开始使用向量存储之前,首先使用Langchain创建一个查询ChatGPT的基础聊天机器人。由于此时没有上下文存储,ChatGPT会根据其内在模型进行回答。
```python
from langchain.chains import LLMChain
from langchain_core.prompts.chat import ChatPromptTemplate, HumanMessagePromptTemplate, SystemMessagePromptTemplate
from langchain_openai import ChatOpenAI
# 设置聊天模型和提示语
system_template = "If you don't know the answer, Make up your best guess."
messages = [
SystemMessagePromptTemplate.from_template(system_template),
HumanMessagePromptTemplate.from_template("{question}"),
]
prompt = ChatPromptTemplate.from_messages(messages)
llm = ChatOpenAI(
model_name="gpt-3.5-turbo",
temperature=0,
max_tokens=256,
)
chain = LLMChain(
llm=llm,
prompt=prompt,
verbose=False,
)
def print_result_simple(query):
result = chain(query)
print(f"Question: {query} \nAnswer: {result['text']}")
print_result_simple("How many databases can be in a Yellowbrick Instance?")
2. 连接Yellowbrick并创建嵌入表
我们需要在Yellowbrick中创建一个用于存储文档嵌入的表。连接到Yellowbrick后,通过SQL命令创建表:
import psycopg2
yellowbrick_connection_string = "postgres://user:password@host:5432/database"
embedding_table = "my_embeddings"
# 连接到Yellowbrick数据库
conn = psycopg2.connect(yellowbrick_connection_string)
cursor = conn.cursor()
# 创建嵌入表
create_table_query = f"""
CREATE TABLE IF NOT EXISTS {embedding_table} (
doc_id uuid NOT NULL,
embedding_id smallint NOT NULL,
embedding double precision NOT NULL
)
DISTRIBUTE ON (doc_id);
truncate table {embedding_table};
"""
cursor.execute(create_table_query)
conn.commit()
cursor.close()
conn.close()
3. 加载文档并创建向量表示
从Yellowbrick数据库中提取文档,并使用OpenAI生成嵌入,在数据库中存储这些嵌入。
from langchain_community.vectorstores import Yellowbrick
from langchain_openai import OpenAIEmbeddings
from langchain_core.documents import Document
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 创建文档的嵌入并存储
documents = [Document(page_content="Your document content")]
text_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200)
split_docs = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()
vector_store = Yellowbrick.from_documents(
documents=split_docs,
embedding=embeddings,
connection_string=yellowbrick_connection_string,
table=embedding_table,
)
4. 使用向量存储改进聊天机器人
通过将Yellowbrick作为向量存储,显著提高了聊天机器人的回答准确性。下面是如何使用改进版聊天机器人的例子:
from langchain.chains import RetrievalQAWithSourcesChain
chain = RetrievalQAWithSourcesChain.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vector_store.as_retriever(search_kwargs={"k": 5}),
return_source_documents=True,
)
def print_result_sources(query):
result = chain(query)
print(f"Question: {query} \nAnswer: {result['answer']} \nSources: {result['sources']}")
print_result_sources("How many databases can be in a Yellowbrick Instance?")
常见问题和解决方案
连接错误
如果在连接到Yellowbrick时遇到问题,请检查连接字符串的正确性,并确保数据库服务正在运行。
嵌入生成失败
确认OpenAI API密钥的正确性和有效性,并查看是否超过使用限制。由于某些地区的网络限制,开发者可能需要考虑使用API代理服务以提高访问稳定性。
总结和进一步学习资源
本教程展示了如何在Yellowbrick中使用向量存储构建强大的ChatGPT聊天机器人。通过这篇教程,你不仅可以创建一个简单的聊天机器人,还可以进一步探索Langchain和向量存储的其他功能。
推荐学习资源:
参考资料
- Yellowbrick 官方网站
- OpenAI ChatGPT API 文档
- Langchain 相关库
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---