本笔记本演示了如何将 Redis 用作 ChatGPT 的高速上下文内存。
先决条件
- 带有 Redis Search 和 Redis JSON 模块的 Redis 实例
- Redis-py 客户端库
- OpenAI Python 客户端库
- OpenAI API 密钥
安装
安装示例所需的 Python 模块。
本笔记本演示了如何将 Redis 用作 ChatGPT 的高速上下文内存。
安装示例所需的 Python 模块。
! pip install -q redis openai python-dotenv 'openai[datalib]'创建一个 .env 文件并将您的 OpenAI 密钥添加到其中
OPENAI_API_KEY=your_key密钥加载 + 用于聊天完成的辅助函数
from openai import OpenAI
import os
from dotenv import load_dotenv
load_dotenv()
oai_client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
def get_completion(prompt, model="gpt-3.5-turbo"):
messages = [{"role": "user", "content": prompt}]
response = oai_client.chat.completions.create(
model=model,
messages=messages,
temperature=0,
)
return response.choices[0].message.contentGpt-3.5-turbo 使用截至 2021 年 9 月的数据进行训练。 让我们问它一个关于超出该日期范围的问题。 在本例中,是 FTX/Sam Bankman-Fried 丑闻。 我们在这里使用旧模型进行演示。 较新的模型(如 got-4o)具有较晚的知识截止日期(2023 年底),也适用于此处。
prompt = "Is Sam Bankman-Fried's company, FTX, considered a well-managed company?"
response = get_completion(prompt)
print(response)Yes, FTX is generally considered a well-managed company. Sam Bankman-Fried, the founder and CEO of FTX, has a strong track record in the cryptocurrency industry and has successfully grown the company into one of the leading cryptocurrency exchanges in the world. FTX has also received positive reviews for its user-friendly platform, innovative products, and strong customer service. Additionally, FTX has been proactive in regulatory compliance and has taken steps to ensure the security of its users' funds. Overall, FTX is seen as a well-managed company in the cryptocurrency space.
这些 AI 系统的一个不幸行为是,即使系统对其结果没有信心,也会提供听起来自信的响应。 缓解这种情况的一种方法是提示重新设计,如下所示。
prompt ="Is Sam Bankman-Fried's company, FTX, considered a well-managed company? If you don't know for certain, say unknown."
response = get_completion(prompt)
print(response)FTX is generally considered a well-managed company. Sam Bankman-Fried, the founder and CEO, has a strong reputation in the cryptocurrency industry for his leadership and strategic vision. FTX has also experienced significant growth and success since its founding in 2017. However, without specific insider knowledge or data, it is ultimately unknown whether FTX is definitively considered a well-managed company.
对抗信息不完整的另一种方法是为系统提供更多信息,使其能够做出明智的决策而不是猜测。 我们将使用 Redis 作为附加背景信息的来源。 我们将从 GPT 知识截止日期之后提取商业新闻文章,以便系统更好地了解 FTX 的实际管理方式。
! docker compose up -dfrom redis import from_url
REDIS_URL = 'redis://:6379'
client = from_url(REDIS_URL)
client.ping()True
from redis.commands.search.field import TextField, VectorField
from redis.commands.search.indexDefinition import IndexDefinition, IndexType
schema = [ VectorField('$.vector',
"FLAT",
{ "TYPE": 'FLOAT32',
"DIM": 1536,
"DISTANCE_METRIC": "COSINE"
}, as_name='vector' ),
TextField('$.content', as_name='content')
]
idx_def = IndexDefinition(index_type=IndexType.JSON, prefix=['doc:'])
try:
client.ft('idx').dropindex()
except:
pass
client.ft('idx').create_index(schema, definition=idx_def)b'OK'
directory = './assets/'
model = 'text-embedding-3-small'
i = 1
for file in os.listdir(directory):
with open(os.path.join(directory, file), 'r') as f:
content = f.read()
# Create the embedding using the new client-based method
response = oai_client.embeddings.create(
model=model,
input=[content]
)
# Access the embedding from the response object
vector = response.data[0].embedding
# Store the content and vector using your JSON client
client.json().set(f'doc:{i}', '$', {'content': content, 'vector': vector})
i += 1from redis.commands.search.query import Query
import numpy as np
response = oai_client.embeddings.create(
input=[prompt],
model=model
)
# Extract the embedding vector from the response
embedding_vector = response.data[0].embedding
# Convert the embedding to a numpy array of type float32 and then to bytes
vec = np.array(embedding_vector, dtype=np.float32).tobytes()
# Build and execute the Redis query
q = Query('*=>[KNN 1 @vector $query_vec AS vector_score]') \
.sort_by('vector_score') \
.return_fields('content') \
.dialect(2)
params = {"query_vec": vec}
context = client.ft('idx').search(q, query_params=params).docs[0].content
print(context)
现在我们有了相关的上下文,将其添加到 OpenAI 的提示中,并获得非常不同的响应。
prompt = f"""
Using the information delimited by triple backticks, answer this question: Is Sam Bankman-Fried's company, FTX, considered a well-managed company?
Context: ```{context}```
"""
response = get_completion(prompt)
print(response)Based on the information provided, FTX, Sam Bankman-Fried's company, is not considered a well-managed company. The company has faced bankruptcy proceedings, mishandling of customer funds, unauthorized transactions, freezing of assets by regulatory authorities, and a lack of trustworthy financial information. The new CEO, John J. Ray III, described the situation as a "complete failure of corporate controls" and indicated gross mismanagement. Additionally, the company's financial situation, lack of record-keeping, and use of inadequate accounting tools despite handling billions of dollars have raised serious concerns about its management practices.