首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >教程:使用 Chroma 和 OpenAI 构建自定义问答机器人

教程:使用 Chroma 和 OpenAI 构建自定义问答机器人

作者头像
云云众生s
发布于 2024-03-27 13:19:56
发布于 2024-03-27 13:19:56
78800
代码可运行
举报
文章被收录于专栏:云云众生s云云众生s
运行总次数:0
代码可运行

教程:使用 Chroma 和 OpenAI 构建自定义问答机器人

翻译自 Tutorial: Use Chroma and OpenAI to Build a Custom Q&A Bot

上一个教程中,我们探讨了 Chroma 作为一个向量数据库来存储和检索嵌入。现在,让我们将用例扩展到基于 OpenAI检索增强生成(RAG)技术构建问答应用程序。

在最初为学院奖构建问答机器人时,我们实现了基于一个自定义函数的相似性搜索,该函数计算两个向量之间的余弦距离。我们将用一个查询替换掉该函数,以在Chroma中搜索存储的集合。

为了完整起见,我们将开始设置环境并准备数据集。这与本教程中提到的步骤相同。

步骤1 - 准备数据集

从 Kaggle 下载奥斯卡奖数据集,并将 CSV 文件移到名为 data 的子目录中。该数据集包含 1927 年至 2023 年奥斯卡金像奖的所有类别、提名和获奖者。我将 CSV 文件重命名为 oscars.csv

首先导入 Pandas 库并加载数据集:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
df = pd.read_csv('./data/oscars.csv')
df.head()

数据集结构良好,有列标题和代表每个类别详细信息的行,包括演员/技术人员的姓名、电影和提名是否获奖。

由于我们最感兴趣的是与 2023 年相关的奖项,因此让我们对其进行过滤,并创建一个新的 Pandas data frame 。同时,我们也将类别转换为小写,删除电影值为空的行。这有助于我们为 GPT 3.5 设计上下文提示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df = df.loc[df['year_ceremony'] == 2023] 
df = df.dropna(subset=['film'])
df['category'] = df['category'].str.lower()
df.head()

对过滤和清理过的数据集,让我们在 dataframe 中添加一个包含整个提名句子的新列。当这个完整的句子发送到 GPT 3.5 时,它可以在上下文中找到事实。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df['text'] = df['name'] + ' got nominated under the category, ' + df['category'] + ', for the film ' + df['film'] + ' to win the award'
df.loc[df['winner'] == False, 'text'] = df['name'] + ' got nominated under the category, ' + df['category'] + ', for the film ' + df['film'] + ' but did not win'
df.head()['text']

请注意,我们如何连接这些值以生成一个完整的句子。例如,在 dataframe 的前两行中, “text” 列具有以下值:

Austin Butler got nominated under the category, actor in a leading role, for the film Elvis but did not win Colin Farrell got nominated under the category, actor in a leading role, for the film The Banshees of Inisherin but did not win

步骤2 - 为数据集生成并存储单词嵌入

既然我们已经从数据集构建了文本,那么就将其转换为单词嵌入并存储在 Chroma 中。

这是一个关键步骤,因为嵌入模型生成的标记将帮助我们执行语义搜索,以检索数据集中具有相似含义的句子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import openai
import chromadb
from chromadb.utils import embedding_functions

def text_embedding(text) -> None:
    response = openai.Embedding.create(model="text-embedding-ada-002", input=text)
    return response["data"][0]["embedding"]

openai_ef = embedding_functions.OpenAIEmbeddingFunction(
                api_key=os.environ["OPENAI_API_KEY"],
                model_name="text-embedding-ada-002"
            )

在上面的步骤中,我们通过传递 OpenAI API 密钥和嵌入模型来指示 Chroma 使用 OpenAI 嵌入。

我们可以使用 text_embedding 函数将查询的短语或句子转换为 Chroma 使用的相同嵌入格式。

现在我们可以基于 OpenAI 嵌入模型创建 ChromaDB 集合。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
client = chromadb.Client()
collection = client.get_or_create_collection("oscars-2023",embedding_function=openai_ef) 

请注意,我们通过传递函数将集合与 OpenAI 相关联。这将成为吸收数据时生成嵌入的默认机制。

让我们将 Pandas dataframe 中的文本列转换为可以传递给 Chroma 的 Python 列表。由于 Chroma 中存储的每个文档还需要字符串格式的 ID ,所以我们将 dataframe 的索引列转换为字符串列表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docs = df["text"].tolist()
ids = [str(x) for x in df.index.tolist()]

文档和 ID 完全填充后,我们就可以创建集合了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
collection.add(
    documents=docs, 
    ids=ids
)

步骤3 - 执行相似性搜索以增强提示

首先,为获取音乐类别所有提名的字符串生成单词嵌入。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vector = text_embedding("Nominations for music")

现在我们可以将其作为搜索查询传递给 Chroma ,以检索所有相关文档。通过设置 n_results 参数,我们可以将输出限制为 15 个文档。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
results = collection.query(    
    query_embeddings=vector,
    n_results=15,
    include=["documents"]
)

结果字典包含所有文档的列表。

让我们将此列表转换为一个字符串,以为提示提供上下文。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
res = "\n".join(str(item) for item in results['documents'][0])

是时候根据上下文构建提示并将其发送到OpenAI了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
prompt = f'```{res}```Based on the data in ```, answer who won the award for the original song' 
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
messages = [
        {"role": "system", "content": "You answer questions about 95th Oscar awards."}, 
        {"role": "user", "content": prompt}
]
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=messages, 
    temperature=0
)
response_message = response["choices"][0]["message"]["content"]

响应包括基于上下文和提示的组合得出的正确回答。

本教程演示了如何利用诸如 Chroma 之类的向量数据库来实现检索增强生成(RAG),以通过额外的上下文增强提示。

以下是完整的代码,供您探索:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
import openai
import chromadb
from chromadb.utils import embedding_functions
import os

df=pd.read_csv('./data/oscars.csv')

df=df.loc[df['year_ceremony'] == 2023]
df=df.dropna(subset=['film'])
df['category'] = df['category'].str.lower()

df['text'] = df['name'] + ' got nominated under the category, ' + df['category'] + ', for the film ' + df['film'] + ' to win the award'
df.loc[df['winner'] == False, 'text'] = df['name'] + ' got nominated under the category, ' + df['category'] + ', for the film ' + df['film'] + ' but did not win'

def text_embedding(text) -> None:
    response = openai.Embedding.create(model="text-embedding-ada-002", input=text)
    return response["data"][0]["embedding"]

openai_ef = embedding_functions.OpenAIEmbeddingFunction(
                api_key=os.environ["OPENAI_API_KEY"],
                model_name="text-embedding-ada-002"
            )

client = chromadb.Client()
collection = client.get_or_create_collection("oscars-2023",embedding_function=openai_ef)

docs=df["text"].tolist() 
ids= [str(x) for x in df.index.tolist()]

collection.add(
    documents=docs,
    ids=ids
)

vector=text_embedding("Nominations for music")

results=collection.query(
    
    query_embeddings=vector,
    n_results=15,
    include=["documents"]
)

res = "\n".join(str(item) for item in results['documents'][0])

prompt=f'```{res}```who won the award for the original song'

messages = [
        {"role": "system", "content": "You answer questions about 95th Oscar awards."},
        {"role": "user", "content": prompt}
]
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=messages,
    temperature=0
)
response_message = response["choices"][0]["message"]["content"]

print(response_message)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
教程:基于 ChatGPT 构建奥斯卡金像奖问答机器人
本教程将引导您通过一个实际示例,使用 GPT 3.5 的检索增强生成功能,根据自定义数据集回答问题。
云云众生s
2024/03/27
2360
教程:基于 ChatGPT 构建奥斯卡金像奖问答机器人
【RAG落地利器】向量数据库Chroma入门教程
官方有pip安装的方式,为了落地使用,我们还是采用Docker部署的方式,参考链接来自官方部署:
致Great
2025/01/23
3.7K0
【RAG落地利器】向量数据库Chroma入门教程
Chroma: 引领AI本地向量数据库的新潮流,向量数据库看这篇足够了
在前面的文章我们简单介绍了下什么是向量数据库,用比较生动的三原色的概念进行了类别,可以回顾下之前的文章。
一个程序猿的异常
2023/12/26
3.9K0
Chroma: 引领AI本地向量数据库的新潮流,向量数据库看这篇足够了
如何使用RAG构建准确率更高的AI代理
本教程展示了如何使用检索器从非结构化数据中提取上下文,同时调用 API 获取更多数据来构建代理。
云云众生s
2024/07/31
3420
如何使用RAG构建准确率更高的AI代理
如何使用语义路由器和LLM工具构建AI代理
在本 AI 代理教程中,我们使用语义路由器来选择从 OpenAI LLM 和其他 AI 工具检索信息的最佳方式。
云云众生s
2024/10/13
2340
如何使用语义路由器和LLM工具构建AI代理
Chroma 向量数据入门
🌟Chroma是一个文档检索系统,它存储了一组文档以及它们相应的嵌入向量。当接收到嵌入向量后,Chroma会根据其内部的索引结构快速查找最相关的文档。
@小森
2024/09/27
4090
Chroma 向量数据入门
AI大模型全栈工程师课程笔记 - RAG 检索增强生成
课程学习自 知乎知学堂 https://www.zhihu.com/education/learning
Michael阿明
2023/12/09
1.7K0
AI大模型全栈工程师课程笔记 - RAG 检索增强生成
手把手实战:用Chroma+Docker搭建生产级RAG知识库
ps:关于RAG检索增强技术文档,由于文章篇幅有限,我这边整理成了一份2W字技术文档,自行领取《检索增强生成(RAG)》
聚客AI
2025/07/16
2710
手把手实战:用Chroma+Docker搭建生产级RAG知识库
向量数据库Chroma极简教程
向量数据库其实最早在传统的人工智能和机器学习场景中就有所应用。在大模型兴起后,由于目前大模型的token数限制,很多开发者倾向于将数据量庞大的知识、新闻、文献、语料等先通过嵌入(embedding)算法转变为向量数据,然后存储在Chroma等向量数据库中。当用户在大模型输入问题后,将问题本身也embedding,转化为向量,在向量数据库中查找与之最匹配的相关知识,组成大模型的上下文,将其输入给大模型,最终返回大模型处理后的文本给用户,这种方式不仅降低大模型的计算量,提高响应速度,也降低成本,并避免了大模型的tokens限制,是一种简单高效的处理手段。此外,向量数据库还在大模型记忆存储等领域发挥其不可替代的作用。
Rude3Knife的公众号
2023/11/08
2.3K0
向量数据库Chroma极简教程
Chroma数据库:使用指南与实践案例
Chroma 是一种高效的、基于 Python 的、用于大规模相似性搜索的数据库。它的设计初衷是为了解决在大规模数据集中进行相似性搜索的问题,特别是在需要处理高维度数据时。Chroma 的核心是 HNSW(Hierarchical Navigable Small World)算法,这是一种高效的近似最近邻搜索算法,可以在大规模数据集中实现快速的相似性搜索。
TechHarmony
2024/04/11
8.3K0
Chroma 初探:面向 LLM 的开源向量数据库
Chroma 是一个开源的嵌入式数据库,通过使知识、事实和技能可以插入到 LLM 中,从而轻松构建 LLM 应用程序。这里可以了解它的工作原理。
云云众生s
2024/03/27
1.7K0
使用UMAP降维可视化RAG嵌入
大型语言模型(LLMs)如 GPT-4 已经展示了出色的文本理解和生成能力。但它们在处理领域特定信息方面面临挑战,比如当查询超出训练数据范围时,它们会产生错误的答案。LLMs 的推理过程也缺乏透明度,使用户难以理解达成结论的方式。
deephub
2024/02/21
4050
使用UMAP降维可视化RAG嵌入
向量检索(RAG)之向量数据库研究
研究内容主要包括:是否开源,支持的功能有哪些(是否支持暴力检索,支持哪些索引),是否有可视化界面,是否支持标量过滤。
码之有理
2025/03/05
1.6K1
用GPT-4和ChromaDB与文本文件对话教程
用GPT-4和ChromaDB向你的文本文件对话:一步一步的教程(LangChain 🦜🔗,ChromaDB,OpenAI嵌入,Web Scraping)。
山行AI
2023/08/10
2.6K0
用GPT-4和ChromaDB与文本文件对话教程
面向AI的开发:从大模型(LLM)、检索增强生成(RAG)到智能体(Agent)的应用
在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪些执行器呢?由此我的Runner探索之旅开始了!
京东技术
2024/06/11
2.2K0
面向AI的开发:从大模型(LLM)、检索增强生成(RAG)到智能体(Agent)的应用
DeepSeek从云端模型部署到应用开发-03-实战指南:从部署到RAG Agent
Ollama理论上不刚需显存,只需要有足够的内存(RAM),基础版环境刚好卡到门槛,但是为了优化使用体验,建议通过V100 16GB启动项目,而且每日运行项目就送8算力点!!!
IT从业者张某某
2025/03/15
2960
DeepSeek从云端模型部署到应用开发-03-实战指南:从部署到RAG Agent
使用CLIP和LLM构建多模态RAG系统
在本文中我们将探讨使用开源大型语言多模态模型(Large Language Multi-Modal)构建检索增强生成(RAG)系统。本文的重点是在不依赖LangChain或LLlama index的情况下实现这一目标,这样可以避免更多的框架依赖。
deephub
2024/01/17
2K0
使用CLIP和LLM构建多模态RAG系统
AIOps系列 | 大模型入门实战
!! 大家好,我是乔克,一个爱折腾的运维工程,一个睡觉都被自己丑醒的云原生爱好者。
没有故事的陈师傅
2025/07/16
2840
AIOps系列 | 大模型入门实战
使用ChromaDB和Python构建RAG驱动的LLM聊天应用
利用检索增强生成 (RAG) 和大型语言模型 (LLM) 的强大功能来创建生成式 AI 应用程序。
云云众生s
2024/04/05
1.4K0
矢量数据库与LLM的集成:实践指南
通常,LLM会在各种各样的数据上进行训练,这使它们具有广泛的理解能力,但可能会导致在特定的知识领域存在差距。有时,它们甚至可能产生与目标无关或带有偏见的信息——这是从广阔但未经筛选的web学习的副产品。为了解决该问题,我们引入了向量数据库(Vector Database)的概念。这些数据库以一种称为"向量嵌入"的独特格式存储数据,可以让LLMs掌握和使用的信息更连贯和准确。
charlieroro
2024/03/16
5250
矢量数据库与LLM的集成:实践指南
推荐阅读
相关推荐
教程:基于 ChatGPT 构建奥斯卡金像奖问答机器人
更多 >
交个朋友
加入腾讯云技术交流站
前端技术前沿探索 云开发实战案例分享
加入前端工作实战群
前端工程化实践 组件库开发经验分享
加入前端趋势交流群
追踪前端新趋势 交流学习心得
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验