🤝 基于的Qwen模型的智能客服Discord机器人,使用🐫 CAMEL、SambaNova、Firecrawl和Qdrant实现RAG Agent
本cookbook在线运行链接:https://colab.research.google.com/drive/1j7U-QN4MLckJoaUoprODGtD-jjPIQkLc?usp=sharing
⭐ 为代码库点赞
如果你觉得 CAMEL 很有用或有趣,请考虑在我们的 CAMEL 仓库为我们点赞!你的点赞能帮助更多人发现这个项目,并激励我们持续改进。
安装和设置
首先,安装CAMEL包及其所有依赖项
!pip install "camel-ai[all]==0.2.15a0"
!pip install starlette
!pip install nest_asyncio`
接下来,设置Firecrawl和SambaNova的API密钥
如果你还没有FireCrawl API密钥,可以按照以下步骤获取:
访问FireCrawl API密钥页面 https://www.firecrawl.dev/app/api-keys
登录或注册FireCrawl账户
导航到'API密钥'部分
点击'创建API密钥'按钮生成新的API密钥
更多详情,你也可以查看Firecrawl文档:https://docs.firecrawl.dev/api-reference/introduction
import os
from getpass import getpass
firecrawl_api_key = getpass('请输入你的API密钥: ')
os.environ["FIRECRAWL_API_KEY"] = firecrawl_api_key
请输入你的API密钥: ··········
如果你还没有SambaNova Cloud API密钥,可以按照以下步骤获取:
访问SambaNova Cloud页面 https://cloud.sambanova.ai/apis
登录或注册SambaNova账户
导航到'API密钥'部分
点击'创建API密钥'按钮生成新的API密钥
更多详情,你也可以查看SambaNova文档:https://community.sambanova.ai/c/docs/
import os
from getpass import getpass
samba_api_key = getpass('请输入你的API密钥: ')
os.environ["SAMBA_API_KEY"] = samba_api_key
请输入你的API密钥: ··········
知识爬取和存储
使用Firecrawl爬取网站并获取markdown格式的外部知识:
import os
from camel.loaders import Firecrawl
firecrawl = Firecrawl()
knowledge = firecrawl.crawl(
url="https://sambanova.ai/blog/qwen-2.5-32b-coder-available-on-sambanova-cloud"
)["data"][0]["markdown"]
将内容存储在markdown文件中:
os.makedirs('local_data', exist_ok=True)
with open('local_data/sambanova_announcement.md', 'w') as file:
file.write(knowledge)
基础Agent设置
Qwen是由阿里巴巴开发的大型语言模型。它在海量的文本和代码数据集上进行训练,可以生成文本、翻译语言、创作各种创意内容,并以信息丰富的方式回答你的问题。
使用SambaNova Cloud的Qwen模型来设置CAMEL代理:
from camel.configs import SambaCloudAPIConfig
from camel.models import ModelFactory
from camel.types import ModelPlatformType, ModelType
from camel.agents import ChatAgent
from camel.messages import BaseMessage
#### 设置代理使用Qwen2.5-Coder-32B-Instruct #####
qwen_model = ModelFactory.create(
model_platform=ModelPlatformType.SAMBA,
model_type="Qwen2.5-Coder-32B-Instruct",
model_config_dict=SambaCloudAPIConfig(max_tokens=4000).as_dict(),
)
# ##### 设置代理使用Qwen2.5-72B-Instruct #####
# qwen_model = ModelFactory.create(
# model_platform=ModelPlatformType.SAMBA,
# model_type="Qwen2.5-72B-Instruct",
# model_config_dict=SambaCloudAPIConfig(max_tokens=4000).as_dict(),
# )
chat_agent = ChatAgent(
system_message="你是一个有帮助的助手",
message_window_size=20,
model=qwen_model
)
将外部知识插入到代理中
knowledge_message = BaseMessage.make_user_message(
role_name="User", content=f"基于以下知识:{knowledge}"
)
chat_agent.update_memory(knowledge_message, "user")
基础聊天机器人设置
让我们使用CAMEL代理设置基础聊天机器人并提出一些问题!
你可以问的示例问题:
SambaNova Cloud如何支持Qwen 2.5 Coder,它的速度如何?
print("开始聊天!输入'exit'结束对话。")
while True:
user_input = input("User: ")
if user_input.lower() == "exit":
print("结束对话。")
break
assistant_response = chat_agent.step(user_input)
print(f"Assistant: {assistant_response.msgs[0].content}")
开始聊天!输入'exit'结束对话。
User: SambaNova Cloud如何支持Qwen 2.5 Coder,它的速度如何?
Assistant: SambaNova Cloud支持Qwen 2.5 Coder通过提供一个平台,该平台利用SambaNova的RDU(可重构数据流单元)芯片的高效性和性能。这些芯片专门为处理最苛刻的AI工作负载而设计,包括像Qwen 2.5 Coder这样的生成式AI模型,与传统的GPU相比具有更好的性能。
### 关键点:
1. **性能**:
- **5倍于GPU**:Qwen 2.5 Coder模型在SambaNova Cloud上运行速度比领先的GPU提供商快5倍以上。这是由于RDU芯片的优化架构,它专门为AI工作负载而设计。
- **高效推理**:RDU芯片提供快速的推理速度,这对于实时应用和无缝的用户体验至关重要。
2. **集成**:
- **易于使用**:SambaNova Cloud使开发人员可以轻松地将Qwen 2.5 Coder模型集成到他们的应用程序中。你可以通过获取API密钥并将其集成到你的开发环境中开始使用。
- **合作伙伴**:SambaNova Cloud与工具如Continue.dev合作简化集成过程并提供更好的开发者体验。这种合作使开发人员可以轻松地将Qwen 2.5 Coder模型集成到他们的IDE中。
3. **用例**:
- **编码代理**:Qwen 2.5 Coder模型特别适合开发可以自主编写、编辑和优化代码的编码代理。SambaNova Cloud的高性能确保这些代理可以高效运行并提供快速响应。
- **实时应用**:SambaNova Cloud提供的快速推理速度使其成为实时应用的理想选择,在这些应用中快速响应时间至关重要。
### 入门:
1. **访问SambaNova Cloud**:访问[SambaNova Cloud](https://cloud.sambanova.ai/)注册并获取你的API密钥。
2. **集成模型**:使用API密钥将Qwen 2.5 Coder模型集成到你的开发环境中。
3. **进一步探索**:查看资源,如[Continue的博客文章](https://blog.continue.dev/p/d0796190-6827-42d1-8d81-bd9ca31e1828/),了解如何有效地集成和使用模型。
通过利用SambaNova Cloud,开发人员可以利用Qwen 2.5 Coder模型的强大功能,并获得现代AI应用所需的速度和效率。
User: exit
结束对话.
基础Discord机器人集成
要构建discord机器人,需要一个discord机器人令牌。
如果你还没有机器人令牌,可以按照以下步骤获取:
访问Discord开发者门户:https://discord.com/developers/applications
使用你的Discord账户登录,如果没有账户则创建一个
点击'新建应用程序'来创建新的机器人
为你的应用程序命名并点击'创建'
导航到'机器人'选项卡并点击'添加机器人'
一旦机器人创建完成,你将在'令牌'部分找到令牌。点击'重置令牌'生成新的令牌。
复制生成的令牌并安全地保存。
要邀请机器人:
导航到'OAuth2'选项卡,然后到'URL生成器'
在'范围'下,选择'机器人'
在'机器人权限'下,选择你的机器人需要的权限(例如,'发送消息'、'读取消息')
复制生成的URL并粘贴到你的浏览器中邀请机器人加入你的服务器。
要授予机器人权限:
导航到'机器人'选项卡
在'特权网关意图'下,勾选'Server成员意图'和'消息内容意图'。
更多详情,你也可以查看官方的Discord机器人文档:https://discord.com/developers/docs/intro
import os
from getpass import getpass
discord_bot_token = getpass('请输入你的Discord机器人令牌: ')
os.environ["DISCORD_BOT_TOKEN"] = discord_bot_token
请输入你的Discord机器人令牌: ··········
本代码单元使用DiscordApp类从camel.bots库设置一个简单的Discord机器人。机器人监听任何它有访问权限的频道中的消息,并根据输入消息提供响应。
from camel.bots import DiscordApp
import nest_asyncio
import discord
nest_asyncio.apply()
discord_bot = DiscordApp(token=discord_bot_token)
@discord_bot.client.event
async def on_message(message: discord.Message):
if message.author == discord_bot.client.user:
return
if message.type != discord.MessageType.default:
return
if message.author.bot:
return
user_input = message.content
chat_agent.reset()
chat_agent.update_memory(knowledge_message, "user")
assistant_response = chat_agent.step(user_input)
response_content = assistant_response.msgs[0].content
if len(response_content) > 2000: # discord消息长度限制
for chunk in [response_content[i:i+2000] for i in range(0, len(response_content), 2000)]:
await message.channel.send(chunk)
else:
await message.channel.send(response_content)
discord_bot.run()
将 Qdrant 集成以扩展更多文件,从而构建更强大的 Discord 机器人
Qdrant 是一个向量相似性搜索引擎和向量数据库。它旨在对大型向量数据集进行快速高效的相似性搜索。这使得聊天机器人能够访问和利用外部信息,从而提供更全面、准确的回答。通过将知识存储为向量,Qdrant 实现了高效的语义搜索,使聊天机器人能够根据用户查询的含义找到相关信息。
在本节中,我们将添加更多数据源,包括 Camel 的示例代码(如何使用 SambaNova Cloud),然后提出更复杂的问题。
为 Qdrant 设置嵌入模型和检索器
您可以使用 Tesla T4 Google Colab 实例运行支持 RAG 功能的开源嵌入模型,也可以切换到其他由 CAMEL 支持的嵌入模型。
from camel.embeddings import SentenceTransformerEncoder # CAMEL also support other embedding models
from camel.types import EmbeddingModelType
sentence_encoder = SentenceTransformerEncoder(model_name='intfloat/e5-large-v2')
设置 AutoRetriever 以从存储系统中检索相关信息。
from camel.retrievers import AutoRetriever
from camel.types import StorageType
assistant_sys_msg = """You are a helpful assistant to answer question,
I will give you the Original Query and Retrieved Context,
answer the Original Query based on the Retrieved Context,
if you can't answer the question just say I don't know.
Just give the answer to me directly, no more other words needed.
"""
auto_retriever = AutoRetriever(
vector_storage_local_path="local_data2/",
storage_type=StorageType.QDRANT,
embedding_model=sentence_encoder
)
chat_agent_with_rag = ChatAgent(system_message=assistant_sys_msg, model=qwen_model)
使用AutoRetriever进行检索,之后根据检索到的信息,使用CAMEL ChatAgent回答用户的问题。
from camel.bots import DiscordApp
import nest_asyncio
import discord
nest_asyncio.apply()
discord_q_bot = DiscordApp(token=discord_bot_token)
@discord_q_bot.client.event # triggers when a message is sent in the channel
async def on_message(message: discord.Message):
if message.author == discord_q_bot.client.user:
return
if message.type != discord.MessageType.default:
return
if message.author.bot:
return
user_input = message.content
query_and_retrieved_info = auto_retriever.run_vector_retriever(
query=user_input,
contents=[
"local_data/sambanova_announcement.md", # SambaNova's anncouncement
"https://github.com/camel-ai/camel/blob/master/examples/models/samba_model_example.py", # CAMEL's example code for SambaNova Usage
],
top_k=3,
return_detailed_info=False,
similarity_threshold=0.5
)
user_msg = str(query_and_retrieved_info)
assistant_response = chat_agent_with_rag.step(user_msg)
response_content = assistant_response.msgs[0].content
if len(response_content) > 2000: # discord message length limit
for chunk in [response_content[i:i+2000] for i in range(0, len(response_content), 2000)]:
await message.channel.send(chunk)
else:
await message.channel.send(response_content)
discord_q_bot.run()
从之前的query开始:
既然我们已经将 CAMEL 的示例代码添加到 RAG Bot 中,让我们问一些与代码相关的问题:
向 Bot 咨询如何设置 Qwen2.5-Coder-32B-Instruct。配备记忆功能的 CAMEL Bot 可以通过利用其回忆先前互动中相关信息的能力来提供有效的协助!