跳到主要内容

5 篇博文 含有标签「LLM」

查看所有标签

目录

  1. 引言
  2. 大模型工具调用基础原理
  3. 工具调用流程详解
  4. Rust 实现案例分析
  5. 代码架构设计
  6. 最佳实践与优化
  7. 总结

引言

随着大语言模型(LLM)技术的快速发展,单纯的文本生成已经无法满足复杂应用场景的需求。**工具调用(Tool Calling)**作为一种重要的扩展机制,让大模型能够与外部系统交互,获取实时数据,执行特定任务,从而构建更加智能和实用的 AI 应用。

本文将深入探讨大模型工具调用的核心原理,并通过一个完整的 Rust 项目案例,详细讲解如何实现一个支持天气查询和网络搜索的智能助手,使用原生的HTTP调用方式,不使用任何第三方LLM服务的客户端,比如Python的openai库,这样便于对原理有更清晰的理解,也便于根据任何编程语言开发自己工具,而不局限于特定库。

大模型工具调用算是LLM中一种动态获取,或说实时获取与用户提问相关数据的一种方式,为用户的问题提供可靠的上下文。另外一种方式基于RAG的方式,这种是基于知识库,更像是一种静态知识。之后会用别的文章再来讨论,敬请期待。

关键词

  • 大语言模型 (Large Language Model, LLM)
  • 工具调用 (Tool Calling)
  • Function Calling
  • AI Agent
  • Rust 异步编程
  • DeepSeek API

大模型工具调用基础原理

什么是工具调用?

LLM 工具调用是指大语言模型在生成回答时,能够识别用户需求并主动调用预定义的外部函数或 API 来获取信息或执行操作的能力。这种机制让 LLM 从纯文本生成器转变为能够与现实世界交互的智能代理。

核心优势

  1. 实时性:获取最新的数据和信息
  2. 准确性:避免模型幻觉,提供可靠的事实信息
  3. 扩展性:通过工具扩展模型能力边界
  4. 可控性:明确的函数调用过程,便于调试和监控

工具调用流程详解

完整流程图

---
id: f662e516-56f0-46a1-a622-1438ab60949c
---
sequenceDiagram
participant User as 用户
participant App as 应用程序
participant LLM as 大语言模型
participant Tool as 外部工具/API

User->>App: 发送查询请求
App->>LLM: 用户请求 + 工具函数描述(JSON对象)
LLM->>App: 选择的工具函数 + 工具调用参数
App->>Tool: 匹配实际工具函数填充参数并调用
Tool->>App: 获取实际工具函数执行结果
App->>LLM: 用户请求 + 工具函数执行结果
LLM->>App: 生成最终回答
App->>User: 返回完整回答

大模型工具调用基础原理

详细步骤分析

1. 初始请求阶段

用户向系统发送查询请求,应用程序将请求连同预定义的函数工具描述一起发送给大模型。

{
"model": "deepseek-chat",
"messages": [
{
"role": "system",
"content": "你是一个专业的助手,可以提供天气信息和搜索功能"
},
{
"role": "user",
"content": "今天上海的天气怎么样?"
}
],
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的天气预报信息",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名称"
}
},
"required": ["location"]
}
}
}
],
"tool_choice": "auto"
}

2. 模型决策阶段

大模型分析用户请求,识别(根据工具的描述文档,然后自行决定调用需要调用哪些工具)出需要调用天气查询工具,并返回结构化的工具调用指令(函数名 + 与之匹配的参数):

{
"choices": [
{
"message": {
"role": "assistant",
"content": null,
"tool_calls": [
{
"id": "call_123",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"location\": \"上海\"}"
}
}
]
}
}
]
}

3. 工具执行阶段

应用程序解析工具调用指令,执行实际的 API 调用:

// 解析工具调用参数
let args: Value = serde_json::from_str(
call["function"]["arguments"].as_str().unwrap()
)?;
let location = args["location"].as_str().unwrap();

// 调用实际的天气 API
let weather_info = amap::get_weather(location, &amap_key).await?;

4. 结果整合阶段

将工具执行结果反馈给大模型,生成最终的用户友好回答:

{
"model": "deepseek-chat",
"messages": [
{
"role": "system",
"content": "你是一个专业的天气顾问,请根据天气数据给出详细建议"
},
{
"role": "assistant",
"content": null,
"tool_calls": [...]
},
{
"role": "tool",
"content": "天气数据JSON",
"tool_call_id": "call_123"
}
]
}

Rust 实现案例分析

项目架构概览

我们的项目采用模块化设计,主要包含以下组件:

src/
├── main.rs # 主程序入口和聊天逻辑
├── tools/ # 工具模块
│ ├── mod.rs # 工具注册和统一接口
│ ├── amap.rs # 高德天气 API 工具
│ └── serper.rs # Google 搜索 API 工具

核心代码实现

1. 主聊天逻辑

async fn chat(user_query: &str) -> Result<(), Box<dyn std::error::Error>> {
let api_key = env::var("DEEPSEEK_API_KEY").unwrap();
let endpoint = env::var("DEEPSEEK_API_URL").unwrap();

// 构建包含工具定义的请求
let body = json!({
"model": env::var("MODEL_NAME").unwrap(),
"messages": [
{
"role": "system",
"content": "你是一个专业的助手,可以提供天气信息和搜索功能"
},
{"role": "user", "content": user_query}
],
"tools": get_tools_definition(),
"tool_choice": "auto", // 使用`auto`让大模型自行决定使用哪些工具
});

// 发送初始请求
let response = reqwest::Client::new()
.post(&endpoint)
.header("Authorization", format!("Bearer {}", api_key))
.json(&body)
.send()
.await?
.json::<Value>()
.await?;

// 处理工具调用
if let Some(tool_calls) = response["choices"][0]["message"]["tool_calls"].as_array() {
for call in tool_calls {
let tool_result = handle_tool_call(call).await?;

// 将结果反馈给模型生成最终回答
let final_response = generate_final_response(&api_key, &endpoint, call, &tool_result).await?;

info!("最终回答: {}", final_response["choices"][0]["message"]["content"]);
}
}

Ok(())
}

2. 工具注册系统

为了实现高内聚、低耦合的设计,我们创建了一个统一的工具注册系统:

// 工具处理结果结构
pub struct ToolResult {
pub content: String,
pub system_prompt: String,
}

// 工具处理函数类型
type ToolHandler = Box<dyn Fn(&Value) -> Pin<Box<dyn Future<Output = Result<ToolResult, Box<dyn std::error::Error>>> + Send + Sync>> + Send + Sync>;

// 工具注册表
struct ToolRegistry {
tools: HashMap<String, ToolHandler>,
}

impl ToolRegistry {
fn new() -> Self {
let mut tools = HashMap::new();

// 注册天气查询工具
let weather_handler: ToolHandler = Box::new(|call: &Value| {
let call = call.clone();
Box::pin(async move {
let args: Value = serde_json::from_str(call["function"]["arguments"].as_str().unwrap())?;
let location = args["location"].as_str().unwrap();

let amap_key = env::var("AMAP_API_KEY").unwrap();
let weather_info = amap::get_weather(location, &amap_key).await?;

Ok(ToolResult {
content: serde_json::to_string(&weather_info)?,
system_prompt: "你是一个专业的天气顾问,请根据获取到的天气数据给出详细的穿衣建议".to_string(),
})
})
});
tools.insert("get_weather".to_string(), weather_handler);

// 注册搜索工具
let search_handler: ToolHandler = Box::new(|call: &Value| {
let call = call.clone();
Box::pin(async move {
let args: Value = serde_json::from_str(call["function"]["arguments"].as_str().unwrap())?;
let query = args["query"].as_str().unwrap();

let search_results = serper::search(query).await?;
let formatted_results = serper::format_results(&search_results, 3);

Ok(ToolResult {
content: formatted_results,
system_prompt: "你是一个专业的信息分析师,请根据搜索结果给出准确、简洁的回答".to_string(),
})
})
});
tools.insert("search".to_string(), search_handler);

Self { tools }
}
}

// 统一的工具调用处理函数
pub async fn handle_tool_call(call: &Value) -> Result<ToolResult, Box<dyn std::error::Error>> {
let tool_name = call["function"]["name"].as_str().ok_or("无效的工具名称")?;
let registry = get_registry();

match registry.get_handler(tool_name) {
Some(handler) => handler(call).await,
None => Err(format!("未知的工具调用: {}", tool_name).into()),
}
}

3. 天气查询工具实现

pub async fn get_weather(location: &str, api_key: &str) -> Result<WeatherResponse, reqwest::Error> {
// 第一步:获取城市行政编码
let district_url = format!(
"https://restapi.amap.com/v3/config/district?key={}&keywords={}&subdistrict=0&extensions=all",
api_key, location
);

let district_resp: DistrictResponse = reqwest::get(&district_url).await?.json().await?;

if district_resp.status != "1" || district_resp.districts.is_empty() {
return Err(reqwest::get("http://error").await.unwrap_err());
}

let adcode = &district_resp.districts[0].adcode;

// 第二步:获取天气数据
let weather_url = format!(
"https://restapi.amap.com/v3/weather/weatherInfo?key={}&city={}&extensions=all&output=json",
api_key, adcode
);

let weather_resp: WeatherResponse = reqwest::get(&weather_url).await?.json().await?;

if weather_resp.status != "1" {
return Err(reqwest::get("http://error").await.unwrap_err());
}

Ok(weather_resp)
}

4. 搜索工具实现

pub async fn search(query: &str) -> Result<Vec<SearchResult>, reqwest::Error> {
let api_key = env::var("SERPER_API_KEY").expect("SERPER_API_KEY must be set");
let client = reqwest::Client::new();

let response = client
.post("https://google.serper.dev/search")
.header("X-API-KEY", api_key)
.header("Content-Type", "application/json")
.json(&serde_json::json!({
"q": query,
"type": "search"
}))
.send()
.await?
.json::<SearchResponse>()
.await?;

let results = response
.organic
.into_iter()
.map(|result| SearchResult {
title: result.title,
link: result.link,
snippet: result.snippet,
})
.collect();

Ok(results)
}

pub fn format_results(results: &[SearchResult], max_results: usize) -> String {
let results = results
.iter()
.take(max_results)
.enumerate()
.map(|(i, result)| {
format!(
"{}. {}\n 链接: {}\n 摘要: {}\n",
i + 1,
result.title,
result.link,
result.snippet
)
})
.collect::<Vec<_>>()
.join("\n");

if results.is_empty() {
"没有找到相关结果。".to_string()
} else {
results
}
}

代码架构设计

设计原则

我们的实现遵循以下软件设计原则:

  1. 高内聚:相关功能集中在同一模块中
  2. 低耦合:模块间依赖关系最小化
  3. 模块化:清晰的模块边界和职责分离
  4. 可扩展性:易于添加新的工具和功能

模块职责划分

  • main.rs:负责主程序逻辑和 LLM 交互
  • tools/mod.rs:工具注册表和统一接口
  • tools/amap.rs:天气查询功能实现
  • tools/serper.rs:搜索功能实现

异步编程模式

项目大量使用 Rust 的异步编程特性:

// 使用 tokio 运行时
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 异步函数调用
chat(user_query).await?;
Ok(())
}

// 异步工具处理函数
type ToolHandler = Box<dyn Fn(&Value) -> Pin<Box<dyn Future<Output = Result<ToolResult, Box<dyn std::error::Error>>> + Send + Sync>> + Send + Sync>;

最佳实践与优化

1. 错误处理

使用 Rust 的 Result 类型进行优雅的错误处理:

pub async fn handle_tool_call(call: &Value) -> Result<ToolResult, Box<dyn std::error::Error>> {
let tool_name = call["function"]["name"].as_str().ok_or("无效的工具名称")?;
// ... 其他逻辑
}

2. 环境变量管理

使用 dotenv 管理敏感配置:

use dotenv::dotenv;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
dotenv().ok();
let api_key = env::var("DEEPSEEK_API_KEY").unwrap();
// ...
}

3. 日志记录

使用 tracing 进行结构化日志记录:

use tracing::{Level, info};

info!("用户查询: {}", user_query);
info!("工具调用参数: {}", serde_json::to_string_pretty(&args).unwrap());

4. 性能优化

  • 使用连接池复用 HTTP 连接
  • 实现请求缓存机制
  • 并发处理多个工具调用

5. 安全考虑

  • API 密钥安全存储
  • 输入参数验证
  • 请求频率限制

扩展功能建议

1. 添加更多工具

// 数据库查询工具
let db_handler: ToolHandler = Box::new(|call: &Value| {
// 数据库查询逻辑
});

// 文件操作工具
let file_handler: ToolHandler = Box::new(|call: &Value| {
// 文件操作逻辑
});

2. 实现工具链

支持多个工具的串联调用,实现复杂的业务流程。

3. 添加缓存机制

use std::collections::HashMap;
use std::sync::Arc;
use tokio::sync::Mutex;

struct CacheManager {
cache: Arc<Mutex<HashMap<String, String>>>,
}

4. 监控和指标

添加工具调用的性能监控和成功率统计。

总结

大模型工具调用是构建智能 AI 应用的关键技术。通过本文的详细分析,我们了解了:

  1. 工具调用的基本原理:从用户请求到最终回答的完整流程
  2. 实现架构设计:模块化、可扩展的代码组织方式
  3. 具体代码实现:使用 Rust 构建高性能的工具调用系统
  4. 最佳实践:错误处理、日志记录、性能优化等方面的建议

这种架构不仅提供了良好的代码组织结构,还为后续功能扩展奠定了坚实基础。随着大模型技术的不断发展,工具调用将成为构建复杂 AI 应用的标准模式。

相关资源


本文展示了如何使用 Rust 构建支持工具调用的大模型应用。如果您对实现细节有疑问,欢迎查看完整的项目源码或提出 Issue 讨论。

鱼雪

引言

在人工智能快速发展的今天,如何让 AI 系统提供更准确、更全面的回答成为一个关键挑战。 本文将深入介绍一种创新的技术方案 - RAG-Fusion,这是对传统检索增强生成(RAG)技术的全新突破。

RAG-Fusion 是什么?

RAG-Fusion 是一种结合了检索增强生成(RAG)和倒数排名融合(RRF)的创新技术。它通过以下方式工作:

  1. 接收用户的原始查询
  2. 利用大语言模型生成多个相关的搜索查询
  3. 对每个查询进行向量搜索获取相关文档
  4. 使用 RRF 算法对文档进行重新排序和融合
  5. 将重排序后的文档连同查询一起送入语言模型生成最终答案

与传统 RAG 的对比

传统的 RAG 系统工作流程相对简单:

  1. 将产品文档转换为文本并创建向量嵌入
  2. 收到查询后直接进行向量搜索
  3. 将检索到的文档和查询一起送入语言模型生成答案

相比之下,RAG-Fusion 通过生成多个查询视角和文档重排序,能够提供更全面和准确的答案。

实际应用效果

在英飞凌(Infineon)的实践中,RAG-Fusion 在以下三个场景都展现出了优秀的表现:

1. 工程师技术支持

对于工程师的技术问题,系统不仅能提供准确答案,还能补充相关的技术背景和使用建议。例如在回答产品 IP 防护等级问题时,除了给出具体数值,还会解释其含义和应用场景。

2. 销售团队支持

系统能够结合产品知识和市场洞察,为销售人员提供完整的销售策略建议,包括:

  • 产品优势分析
  • 目标客户定位
  • 竞争力对比
  • 销售要点提炼

3. 客户咨询服务

在处理客户咨询时,系统可以:

  • 准确理解客户需求
  • 提供产品适用性分析
  • 给出专业的应用建议
  • 解答常见问题

技术优势与挑战

优势:

  1. 答案全面性: 通过多角度查询提供更完整的信息
  2. 准确性提升: 文档重排序确保最相关信息优先使用
  3. 知识整合: 可以结合预训练知识和专业文档

挑战:

  1. 响应时间: 比传统 RAG 慢约 1.77 倍
  2. 查询相关性: 需要确保生成的查询与原始意图相符
  3. 评估方法: 缺乏有效的自动化评估框架

未来展望

RAG-Fusion 技术还有很大的发展空间:

  1. 多语言支持: 扩展到日语、中文等多语种服务
  2. 性能优化: 改进实时响应速度
  3. 质量保证: 开发自动化质量评估体系
  4. 场景拓展: 探索更多垂直领域应用

结论

RAG-Fusion 代表了 AI 问答系统的一个重要进步。 虽然在响应速度等方面还有待优化,但其在准确性和全面性上的优势使其成为构建下一代智能问答系统的重要选择。

参考资料

鱼雪

近年来,检索增强生成(RAG)作为一种利用外部知识增强大型语言模型(LLM)的方法变得越来越流行。

原始RAG及其工作过程

RAG使得LLM可以在以前未见过的数据上使用,而无需进行微调。 此外,通过利用外部语料库的独立检索组件,自然语言形式的知识可以完全卸载LLM的参数化内存。

RAG 工作过程:

  • 查询编码器:将用户查询编码成适合搜索文本段落或文档数据库的数值表示。
  • 检索器:使用查询编码器生成的向量搜索索引文档的外部数据库。检索单据中基于所选搜索算法的前 K 个最相关文档。
  • 生成器:大型语言模型根据检索器选择的文档和输入查询生成输出。

LongRAG背后的直觉

在《LongRAG: Enhancing Retrieval-Augmented Generation with Long-context LLMs》一文中, 滑铁卢大学的研究人员通过对检索过程进行修改提出了以下建议:

  • 将每个文档的标记大小从原始RAG中的100个标记扩展到LongRAG中的4,000个标记。
  • 将焦点从在原始RAG中准确定位与用户查询相关的精确信息转移到在LongRAG中选择包含相关但未必精确信息的文档。

传统RAG与LongRAG

这样做的原因是从检索精确、小片段信息过渡到选择更大、上下文更丰富且语义完整的片段。 这种调整减轻了检索员的负担,并更均匀地分配了检索员和生成器之间的任务。 因此,LongRAG充分利用了最新LLM的扩展上下文能力,它们作为生成器, 从最近对处理长上下文的显著增强中受益。

LongRAG如何运作:架构

LongRAG 对原始 RAG 进行了三项架构更新:

  • 长检索单元LongRAG 使用了检索单元,其范围包括整个文档或一组文档, 而不是从大型文档中截取 100 个标记,这遵循了论文中提出的Group Documents Algorithm。 此次单元大小增加到 4K,将维基百科语料库从 22M 减少到 600K 的检索单元。
  • 长检索器:为进一步处理识别长检索单元。
  • 长读者(生成器):从长检索单元中提取答案。这是一个以用户查询及长检索单元为提示的 LLM。

LongRAG示例

这是 LongRAG 逐步运作的方式

  1. Retrieval(在原始论文中命名为Long Retriever):

    • 编码: 两个编码器将输入问题和检索单元分别映射到一个d维向量。
    • 形成长的检索单元: 分组文档算法涉及创建相关文档的组。每个文档基于连接性与相关文档分组,不超过指定的最大组大小。这种分组能够更有效地检索相关信息,因为相关文档一起处理。
    • 相似性搜索: 编码步骤中的向量用于计算问题和检索单元之间的相似性,当选择相关的长检索单元时。
    • 结果汇总: 最相关的顶部组被汇总,形成对查询的全面响应,根据其大小调整包括的组数量。
  2. 生成(原始论文中称为 Long Reader):LLM(长期记忆模型)使用用户查询和来自检索步骤的聚合结果生成最终输出。 长文阅读器中使用的LLM应能处理长文本,并且不展现出过度的位置偏见。

LongRAG的优势

LongRAG 通过将维基百科处理成 4,000 个令牌单位来优化检索,将数量从 2,200 万减少到 60 万。 单位大小的增加意味着减少了许多单位的召回需求,避免了截断,并保留了更多上下文。 更长的单位有助于通过整合全面信息直接回答复杂问题。

LongRAG 框架实现了令人印象深刻的提取分数,并且与最先进模型具有可比的结果, 无需额外训练,展示了将 RAG 与长上下文 LLMs 结合的效率和潜力。

以下是对LongRAG实施的一些关键结果:

  • Recall@1:在自然问题(NQ)数据集上提高至71%,而之前为52%
  • Recall@2:在HotpotQA数据集(完全维基)上提高至72%,而之前为47%
  • Exact Match(EM):在NQ上取得62.7%的EM得分,在HotpotQA(完全维基)上为64.3%, 表现与最先进模型不相上下。

资源

鱼雪

我们讨论RAG的局限性,并探讨图RAG方法的优势,同时澄清术语并提供资源列表。

当AI悲观主义者谈论末日和AI接管时,他们常常忽略即使是最先进的语言模型也难以基于复杂的连接进行推理和得出结论。 另一个问题是训练或微调(适应您的数据)大型语言模型(LLMs)的成本极高。

图RAG检索增强生成)方法解决了这两个问题,并且是我们之前讨论的原始RAG技术的升级版。让我们来探索这些图表!

在今天的讨论中,我们将涵盖:

  1. 回顾原始RAG的基础知识
  2. 原始RAG的局限性
  3. 图RAG方法登场
  4. 图RAG特别擅长什么?
  5. 术语澄清:“图RAG”与“知识图谱RAG”
  6. 额外资源

回顾原始RAG

让我们简要回顾一下RAG背后的关键概念。

此方法允许在不需要微调的情况下使用LLM处理之前未见过的数据

在RAG设置中,数据以向量形式存储在外部数据库中

使用RAG,LLM从中检索必要的信息,并根据检索到的事实回答用户查询

来源于RAG原始论文

RAG通过避免数据更新时的持续微调节省资源,同时也使外部数据库的动态数据控制变得容易

原始RAG的局限性

原始RAG方法使用向量相似性作为搜索技术

这被认为是一项强大的技术,改变了我们访问信息的方式,并且是传统搜索引擎的宝贵更新。

然而,它也有局限性,尤其是在理解向量相似性的本质时

Pinecone的向量嵌入

您可能还记得我们之前探讨过变压器时提到的向量或词嵌入。

这些嵌入是单词的密集向量表示,捕捉了语义和句法关系

它们使语言模型能够通过将单词表示为向量空间中的点来量化语义相似性,从而学习单词之间的关系

向量相似性是一种用于衡量关系的指标,计算方法包括欧几里得距离、余弦相似性和点积相似性,每种方法都有其优缺点。

然而,向量相似性仅根据其与用户查询的相似性找到答案。

在需要结合各种信息或答案不明确存在于单个文档中的情况下, 这种方法在更复杂的系统中表现出局限性,导致原始RAG模型的限制。

图RAG方法的作者写道: “RAG在针对整个文本语料库的全局问题(如‘数据集的主要主题是什么?’)上失败, 因为这本质上是一个面向查询的摘要任务,而不是明确的检索任务。”

同时,先前的QFS方法无法扩展到典型RAG系统索引的大量文本。

图RAG方法有效解决了更复杂的查询问题。

图RAG方法登场

图RAG方法由微软研究人员于2024年4月提出。

原始RAG不同,此方法将数据组织成图结构,表示文本数据及其相互关系

图RAG演示图片

图RAG的工作原理如下:

  1. 源文档 → 文本块:首先将外部数据库中的原始文本分割成较小的、可管理的块。
  2. 文本块 → 元素实例:使用LLM和针对数据库领域量身定制的提示,图RAG从每个文本块中识别并提取实体(如人、地点、组织)及其关系。
  3. 元素实例 → 元素摘要:使用另一组LLM提示生成每个实体和关系的简短描述,以总结初始原始文本数据。
  4. 元素摘要 → 图社区:使用总结的实体和关系构建知识图谱,其中节点表示实体,边表示关系。然后对该图应用社区检测算法(如Leiden算法),以识别紧密相关节点的社区。
  5. 图社区 → 社区摘要:然后独立总结每个检测到的社区,生成其代表的主题和信息的综合概述。
  6. 社区摘要 → 社区答案 → 全局答案当用户提交查询时
  • 首先根据内容和与查询的关系识别相关的社区摘要。
  • 使用LLM为每个相关社区摘要独立生成中间答案。
  • 然后汇编这些中间答案,评估其相关性和帮助性(有时由LLM评分),并综合成最终的全局答案返回给用户。

通过基于图的索引和社区聚焦的摘要,图RAG是RAG系统中处理面向查询的摘要的宝贵补充

图RAG特别擅长什么?

使用图RAG的主要优势包括:

  1. 增强的相关性图RAG通过将数据结构化为知识图谱,识别与用户查询最相关的信息簇。
  2. 高效性:图RAG根据图结构搜索相关数据部分,相比于每次查询都处理整个数据集,减少了计算工作量
  3. 全面的响应系统可以综合来自多个文档的信息,创建比单一文档响应更全面且上下文丰富的答案。
  4. 可扩展性:通过利用基于图的结构,图RAG能够高效处理大规模数据集,使其在大信息库中既可扩展又有效。
  5. 动态学习:随着更多数据添加或更新到图中,图RAG可以适应和改进其响应,适用于动态和不断演变的数据集

术语澄清:“图RAG”与“知识图谱RAG”

“图RAG”和“知识图谱RAG”这两个术语经常互换使用,

因为它们都指利用知识图谱增强AI响应准确性和相关性的检索增强生成(RAG)方法。

实际上,大多数利用图结构进行检索的RAG系统本质上都在使用某种形式的知识图谱,即使它没有明确标示为知识图谱

关键区别在于所使用的图表示的复杂性和正式程度

额外资源

原始资源

图RAG于2024年4月发布,并承诺很快将在官方网站和GitHub上作为开源项目发布。

实现

虽然原始实现尚未可用,但有一些关于如何使用知识图谱与LLM结合的教程:

要点总结

1. 原始RAG方法

  • 定义: RAG(检索增强生成)方法允许在不进行微调的情况下使用LLM处理新数据。数据以向量形式存储在外部数据库中,LLM根据检索到的信息回答用户查询。
  • 优点: 避免持续微调,便于动态数据控制。

2. 原始RAG的局限性

  • 向量相似性: 使用向量相似性进行搜索,但只能根据与用户查询的相似性找到答案,难以处理需要综合多种信息的复杂系统。
  • 全局问题: 无法处理针对整个文本语料库的全局问题,例如数据集的主要主题。

3. 图RAG方法

  • 提出者: 微软研究人员,2024年4月。
  • 工作原理:
    1. 文本分块: 将原始文本分割为较小的块。
    2. 元素实例: 识别并提取每个文本块中的实体及其关系。
    3. 元素摘要: 生成实体和关系的简短描述。
    4. 图社区: 构建知识图谱,应用社区检测算法识别社区。
    5. 社区摘要: 独立总结每个社区,生成综合概述。
    6. 查询响应: 根据用户查询识别相关社区摘要,生成中间答案并综合成全局答案。

4. 图RAG的优势

  • 增强的相关性: 通过知识图谱识别与用户查询最相关的信息簇。
  • 高效性: 根据图结构搜索相关数据部分,减少计算工作量。
  • 全面的响应: 综合来自多个文档的信息,创建全面且上下文丰富的答案。
  • 可扩展性: 处理大规模数据集,适用于大型信息库。
  • 动态学习: 适应和改进响应,适用于动态和不断演变的数据集。

5. 术语澄清

  • 图RAG与知识图谱RAG: 这两个术语常常互换使用,都指利用知识图谱增强AI响应准确性和相关性的RAG方法。关键区别在于所使用的图表示的复杂性和正式程度。

图RAG方法通过基于图的索引和社区聚焦的摘要,

解决了原始RAG方法的局限性,为处理面向查询的复杂摘要提供了高效、可扩展和动态的解决方案。

图RAG总结脑图

鱼雪

来自常见信息来源的有趣新闻和每周最佳研究论文列表

一场新的工业革命正在展开,由AI工厂的兴起所驱动。 这些设施正在改变各个层级的计算,从庞大的数据中心到日常使用的笔记本电脑,很可能很快就会转变为AI笔记本电脑。 在2024年Computex大会上,Jensen Huang强调了这种转变, 指出需要整个行业的合作:硬件供应商、软件开发商和企业需要共同努力,从数据中心转型为AI工厂。 Jensen Huang表示,这种转变不仅仅是技术上的,还涉及到重塑整个计算领域。他通常对自己的言论非常自信。

Nvidia的预先简报会上,高管们强调了AI PC的重大关注点,这项技术是Nvidia在六年前(2018年)引入的。 这个创新在游戏、内容创作和软件开发等领域引发了革命性变化。

AI PC在过去六年间并未广泛讨论,但现在——得益于微软和Nvidia——它们正在变得无处不在,并与关于新工业革命的对话一起进行。 尽管我们仍处在起步阶段,但确实需要回顾历史。 2018年和2019年初,另一重大事件震撼了机器学习社区。 这一事件促成了突破性的里程碑:ChatGPT。让我们一起回顾这一时间线:

  • 2018年,生成预训练变换模型(GPT)的创建引发了—>
  • 2019年2月,GPT-2——一个拥有15亿参数的大型语言模型。 由于担心滥用,GPT-2未完全公开,仅提供了一个小得多的模型供研究人员实验,并附有一篇技术论文,随后引发了—>
  • 2020年,GPT-3和论文《语言模型是少量样本学习者》,进而演变为—>
  • 2022年,GPT-3.5和其微调版本InstructGPT,并附有研究论文《通过人类反馈训练语言模型遵循指令》。
  • 2022年11月,ChatGPT。其训练方式与InstructGPT非常相似, 其背后的魔力基于研究论文《基于人类偏好的深度强化学习》,这种技术称为基于人类反馈的强化学习(RLHF)。

现为Anthropic联合创始人、前OpenAI政策主管的Jack Clark今天反思了GPT-2的发布,他形容这是“时光旅行的一个例子”。 2019年,OpenAI因担心滥用而决定不完全公开GPT-2,这一决定在AI社区引发了热烈辩论。这场辩论的核心在于平衡创新与伦理责任。 批评者认为,保留模型可能会减缓科学进步,而支持者赞扬OpenAI的谨慎态度。

Jack认为,偏离常规可能引发反作用。 通过逐步发布GPT-2OpenAI无意中激发了开发开源GPT-2级系统的兴趣,因为其他人希望填补这一空白。 如果GPT-2一开始就完全发布,可能会有更少的复制,因为更少的人会感到有必要证明OpenAI的错误。

在Clark对那段动荡时期的回忆中,有许多有趣的问题。虽然值得全文阅读,但以下是一些值得注意的引言:

  • “即使你能想象某事在技术上是可能的,你也不太可能正确预测它到来的时间或其严重性。”

  • “我逐渐相信在政策上‘一点点就能产生巨大影响’——比起对特定未来设计的想法进行自信的押注, 提倡那些在所有未来中你认为是稳健的好想法要好得多。”

  • “我们应该害怕这些监管思想所编码的权力结构,并且我们应该将它们视为本身具有危险性的东西。 我担心,与长期AI安全和AGI愿景一致的AI政策社区因为赋予未来AGI毁灭人类极高的概率, 就认为这可以证明当前的任何行动是正当的。”

  • “五年后,因为像GPT-2这样的事情,我们正处于AI部门的大规模工业化之中,以响应这些想法的规模化。 现在,有一种强烈的似曾相识感——人们(包括我)正在关注像Claude 3GPT-4这样的模型, 并对这些系统的技术含义以及进一步扩展它们的含义发表自信的言论,有些人正在利用这些含义来证明在当前实施越来越严格的政策制度的必要性。 我们是否在重复五年前犯下的错误?”

我们没有答案,但可以对这场由扩展定律推动、现在由AI工厂推动的新工业革命发表一些自信的言论。 像Jensen Huang这样的人认为,我们正处于重新定义技术可能性的时刻。 你怎么看?要看到未来的大局,我们——一如既往——鼓励你了解过去。

附加阅读: 甚至像Andrej Karpathy那样与过去玩耍:他刚刚发布了一种快速且成本效益高的方法来训练GPT-2模型。 使用8xA100 GPU训练一个小型GPT-2(124M参数)需要90分钟和20美元。 350M版本需要14小时和200美元,而完整的1.6B模型需要一周和2500美元。 该方法使用Karpathy的llm.c库,它利用纯C/CUDA进行高效LLM训练,无需大型框架。

来自常见信息来源的新闻

2024年初的AI现状

  • 根据麦肯锡的说法,生成式AI的采用正在激增,开始产生可观的价值。

OpenAI的:威胁行为者、安全委员会和回归机器人学

  • OpenAI发布了一份详细报告,强调其AI模型在俄罗斯、中国、伊朗和以色列威胁行为者的隐蔽影响行动中被使用。 这些行动旨在操纵公众舆论和政治结果,但尽管内容生成增加,但在吸引真实受众方面效果不佳。 作为回应,OpenAI实施了诸如禁止账户、分享威胁指标和加强安全协议等措施。 值得注意的活动包括“Bad Grammar”(俄罗斯)、“Doppelganger”(俄罗斯)、“Spamouflage”(中国)、“IUVM”(伊朗)和“Zero Zeno”(以色列)。 这强调了AI在进行和防御隐蔽信息操作中的双重角色,突显了全面防御策略的必要性。

  • 他们还成立了一个安全和安保委员会,以解决关键的安全问题。 该委员会由Bret Taylor、Adam D’Angelo、Nicole Seligman和Sam Altman领导, 负责在90天内提出安全建议,并咨询网络安全专家。 这些建议将公开分享,以确保OpenAI项目的强健安全和安保措施。

  • 其他新闻中,OpenAI重新启动了其机器人团队,并正在招聘。 回顾过去(也是2018年):学习灵巧的手部操作。 当时,他们开发了一个名为Dactyl的系统,该系统完全在模拟中训练, 但已被证明能够解决不依赖物理精确建模的现实任务。

Claude 3增强工具集成

  • Claude 3模型系列现在支持工具使用, 能够与Anthropic Messages API、Amazon Bedrock和Google Cloud的Vertex AI上的外部工具和API进行交互。

NVIDIA的新AI芯片:Vera Rubin

  • 在Computex大会上,NVIDIA CEO Jensen Huang在主题演讲中宣布了名为Vera Rubin的AI芯片(以发现暗物质的美国天文学家命名),计划于2026年推出。 该新芯片将配备为AI应用设计的最先进的GPU和CPU。 NVIDIA计划每年升级其AI加速器,从2025年的Blackwell Ultra开始,重点在于成本和能源效率。

  • 他们还推出了地球气候数字双胞胎,能够不仅预测而且了解我们的星球及其气候的现状。

Mistral AI推出Codestral

  • Mistral AI的研究人员推出了Codestral,一个22B开源权重的生成式AI模型,专为代码生成而设计。 支持超过80种编程语言,Codestral在代码补全和测试编写等任务中表现优异,在长距离代码库级别代码补全方面优于其他模型。 通过HuggingFace提供用于研究和测试的访问,Codestral还与VSCode和JetBrains等流行工具集成,提升开发者生产力。

最新的研究论文,按类别分类以便查阅

我们的前三名

法国人了解他们的醒酒 → Hugging Face推出🍷 FineWeb

在博文“🍷 FineWeb:醒酒网络以获取最优质的文本数据规模”中, 研究人员介绍了一个从CommonCrawl快照中提取的15万亿标记的大型数据集。 FineWeb专为LLM预训练设计,通过细致的去重和过滤,强调高质量数据。 他们还开发了FineWeb-Edu,一个优化教育内容的子集,在教育基准

上表现优于现有数据集。他们还使这篇博文成为病毒式传播! 一如既往,向Hugging Face致敬,感谢他们对开放、透明方法的关心, 创建大规模高质量数据集用于LLM训练,以及对葡萄酒的热爱(但这只是一个假设)。

Mamba-2来了!变压器是SSM**:通过结构化状态空间对偶性实现通用模型和高效算法**

来自普林斯顿大学和卡内基梅隆大学的研究人员揭示了变压器和状态空间模型(SSM)之间的深层理论联系。 他们引入了一个名为结构化状态空间对偶性(SSD)的框架,表明SSM可以像变压器一样高效。 他们设计了Mamba-2,一个精细的SSM架构,其速度是前身Mamba的2-8倍(了解Mamba)。 Mamba-2在语言建模任务中仍与变压器竞争,同时优化了内存和计算效率。

视觉语言模型(VLMs)简介

来自Meta、Mila、MIT等知名机构的研究人员介绍了VLMs,解释了它们的功能、训练和评估。 他们强调了在对齐视觉和语言方面的挑战,例如理解空间关系和属性。 论文将VLMs分类为不同的家族,基于对比、掩蔽和生成技术等训练方法。 它还讨论了使用预训练的骨干来增强模型性能,并探索了将VLMs扩展到视频数据以改善时间理解。

AI模型增强

  • 变压器可以通过正确的嵌入进行算术 - 使用新颖的嵌入技术提高变压器的算术能力 →阅读论文

  • Trans-LoRA:数据无关的可迁移参数高效微调 - 提高参数高效模型的可迁移性,无需原始数据 →阅读论文

  • LOGAH:使用图超网络以1/100参数预测774百万参数变压器 - 利用图网络高效预测大型模型参数 →阅读论文

  • 2BP:两阶段反向传播 - 提出一个两阶段的反向传播过程,以提高计算效率 →阅读论文

  • LLAMA-NAS:用于大型语言模型的高效神经架构搜索 - 使用神经架构搜索找到高效的模型配置 →阅读论文

  • VeLoRA:使用秩-1子标记投影进行内存高效训练 - 通过创新的数据投影技术减少训练期间的内存需求 →阅读论文

  • Zipper:融合模态的多塔解码器架构 - 使用多塔架构在生成任务中高效集成不同模态 →阅读论文

  • NV-Embed:用于通用嵌入模型训练的改进技术 - 提高嵌入训练的质量,以增强检索和分类任务 →阅读论文

  • JINA CLIP:你的CLIP模型也是你的文本检索器 - 使用对比训练提高CLIP模型在文本-图像和文本-文本检索任务中的表现 →阅读论文

AI在多模态和专门任务中的应用

  • Matryoshka多模态模型 - 通过嵌套视觉标记提高多模态模型的效率 →阅读论文

  • Zamba:一个紧凑的7B SSM混合模型 - 结合状态空间和变压器模型,创建一个紧凑高效的混合模型 →阅读论文

  • 相似性不是全部:赋予检索增强生成系统多层次思维 - 在检索增强生成系统中整合更深的上下文理解 →阅读论文

AI伦理、隐私和对齐

  • 离线正则化强化学习用于LLM对齐 - 通过强化学习对齐AI行为与人类意图 →阅读论文

  • 价值激励偏好优化:统一的在线和离线RLHF方法 - 提出一种适用于在线和离线环境的人类反馈学习新方法 →阅读论文

  • 鹦鹉:使用语义变量高效提供LLM应用服务 - 利用应用级信息优化语言模型应用服务 →阅读论文

  • 创新与隐私的交叉点:生成式AI的私有合成数据 - 探索在AI训练中维护隐私的技术 →阅读论文

AI的认知能力

  • LLMs在高级心理理论任务中达到成人水平 - 评估大型语言模型执行复杂认知任务的能力,比较其与人类的表现 →阅读论文
鱼雪