当前位置:首页 > 技术 > 正文内容

在CAMEL框架中实现检索增强生成(RAG)的完整指南

访客 技术 2026年7月18日 1

引言

本文将详细介绍如何在CAMEL框架中实现检索增强生成(RAG)功能。RAG是一种结合检索系统和生成模型的技术,能够提高大语言模型回答的准确性和相关性。我们将通过实际代码示例,展示四种不同的RAG实现方式。

环境配置

首先需要配置环境变量,这里我们使用硅基流动的嵌入模型作为示例:

from camel.embeddings import OpenAICompatibleEmbedding
from camel.storages import QdrantStorage
from camel.retrievers import VectorRetriever
import PyPDF2
import pathlib
import os
from dotenv import load_dotenv

# 加载环境变量
base_dir = pathlib.Path(__file__).parent.parent
env_path = base_dir / ".env"
load_dotenv(dotenv_path=str(env_path))

# 获取配置参数
model_type = os.getenv("Embedding_Model_ID")
api_key = os.getenv("SiliconCloud_API_KEY")
base_url = os.getenv("SiliconCloud_Base_URL")

# 初始化嵌入模型
embedding_instance = OpenAICompatibleEmbedding(model_type=model_type, api_key=api_key, url=base_url)

自定义RAG实现

自定义RAG需要手动配置嵌入模型和向量数据库。我们使用Qdrant作为向量存储:

# 初始化向量存储
storage_instance = QdrantStorage(
    vector_dim=1024,
    path="local_data",
    collection_name="custom_rag"
)

# 创建向量检索器
vector_retriever = VectorRetriever(
    embedding_model=embedding_instance,
    storage=storage_instance
)

# PDF文本提取函数
def extract_pdf_text(file_path):
    with open(file_path, "rb") as file:
        reader = PyPDF2.PdfReader(file)
        text_content = ""
        for page_num in range(len(reader.pages)):
            page = reader.pages[page_num]
            text_content += page.extract_text()
    return text_content

# 处理PDF文档
pdf_path = "local_data/document.pdf"
pdf_text = extract_pdf_text(pdf_path)
vector_retriever.process(content=pdf_text)

# 查询示例
query_results = vector_retriever.query(
    query="你最喜欢的编程语言是什么?",
    top_k=1
)
print(query_results)

自动RAG实现

自动RAG简化了配置过程,可以自动处理文档检索:

from camel.retrievers import AutoRetriever
from camel.types import StorageType

# 初始化自动检索器
auto_retriever = AutoRetriever(
    vector_storage_local_path="auto_rag_data",
    storage_type=StorageType.QDRANT,
    embedding_model=embedding_instance
)

# 从URL检索信息
retrieved_data = auto_retriever.run_vector_retriever(
    query="本届消博会共实现意向交易多少亿元?",
    contents=[
        "https://news.cctv.com/2025/04/17/ARTIbMtuugrC3uxmNKsQRyci250417.shtml"
    ],
    top_k=1,
    return_detailed_info=True,
    similarity_threshold=0.5
)
print(retrieved_data)

单代理RAG实现

将检索结果整合到代理上下文中:

from camel.agents import ChatAgent
from camel.models import ModelFactory
from camel.types import ModelPlatformType

# 创建大语言模型
llm_model = ModelFactory.create(
    model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL,
    model_type=os.getenv("Silicon_Model_ID"),
    api_key=api_key,
    url=base_url,
    model_config_dict={"temperature": 0.4, "max_tokens": 4096}
)

# 初始化代理
agent = ChatAgent(
    system_message="你是一个知识渊博的助手,能够基于检索到的信息回答问题",
    model=llm_model
)

# 检索并整合信息
def answer_with_rag(query):
    # 检索相关信息
    retrieval_result = auto_retriever.run_vector_retriever(
        query=query,
        contents=["https://news.cctv.com/2025/04/17/ARTIbMtuugrC3uxmNKsQRyci250417.shtml"],
        top_k=1
    )
    
    # 将检索结果作为上下文
    context = retrieval_result['Retrieved Context'][0]['text']
    agent.record_message(context)
    
    # 生成回答
    response = agent.step(query)
    return response.msg.content

# 使用示例
print(answer_with_rag("3场官方供需对接会共签约多少个项目?"))

角色扮演RAG实现

在多代理场景中实现RAG:

from camel.societies import RolePlaying
from camel.toolkits import FunctionTool
from typing import List, Union

# 信息检索函数
def retrieve_information(
    query: str,
    contents: Union[str, List[str]],
    top_k: int = 3,
    similarity_threshold: float = 0.5
) -> str:
    result = auto_retriever.run_vector_retriever(
        query=query,
        contents=contents,
        top_k=top_k,
        similarity_threshold=similarity_threshold
    )
    return str(result)

# 创建工具
retrieval_tool = FunctionTool(retrieve_information)

# 角色扮演会话
def role_playing_rag_session(task_prompt, turns=5):
    session = RolePlaying(
        assistant_role_name="研究员",
        assistant_agent_kwargs=dict(
            model=llm_model,
            tools=[retrieval_tool]
        ),
        user_role_name="提问者",
        user_agent_kwargs=dict(
            model=ModelFactory.create(
                model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL,
                model_type=os.getenv("ZHIPU_Model_ID"),
                api_key=api_key,
                url=base_url
            )
        ),
        task_prompt=task_prompt
    )
    
    # 运行对话
    for _ in range(turns):
        assistant_response, user_response = session.step()
        print(f"研究员: {assistant_response.msg.content}")
        print(f"提问者: {user_response.msg.content}")
        
        if "CAMEL_TASK_DONE" in user_response.msg.content:
            break

# 启动会话
role_playing_rag_session(
    task_prompt="4月17日凌晨,OpenAI正式宣布推出了什么?请参考https://www.thepaper.cn/newsDetail_forward_30670507",
    turns=3
)

关键注意事项

  • 嵌入模型的选择对RAG效果影响显著
  • 向量数据库的配置需要匹配嵌入模型的输出维度
  • 相似度阈值需要根据具体应用场景调整
  • 在多代理场景中,工具调用可能需要额外的错误处理
标签: CAMEL

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。