[在黄砖中,使用向量存储构建强大的ChatGPT聊天机器人]

100 阅读3分钟
# 在黄砖中,使用向量存储构建强大的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---