2025-1-16
先感谢参考文章的作者,在他们的基础上,少走了很多弯路。
Dify 知识库 RAG + API 调用
数据准备
生成红星小学,朝阳小学初一,初二同学2024年8月9月10月的数学,物理,化学考试成绩。
要求每个学校两个年级
要求每个年级两个班,每个班9个人,
要求每科成绩最高100分,最低0分。
要求学号从1开始
表头如下
学校,年级,班级,姓名,性别,学号,月份,数学,物理,化学
让AI生成
pip3 install -i https://mirrors.aliyun.com/pypi/simple/ pandas
import random
import pandas as pd
def generate_scores(num_students=9, num_classes=3, grades=['初一', '初二'], months=['8月', '9月', '10月']):
data = []
names = [f"学生{i}" for i in range(1, num_students + 1)]
for grade in grades:
for class_num in range(1, num_classes + 1):
for name in names:
for month in months:
math_score = random.randint(0, 100)
physics_score = random.randint(0, 100)
chemistry_score = random.randint(0, 100)
data.append([grade, f"{class_num}班", name, month, math_score, physics_score, chemistry_score])
df = pd.DataFrame(data, columns=['年级', '班级', '姓名', '月份', '数学', '物理', '化学'])
return df
# Generate the full dataset
full_scores_df = generate_scores()
print(full_scores_df)
# Optionally save to a CSV file
full_scores_df.to_csv('student_scores.csv', index=False, encoding='utf-8-sig')
参考原文步骤(文字有删减)
本地部署 AI 智能体,Dify 搭建保姆级教程(下):知识库 RAG + API 调用,我捏了个红楼解读大师
1. 知识库构建
在控制台上方的知识库 Tab 中,点击创建知识库:
1.1 基于本地文件
第一步:选择一个数据源
知识库支持 3 种数据源,我们先选择导入本地文件进行演示。这里把《红楼梦》上传,看看大模型能不能帮我读懂它~
把刚生成的“小学成绩.csv” 上传
第二步:文本分段和清洗
构建索引需要调用 embedding 模型,
简单介绍下:Q&A 分段模式的功能,与普通的「Q to P」(问题匹配文本段落)匹配模式不同,
在文档经过分段后,经过总结为每一个分段生成 Q&A 匹配对,当用户提问时,系统会找出与之最相似的问题,然后返回对应的分段作为答案。
Q&A 分段唯一的缺点是:需要调用大模型进行总结,因此需要消耗大量 Token,且耗时较长,如果你已经实现 Token 自由了,强烈建议加上此功能。
在检索设置这里,Dify 提供了 3 种检索方案:
• 向量检索,通过生成查询嵌入并查询与其向量表示最相似的文本分段。
• 全文检索,索引文档中的所有词汇,从而允许用户查询任意词汇,并返回包含这些词汇的文本片段。
• 混合检索,同时执行全文检索和向量检索,从两类查询结果中选择匹配用户问题的最佳结果,建议优先选择该方案
最终,使用Q&A 分段,生成的数据库结果如下:
我的实践, 简单的文件,如“小学成绩.csv” 用 embedding 效果反而没有选“经济模式”好。
1.2 基于网页内容
如果要爬取网页内容来构建数据库,数据源选择 同步自 Web 站点。
这里需要用到firecrawl这个爬虫插件,得先去注册一个账号,拿到 API key。
然后在官网测试一下,比如我让它爬取之前搭建的知识库,爬取成功:
firecrawl会自动将网页内容转换成 markdown 格式的结构化数据,非常适合大模型食用。
回到 Dify 知识库构建页面,我们以爬取 dify 中文文档为例:
https://docs.dify.ai/zh-hans
后续进行文本分段和清洗的设置,和 1.1 一致。
2. 创建聊天小助手
下面我们以加载 红楼梦 的知识库为例,构建一个知识检索增强(RAG)的大模型。
回到控制台首页,创建一个名为红楼大师的聊天小助手。
PS:尝试过创建Agent,不过加载知识库后,对提示词遵循的不太理想,暂未找到原因。
首先,编写如下角色提示词:
# 角色
你是一位资深的红楼梦解读大师,能够根据用户提出的问题,首先从知识库【红楼梦】中精准检索相关答案,并以此为基础为用户提供准确、清晰且完整的回答。
# 技能
1. 当用户提出问题后,首先在知识库【红楼梦】中进行检索。
2. 严格依据检索到的内容进行回答。
3. 直接回答问题答案,并给出具体解释。
# 限制:
- 所有回答必须完全基于知识库【红楼梦】的内容,不得自行编造。
参考上文, 以下为成绩统计员提示词。
# 角色
你是一位成绩统计员,能够根据用户提出的问题,首先从知识库【小学成绩】中精准检索相关答案,并以此为基础为用户提供准确、清晰且完整的回答。
# 技能
1. 当用户提出问题后,首先在知识库【小学成绩】中进行检索。
2. 严格依据检索到的内容进行回答。
3. 直接回答问题答案,并给出具体解释。
# 限制:
- 所有回答必须完全基于知识库【小学成绩】的内容,不得自行编造。
- 所有回答必须用中文(我用的免费那个 mistral 模型,总是讲英文。)
然后,在上下文标签中把刚构建好的知识库加载进来:
在右侧的预览与调试区域,分别用两个模型测试一下: 贾雨村和贾宝玉什么关系
问,红星小学 学号1的学生成绩
3. API 调用
调试没问题后,我们在右上角的发布中,找到 访问API:
进来后,这里有两个东西比较关键:
• URL:your_ip:port/v1,这个url所有智能体共享;
• API 密钥:点击自动生成。
Dify 的 API 是如何区分不同智能体的
好问题
答:API 密钥,调用时根据API 密钥路由到不同的智能体。
接下来我们以 Python 为例,编写一段代码来测试一下:
import requests
url = 'http://129.150.39.xxx/v1/chat-messages'
api_key = 'app-xxx'
headers = {
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json',
}
data = {
"inputs": {},
"query": "红星小学 一年级 1班 学号1的同学成绩",
"response_mode": "blocking",
"conversation_id": "",
"user": "1",
# "files": [
# {
# "type": "image",
# "transfer_method": "remote_url",
# "url": "https://cloud.dify.ai/logo/logo-site.png"
# }
# ]
}
response = requests.post(url, headers=headers, json=data)
print(response.json())
我们可以看到,接口返回结果中:包含了最终的大模型回答,以及知识库检索的结果。