拉巴力的纸皮箱


  • 首页

  • 标签

  • 归档

  • 关于

  • 搜索

使用Java调用Rust构建的动态库

发表于 2025-03-23

近期帮朋友做一个需求,需要将某个Rust项目的一部分功能移植到Java中,使Java应用能使用

方案1: 直接将Rust翻译成Java代码

前置准备:将Rust项目跑通,方便通过debug对照执行细节,从而一步步翻译成Java代码
希望借助AI的力量帮忙完成

  • 借助AI的方案如下:
    • 首先,我已经跑通了需要抽取的功能的相关测试用例
    • 然后,让AI帮忙将涉及这些功能相关的代码抽取成单独的Rust项目(结果还是很乱七八糟)
    • 大概是因为上下文内容太多的关系,AI执行任务的效果很差
    • 没办法,于是自己拆分代码,让AI软件帮忙根据代码块逐个进行转化,结果效果是好了很多,能帮助不少,不过这样效率太低,而且AI有时候也经常出错,需要自己慢慢调整
    • 看来AI目前在一次性的转化大量代码的效率和准确性还是不够
    • 本次程序员该懒就懒的宗旨,我决定另辟蹊径,采用方案2

方案2: 直接将相关功能的Rust功能编译成动态库,由Java直接调用

省去翻译代码的重复工作
需要构建不同平台的动态库
Java代码在加载前需要判断环境加载相应的动态库
使用Github Action来构建各种平台的动态库
Java端充分测试,Java8应用测试,Java9以上模块化系统是否可用测试,Windows等其他平台测试


以下由AI(ChatGPT)帮我完成的文章

使用Java调用Rust构建的动态库

引言

在最近的一个项目中,我需要将一个Rust项目中的部分功能迁移到Java应用中,供Java系统调用。为了简化过程,我决定绕过将Rust代码完全转化为Java的复杂任务,而是直接通过Rust构建动态库,再通过Java来调用。这种方法不仅减少了代码转换的工作量,还利用了Rust的高性能特点,提高了Java应用的效率。

方案1: 直接将Rust翻译成Java代码

前置准备

为了开始这个过程,我首先确保了Rust项目能够成功运行,并且通过调试工具逐步分析每个功能的执行细节。这是为了确保我可以一步步将Rust的实现逻辑转化为Java代码。

使用AI进行代码转换

最初,我尝试借助AI工具自动化地将Rust代码转换为Java代码。以下是我使用AI进行代码转换的过程:

  • 我首先跑通了相关的测试用例,确保所有需要移植的功能都能正常工作。
  • 然后,我让AI帮助抽取与这些功能相关的Rust代码,并转化成单独的Rust项目。但由于上下文过多,AI的效果并不理想,生成的代码混乱且不完整。
  • 之后,我将代码拆分成更小的部分,让AI逐一处理,虽然效果有所改善,但这种方式依旧效率低下,且AI经常会出错,导致我不得不花大量时间修正。

这一过程中,我意识到AI在一次性大规模转化代码时的准确性和效率仍然有待提升。最终,我决定放弃这条路,转而尝试另一种更直接的方案——方案2。

方案2: 直接将Rust功能编译成动态库,由Java调用

思路与优势

与其将Rust代码翻译成Java代码,我决定直接将Rust的功能编译成动态库(.dll 或 .so),然后在Java中通过JNI(Java Native Interface)调用这些动态库。这样可以避免代码翻译过程中的麻烦,并且能够充分利用Rust在性能上的优势。

构建Rust动态库

在实现这一方案时,我需要做以下几个步骤:

  1. 编译Rust代码为动态库:通过Rust的cargo工具,将Rust代码编译成适用于不同平台的动态库。这需要为每个平台生成相应的二进制文件,如Windows下的.dll,Linux下的.so,以及MacOS下的.dylib。

  2. 使用Github Actions自动化构建:为了支持多平台的动态库构建,我使用了Github Actions来自动化构建过程。这样,无论是Windows、Linux还是MacOS,都会根据需要自动生成对应的动态库,极大地简化了跨平台的构建工作。

  3. Java端加载动态库:Java通过JNI加载Rust编译出的动态库,并调用其中的函数。在加载时,Java代码会先检测当前运行环境,根据操作系统加载相应的库文件。

  4. 平台兼容性测试:为了确保Java能够顺利调用Rust动态库,我在多个平台上进行了充分的测试。这包括:

    • 在Java 8环境下进行功能测试。
    • 验证在Java 9及以上版本的模块化系统下,Java与Rust动态库的兼容性。
    • 测试在Windows、Linux和MacOS等不同平台下的表现。

方案优势

  • 减少工作量:不需要将Rust代码完全翻译为Java代码,避免了翻译过程中的复杂性和错误。
  • 高效的性能:Rust的性能优势得以保留,Java通过调用Rust动态库,可以在性能上得到显著提升。
  • 跨平台支持:通过自动化构建不同平台的动态库,Java应用能够轻松支持Windows、Linux、MacOS等多种操作系统。

总结

通过将Rust功能编译成动态库并在Java中调用,我成功地绕过了将Rust代码完全转化为Java的复杂过程,同时还能够充分利用Rust的性能优势。虽然在构建过程中涉及到平台适配和自动化构建,但这一方案的灵活性和高效性使其成为解决问题的最佳选择。对于有类似需求的开发者来说,这无疑是一个值得尝试的方案。

开源知识库系统试用

发表于 2025-02-26

帮助朋友的公司搭建内部知识库的原型
简单记录一下相关技术

  • 目前看权限管理都很不精细,只在固定角色上进行控制,用于内部团队管理仍不是很方便

  • 文档嵌入效果一般,可能要研究里面一些复杂的选项用法,或者寻求其他方案

  • 除了dify,还有很多其他开源的知识库系统,比如 Cherry Studio、MaxKB、FastGPT、AnythingLLM、Ragflow等

  • dify功能很多,anythingllm功能较少,Cherry Studio 就是个人知识库

  • 所谓的各种助手其实就是提示词模版

扩展

  • 传统RAG通常依赖单次检索,这可能不足以处理需要逐步构建上下文的复杂查询
  • 向量相似性检索依赖知识库中明确提及的信息,可能无法捕捉隐含或关系信息。相比之下,知识图谱(如GraphRAG)通过利用数据结构中的关系,能更好地处理需要全面理解数据集的全局查询

关于大模型的Prompt

发表于 2025-02-25

网上资料摘要
一些个人理解

大模型交互的核心:提示词工程

以下基于个人理解,并通过claude优化(2025-02-26)

  • 提示词(Prompt)是大模型的输入,也是调用大模型能力的接口,用以激发或引导大模型生成特定类型的回答。
  • 提示词工程的目的是尽量把任务说清楚,让大模型能充分理解我们的意图,以按照正确的方向回答问题。
  • 在不微调大模型的情况下,外部与大模型交互的唯一途径就是提示工程。即便是已经微调过的大模型,后续与其沟通的唯一途径仍是通过提供提示词,尽管微调可能改变模型对提示词的响应方式。
  • 所谓的RAG、短期记忆(对话历史)、长期记忆等功能,都是基于提示工程这一与大模型交互的路径作为切入点,建立的其他优化策略和架构。

ICIO框架(Prompt包含的要素)

  • 从原理出发 - 提示词如何影响大模型的输出
  • 核心思想,是通过明确定义任务的各个方面,来提高AI响应时的效率和准确性。
  • 在ICIO的框架的设计中,Prompt可能包含四要素:
    • Instruction(指令):这是最重要的部分,它直接告诉模型需要执行的具体任务。
    • Context(上下文/背景):上下文提供了任务执行所需的背景信息,帮助模型理解任务的情景和环境。
    • Input Data(输入数据):输入数据是模型需要处理的具体信息。
    • Output Indicator(输出指示器):输出指示器告诉模型用户期望的输出类型或格式。
  • 其中除了指令以外,其他要素都是可选的,说明指令对于大模型来说是最重要的,其他要素都是对指令的补充。
  • 优质的Prompt,可以清晰地传达用户的意图

Prompt五大框架

  • 大模型Prompt技巧全解析
  • RTF框架
    • R-Role(角色)、R-Role(角色)、F-Format(格式)
  • 思考链模式
    • 适合一些复杂的任务处理
    • 要使用这种模式,只需要在末尾添加”让我们逐步思考”即可
  • RISEN框架
    • R-Role:大模型扮演的角色
    • I-Instructions: 指示命令,和Task-任务差不多
    • S-Steps: 步骤
    • E-End Goal: 最终目标
    • N-Narrowing(Constraints): 缩小范围(约束条件),和RTF框架中的Format有异曲同工之妙
    • 该框架主要适合
      • 撰写具有特定约束的任务(例如博客文章)
      • 有明确指导方针的任务(例如商业计划)
  • RODES框架
    • R-Role: 角色、O - Objective: 目标、D - Details: 详细的细节、E - Examples: 示例、S - Sense Check: 感官检查
  • 密度链模式
    • 使用递归来创建越来越好的输出的提示,与普通提示生成的 GPT-4 摘要相比,它生成的摘要更加密集且更适合人们理解
    • 适合:总结、改进您最喜欢的提示、通过递归生成可用的长格式内容

打造高效Prompt的两大核心原则

  • 大模型Prompt技巧全解析
  • 原则一:编写明确和具体的指令
    • 策略1:使用分隔符清晰界定输入部分
    • 策略2:要求结构化输出
    • 策略3:要求模型检查条件是否满足
    • 策略4:Few-shot prompting(少样本提示)
  • 原则二:给予模型充足的思考时间
    • 策略1:明确完成任务所需的步骤
    • 策略2:引导模型在得出结论前充分思考方案

Prompt技术剖析与应用

  • 大模型Prompt技巧全解析
  • 一、零样本提示(Zero-Shot Prompting)
  • 二、少样本提示(Few-Shot Prompting)
    • 在零样本提示效果不佳时发挥作用
  • 三、思维链提示(Chain-of-Thought Prompting)
    • 与少样本提示结合,增强效果,尤其适用于算术、常识推理等任务,帮助模型更有条理地处理问题
  • 四、自我一致性(Self-Consistency)
    • 主要用于优化思维链提示中的推理路径选择
    • 核心思想是通过提供多个少样本推理示例,让模型从多样的推理结果中筛选出最一致的答案,增强模型在算术和常识推理任务中的可靠性
  • 五、生成知识提示(Generated Knowledge Prompting)
    • 主要用于解决模型在处理需要额外知识的任务时出现的局限性
    • 个人理解:一种特殊的RAG罢了
  • 六、链式提示(Prompt Chaining)
    • 将复杂任务拆解为多个子任务,通过逐个子任务生成提示并传递结果的方式来实现复杂任务的有序处理
  • 七、思维树(ToT)
    • 为了帮助模型应对复杂的探索性任务而设计
    • 通过维护一棵思维树,让模型在解决问题时能够生成和评估中间思维步骤,并结合搜索算法进行系统性探索
  • 八、检索增强生成(RAG)
    • 将信息检索与文本生成相结合,专门用于处理知识密集型任务
    • 通过检索相关文档来为模型提供额外的知识支持,从而缓解模型的“幻觉”问题
  • 九、自动推理并使用工具(ART)
    • 使模型能够自动生成包含推理步骤的程序,并在需要时调用外部工具
  • 十、自动提示工程师(APE)
    • 自动生成和筛选任务指令
    • 利用大型语言模型生成指令候选项,再依据评估分数选择最佳指令,从而提升提示生成的效率与效果
  • 十一、Active-Prompt
    • 用于解决思维链示例有效性的问题
    • 通过先查询模型生成多个答案,计算不确定度后挑选最不确定的问题由人类注释示例,再用新示例推断其他问题,从而优化模型对不同任务的适应性
  • 十二、方向性刺激提示(Directional Stimulus Prompting)
    • 通过训练策略 LM 生成引导提示,增强对模型生成结果的掌控力。例如文本摘要任务
  • 十三、PAL(程序辅助语言模型)
    • 让模型生成程序来解决问题,借助编程运行时提升解决复杂问题的能力
  • 十四、ReAct 框架
    • ReAct 框架使模型交错生成推理轨迹和操作,提升答案的可靠性与可解释性
  • 十五、自我反思(Reflexion)
    • 包含参与者、评估者和自我反思三个模型,旨在帮助模型从错误中学习并提升性能

Reference

  • 从原理出发 - 提示词如何影响大模型的输出
    • 大模型如何理解Prompt
      • 基于Transformer的解码器的大模型
      • 最核心的两层
        • 掩码多头自注意力层(Masked Multi Self Attention Layers,对应Transformer的Masked Multi-Head Attention,简称MHA)
        • 前置反馈网络层(Feed Forward Networks Layers,简称FFN)
      • Prompt会影响自注意力层对上下文信息的捕捉
      • 自注意力机制
        • 它的核心思想是模仿人类的注意力,即在处理大量信息时,能够聚焦于当前任务最相关的部分,而忽略其他不太重要的信息
  • 大模型Prompt技巧全解析
  • LLM相关技术简单了解
  • 大型语言模型的提示注入
    • 三种防范此类漏洞的方法
      • 可以在提示中添加指令
      • 使用对抗性探测器添加第二层保护
      • 对模型进行微调,使其更符合用户需求,同时提供最高级别的保护,防止提示注入和窃取

大模型应用开发AI Agent要点记录

发表于 2025-02-21

基于书籍简单记录要点

  • 从L3到L4的跨越是一个从被动到自主的分水岭,在这个跨越过程中,Agent将成为关键的驱动力


Reference

  • 《大模型应用开发 动手做AI Agent》
  • AIGC生成式人工智能的五个进阶层次
  • AIGC:生成式人工智能的5个层次
  • 2024年大模型Multi-agent多智能体应用技术:AutoGen, MetaGPT, XAgent, AutoAgents,crewAI

基于大模型的RAG应用开发要点记录

发表于 2025-02-20

基于书籍简单记录要点


  • 一种借助“外挂”的提示工程

  • 最核心的思想:给大模型补充外部知识以提高生成质量

  • 大模型的 RAG 应用中,最常见的检索方式是借助基于向量的语义检索来获得相关的数据块,并根据其相似度排序,最后输出最相关的前 K 个数据块(简称top_K)

  • 自然语言处理中用于把各种形式的信息转换成向量表示的模型叫嵌入模型

  • 基于向量的语义检索就是通过计算查询词与已有信息向量的相似度(如余弦相似度),找出与查询词在语义上最接近的信息。

  • 如果大模型是一个优秀学生,正在参加一门考试,那么 RAG 和微调的区别如下。

    • RAG:在考试时给他提供某个领域的参考书,要求他现学现用,并给出答案。
    • 微调:在考试前一天对他进行辅导,使他成为某个领域的专家,然后让他参加考试。
  • 大模型与 Prompt 并不只在最后生成结果时才需要,在 RAG 应用流程的很多阶段都需要用到它们,比如在生成摘要、查询转换、查询路由、智能体推理、响应评估等很多阶段,都需要利用设计的Prompt 来让大模型完成任务。

  • 与查询引擎相关的几个关键组件如下。

    • (1)VectorIndexRetriever:向量索引检索器。用于完成相关知识的检索,基于索引来完成,输出多个相关 Node。
    • (2)Synthesizer:响应生成器。借助大模型来完成 Prompt 组装,并根据响应生成模式的要求来生成响应结果。
    • (3)NodePostProcessor:节点后处理器。通常用于在检索完成之后,对检索器输出的 Node 列表做补充处理,比如重排序。
  • Agent 就是通过 AI 模型驱动,能够自主地理解、规划、执行,并最终完成任务的 AI 程序。Agent 与大模型的区别类似于人与大脑的区别:大脑指挥人的行动,但是只有人才是执行任务的完整体。

  • Agent 就是在大模型作为智慧大脑的基础上实现记忆(Memory)、自我规划(Planning)、使用工具(Tool)等能力,从而开发一个具有自主认知与行动能力的完全“智能体”。

  • 与 RAG 应用相比,Data Agent 具备以下能力。

    • (1)兼具 RAG 应用的数据检索与查询生成能力。
    • (2)通过观察环境与任务目标推理出完成下一个数据任务的步骤。
    • (3)通过调用外部服务工具(API)完成复杂任务,并返回执行结果。
    • (4)具备长期记忆能力(如使用向量库)与短期记忆(一次任务中的交互历史等)能力。
  • 与 RAG 应用相比,Data Agent 的主要增强之处如下。

    • (1)规划与推理出完成任务的步骤的能力。
    • (2)定义与使用工具的能力。

LlamaIndex 框架整体结构

  • (1)Core Framework:这是 LlamaIndex 的核心框架,实现了 LlamaIndex 框 架中大量可扩展的基础组件与工具组件。
  • (2)Integrations:这是在 Core Framework 基础上由官方或者第三方提供的 大量扩展组件。这些组件大大扩充了 LlamaIndex 框架的兼容能力与应用场景, 包括各种类型的数据加载器、大语言模型与嵌入模型、向量库、Agent 工具等。
  • (3)Templates:这是官方或者第三方提供的更上层的应用模板。开发者可 以基于这些模板来修改和开发自己的应用。
  • (4)Eval Datasets:评估数据集。这是一些用于测试评估的现成数据集。 一个数据集通常包含两个部分:一部分是用于开发 RAG 应用的原始知识数据 集;另一部分是用于评估 RAG 应用的测试数据集。

LlamaIndex 的向量存储索引和传统数据库(如 MySQL)的索引的区别

  • From Grok3 (2025-02-24)

传统数据库索引(如 MySQL) vs 向量存储索引

1. 传统数据库索引(B-树、哈希索引等)

  • 目的:加速精确匹配或范围查询,比如在 WHERE id = 5 或 WHERE age > 30 时快速定位数据。
  • 数据结构:通常基于 B-树、B+树 或哈希表,存储的是原始数据(如整数、字符串)的某种排序或映射。
  • 存储内容:索引本身不保存完整数据,而是指向数据库中实际数据的引用(行指针)。
  • 使用场景:结构化数据的高效检索。

2. LlamaIndex 的向量存储索引

  • 目的:支持语义相似性搜索,比如找到与“人工智能是什么”语义最接近的文档。
  • 数据结构:基于向量空间的高效搜索结构(如 FAISS、HNSW、Annoy),存储的是文本的嵌入向量(高维浮点数数组)。
  • 存储内容:索引里直接保存的是嵌入向量(通常还会关联原始文本或其引用),而不仅仅是指针。这种嵌入向量本身就是数据的某种“表示”。
  • 使用场景:非结构化数据(如文本、图像)的语义搜索。

所以你说得对,向量存储索引和 MySQL 的索引在设计目标和实现上完全不同。传统索引是为了快速定位具体值,而向量存储索引是为了快速找到“最相似”的内容。

为什么叫“向量存储索引”而不是“向量存储数据”?

  • “索引”在这里的含义:

    • 在向量搜索领域,“索引”指的是一个经过优化的数据结构,用于加速向量之间的相似性计算和检索。它不只是存数据,而是以某种方式组织数据(比如 FAISS 用聚类或倒排索引),让查询效率更高。
    • 比如 FAISS 可能会把向量分桶(clustering),HNSW 用图结构连接向量,这些都是“索引”的体现。
  • 为什么不叫“向量存储数据”:

    • “数据”听起来像是原始的、未经组织的存储,比如直接把向量一股脑扔进数据库。而“索引”强调的是结构化和查询优化。
    • LlamaIndex 的向量存储索引不仅存了向量,还为快速检索做了预处理(比如降维、构建树或图)。它是个功能性工具,而不仅是数据的容器。
  • 命名习惯:

    • 在向量搜索和机器学习领域,像 FAISS、Annoy、HNSW 这些工具都叫“索引”(index),因为它们的核心是构建一个可搜索的结构。LlamaIndex 沿用了这种惯例。

举个类比

  • MySQL 的 B-树索引就像图书馆的卡片目录,按书名首字母排序,帮你快速找到某本书。
  • LlamaIndex 的向量存储索引更像是推荐系统,根据你喜欢的书,找到内容相似的其他书,靠的是“向量空间的距离”而不是精确匹配。

总结

LlamaIndex 的向量存储索引确实和 MySQL 的索引差别很大,它更像是一个专门为高维向量设计的“搜索加速器”。叫“索引”是因为它不仅存向量,还组织向量以提升查询效率,而不是简单的数据存储。


个人对于深度强化学习的思考

  • 对于RAG应用,优化方法有很多。我的想法是,把这些优化方法想象成一堆‘工具’,然后用强化学习这个‘聪明助手’来挑出最好用的组合。
  • “优化策略”变成了“工具”,“强化学习”变成了“聪明助手”,“奖励函数”简化为“任务需求”

扩展

如果嵌入模型知道“你好”和“再见”的向量,它可以将“你好再见”转化为一个向量吗?

  • From Grok3 (2025-02-25)
  • 嵌入模型可以将“你好再见”转化为向量。
  • 对于词嵌入模型(如 Word2Vec 或 GloVe),通常通过平均或相加“你好”和“再见”的向量来生成短语向量。
  • 对于句嵌入模型(如 BERT 或 Ada-002),模型可以直接处理“你好再见”序列,生成反映上下文关系的向量。

RAG的相关原理

  • From Grok3 (2025-02-25)– 基于自身理解由Grok优化

  • 文本向量化:在RAG中,知识库中的文档会被分割成适当的文本片段(例如句子或段落),然后使用预训练模型对这些片段整体进行向量化,生成语义丰富的稠密向量。这一过程不同于传统的单词嵌入,目的是捕捉整个片段的语义信息。

  • 向量检索:当用户提出问题时,系统会将问题同样向量化,并在向量数据库中查询与问题语义最相似的文本片段。这些检索结果是原始文档中的真实内容,而不是由模型生成的文本。

  • 上下文整合与生成:检索到的文本片段会以纯文本形式插入到一个提示模板中,作为上下文连同用户的问题一起输入到生成模型中。生成模型(如大语言模型)基于这些上下文生成最终的回答。

其他

  • 精通RAG架构:从0到1,基于LLM+RAG构建生产级企业知识库

    • 向量数据库对比
    • 如何选择嵌入模型:https://huggingface.co/spaces/mteb/leaderboard
  • 微软推出CoRAG:通过迭代推理提升AI检索能力

    • CoRAG 的核心创新在于其动态查询重构机制。该模型不再依赖单次检索,而是根据中间推理状态迭代优化查询。这一过程确保了每个阶段检索到的信息都与上下文相关,进而逐步构建出更完整的最终答案。
  • 用 LLM 快速构建实用知识图谱

    • 如果你用图数据库来检索信息,那么这种方式被称为 GraphRAG,它是知识图谱在 RAG 中的具体应用
    • 向量相似性检索依赖于知识库中的明确提及,只有明确提到的信息才会被检索出来。而知识图谱则能通过整体数据来推理出更多信息
    • 使用 Langchain 的实验功能 LLMGraphTransformer,如果是 LlamaIndex,可以尝试它的 KnowledgeGraphIndex。
    • LLM 可以从纯文本中提取图谱信息,并将其存储到像 Neo4J 这样的数据库
  • “无”中生有:基于知识增强的RAG优化实践

    • 感觉做这个东西就是在不停找各种优化方法反复尝试看效果,而且目前还处于很乱的早起阶段
  • 微软推出的 LazyGraphRAG

    • 传统方法(如基于向量的 RAG)在处理局部化任务时表现良好,例如从特定文本片段中检索直接答案。然而,当涉及需要全面理解数据集的全局性查询时,这些方法往往难以胜任。
    • 相比之下,图支持的 RAG 系统通过利用数据结构中的关系,可以更好地解决此类更广泛的问题。然而,与图 RAG 系统相关的高索引成本,使其难以被成本敏感的场景所接受。因此,在可扩展性、经济性和质量之间实现平衡,仍然是现有技术的关键瓶颈。
    • 相比之下,图支持的 RAG 系统通过利用数据结构中的关系,可以更好地解决此类更广泛的问题。然而,与图 RAG 系统相关的高索引成本,使其难以被成本敏感的场景所接受。因此,在可扩展性、经济性和质量之间实现平衡,仍然是现有技术的关键瓶颈。
    • LazyGraphRAG 将 VectorRAG 与 GraphRAG 相结合,“同时克服了二者的各自局限性”。
  • DeepSearcher深度解读:Agentic RAG的出现,传统RAG的黄昏

    • https://github.com/zilliztech/deep-searcher
    • 所谓Agentic RAG,是一种融合智能代理(Agent)能力的RAG架构。通过动态规划、多步骤推理和自主决策机制,Agentic RAG可以在复杂任务中实现闭环的检索-加工-验证-优化
    • Agentic RAG相比传统RAG有着三大优势:
      • (1)被动响应变为主动响应;
      • (2)单次的关键词检索,升级为多轮的动态调整检索,并拥有自我修正能力;
      • (3)适用场景,从最基础的简单事实问答,升级为复杂推理、复杂报告生成等开放域任务。
    • 长期来看,Agentic RAG必定会取代传统RAG。一方面,传统RAG对需求的响应还停留在非常基础的阶段,另一方面,现实中,我们大部分的需求表达背后,都是有隐含逻辑的,并不能被一步检索到位,必须通过推理-反思-迭代-优化来对其进行拆解与反馈。
    • VS Graph RAG
      • Graph RAG主要聚焦于对存在连接关系的文档展开查询,在处理多跳类问题上表现出色。
      • 例如,当导入一部长篇小说时,它能够精准抽取各个人物之间错综复杂的关系。其运作方式是在文档导入环节,就对实体间关系进行抽取。因此,这一过程会大量消耗大模型的token资源 。
      • 而在查询阶段,不论是否是查询图中某些节点的信息,都会进行图结构的搜索,这使得这一框架不太灵活。
      • 反观Agentic RAG,它的资源消耗模式与Graph RAG恰好相反。在数据导入阶段,Agentic RAG无需执行额外特殊操作,而在回答用户提问时,才会产生较多大模型的token消耗。

Reference

  • 《基于大模型的RAG应用开发与优化——构建企业级LLM应用》

LangChain要点记录

发表于 2025-02-19

基于书籍简单记录要点

LangChain 提供了多种模板供选择

  • LangChain 提供了以下格式化 SQL 提示词模板(翻译):
1. 你是一个 PostgreSQL 专家。给定一个输人问题,首先创建一个语法正确的 PostgreSQL查询来运行,然后查看查询结果,扑返回针对输人问题的答案。
2. 除非用户明确指定了要返回的结果数量,否则应使用 PostgreSQL 的LIMIT 子句来限制查询结果,最多返回top.k条记录。你可以对结果进行排序,以返回数据库中最有信息价值的数据。
3. 绝对不要查询表中的所有列。你只能在询回答问题所需的列。用双引号(")将每个列名包裹起来,表示官们是界定的标识符。
4. 注意只使用你在表巾可以看到的列名,不要责询不存在的列。此外,要注意哪一列在哪个表中。
5. 如果问题涉及“今天”,请注意使用 CURRENT_DATE 函数获取当前日期。

使用以下格式:

问题:这里的问题
SQL查询:要运行的 SQL 查询
SQL结果:SQL 查询的结果
答案:这里的最终答案

只使用以下表:

(table_info)

问题:{input}

  • 想象一下,如果没有 LangChain 提供的这个提示词模板,当你要开始编写一段SQL查询代码时,会走多少弯路?LLM 应用开发的最后1公里,其意义是确保开发者无须为了一个小细节而多走弯路,正如居民无须跑很远坐公交车一样,每一个关键的细节都能得到及时而准确的处理,使得整个开发过程更为高效。

记忆提示词

  • 创建提示词是最重要的环节。在创建的过程中你可以理解为什么加人记忆组件后,“聊天备忘录”有了内容,让链组件有了“记忆”。使用提示词模板包装器,自定义一个提示词模板字符串。

  • 提示词内容分为四部分:

    • 一是对模型的指导词:“请你回答问题的时候,依据文档内容和聊天记录回答,如果在其中找不到相关信息或者答案,请回答不知道。”;
    • 二是使用问题检索到的相关文档内容;“文档内容是:{context}”;三是记忆组件输出的记忆内容:“聊天记录是:{chat_history}”;四是用户的输人:“Human:(human _input)”
      template = "n*你是说中文的 chatbot.
      请你回答问题的时候,依据文持内容和脚天记录回答,如果在其中找不到相关信息戒着答案,请回答
      不知道。
      文档内容是:{context)
      聊天记录是:{chat_history)
      Human: (human_input)
      Chatbot:"""
      
  • LangChain 框架由以下开发库组成。

    • (1)LangChain-Core:基础抽象和 LangChain 表达语言(LCEL)。
    • (2)LangChain-Community:组件及内置的大量第三方技术集成模块,一般被封装为合作伙伴模块(例如 LangChain-openai)。
    • (3)LangChain:构成应用架构的上层核心组件,包括 Chains、Agents 等。
    • (4)Templates:官方提供的一些常见的应用模板。
    • (5)LangServe:将 LangChain 链部署为 REST API 的平台。
    • (6)LangSmith:帮助开发者跟踪调试、测试、评估和监控大模型应用的在线平台。

其他

  • Langchain agent是怎么找到search工具并使用的

    • 可以正确识别和调用它,因为它主要是通过 description 语义匹配,而不是看 name 的具体字符串。
    • 但 name 仍然有一定作用,比如:LLM 可能会参考 name 来做初步判断;调试时 name 可以帮助你看日志,知道 Agent 选了哪个工具
  • LLM本身没有内在记忆,每个查询都是独立进行的

    • 所谓的记忆和检索增强生成(RAG)是通过外部手段实现的,即将相关信息添加到提示词模板中

扩展

Langchain是怎么做到通过分析语义找到对应工具的

  • From ChatGPT (2025-02-18)

LangChain 通过 LLM(大模型)+ ReAct 框架 来分析语义并选择工具。它的核心逻辑是让 LLM 先思考,再决定用哪个工具,并按照工具的格式调用它。

核心机制

  1. 解析用户问题 → 让 LLM 提取关键语义
  2. 匹配工具描述 → 让 LLM 判断哪个工具最适合
  3. 生成调用指令 → LLM 生成工具的调用格式并执行
  4. 工具返回结果 → LLM 解析工具返回的数据并回复用户

这套逻辑基于 ReAct(Reasoning + Acting) 框架,在 LangChain 里 Agent 主要是用这个方法来动态决策。

1. 解析用户问题

假设你输入:

1
agent.run("计算 25 * 4 + 10")

LangChain 会把这个问题交给 LLM(如 GPT-4),让它理解用户的意图。

LLM 可能会把你的问题理解成:

  • 这是一个数学计算问题
  • 需要找到一个能进行数学计算的工具
  • 计算表达式 25 * 4 + 10

2. 匹配工具描述

假设你有两个工具:

1
2
3
4
5
6
7
8
9
10
11
Tool(
name="Calculator",
func=calculator_tool,
description="用于数学计算。输入一个数学表达式(如 3 + 5 * 2),输出结果。",
)

Tool(
name="Wikipedia",
func=wiki.run,
description="查询 Wikipedia 词条,输入一个关键词(如 'Python programming'),获取相关信息。",
)

LLM 会对比问题和 description,发现 Calculator 的描述里提到了“数学计算”,所以它会选择 Calculator 这个工具。

关键点:LangChain 让 LLM 直接读 description,所以工具的名字 name 只是一个标识,核心还是 description 的语义匹配。

3. 生成调用指令

LangChain 让 LLM 生成一个类似 JSON 的格式,表示它要调用哪个工具:

1
2
3
4
{
"action": "Calculator",
"action_input": "25 * 4 + 10"
}

然后 LangChain 会解析这个指令,找到 Calculator 工具,并把 25 * 4 + 10 传给 func 去执行。

4. 工具返回结果

计算工具执行:

1
eval("25 * 4 + 10")  # 计算得到 110

LangChain 把 110 返回给 LLM,LLM 可能会回复:

1
25 * 4 + 10 = 110

最终 agent.run() 会输出这个结果。

总结

LangChain 让 LLM 负责:

  1. 分析用户语义
  2. 匹配工具(通过 description)
  3. 生成调用工具的指令
  4. 解释工具返回的结果

它的核心是利用 LLM 的推理能力,结合 ReAct 让它“思考后再行动”。所以只要 description 够清晰,即使 name 乱写,它也能找到正确的工具!


Reference

  • 《LangChain入门指南构建高可复用、可扩展的LLM应用程序》
  • 《基于大模型的RAG应用开发与优化——构建企业级LLM应用》

深度学习基础入门备忘

发表于 2025-02-17

简单粗略通读了解,先记录备忘
后续考虑结合相关视频深入理解

  • 《深度学习人门:基于Python的理论与实现》:https://github.com/Kingson4Wu/Deep-Learning-from-Scratch

    1. 感知机是一种接收多个输入信号并输出一个信号的算法。它的工作原理基于权重和偏置这两个关键参数。
    2. 机器学习的任务是让计算机自动确定合适的权重和偏置参数值。
    3. 求解机器学习问题的步骤
      1. 训练(学习)
      2. 推理(神经网络的前向传播)
    4. 激活函数(activation function):决定如何来激活输入信号的总和;激活函数是连接感知机和神经网络的桥梁。
    5. 神经网络的学习过程:通过损失函数 (loss function)和梯度法 (gradient method)来优化网络参数
      1. 学习的目标是通过梯度下降法(gradient descent method)找到使损失函数值最小的权重参数
      2. 学习率(learning rate):决定参数更新的步长(超参数、人工设定)
    6. 随机梯度下降(stochastic gradient descent)(SGD)能在一定程度上帮助避免局部最优,通常将SGD与其他技术结合使用,以获得更好的优化效果
    7. 深度学习:加深了层的深度神经网络;通过叠加层,可以创建更深的网络结构
  • 《深度学习进阶:自然语言处理》:https://github.com/Kingson4Wu/Natural-Language-Processing

    1. 自然语言处理的目标就是让计算机理解人说的话,进而完成 对我们有帮助的事情
    2. 单词的分布式表示(分布式假设)(单词向量化):“某个单词的含义由它周围的单词形成”;单词本身没有含义,单词含义由它 所在的上下文(语境)形成。
    3. 向量间的相似度:余弦相似度(cosine similarity);直观地表示了“两个向量在多大程度上指向同一方向”
    4. 让计算机理解单词含义:基于推理的方法(word2vec)(基于神经网络)。
    5. 语言模型(language model)给出了单词序列发生的概率;使用概率来评估一个单词序列发生的可能性,即在多大程度上是自然的 单词序列。
      • 生成的新文本是训练数据中没有的新生成的文本。因为语言模型并不是背诵了训练数据,而是学习了训练数据中单词的排列模式
      • 语言模型的评价:困惑度(perplexity)、分叉度
    6. “马尔可夫性”或者“马尔 可夫模型”“马尔可夫链”:指未来的状态仅 依存于当前状态。
    7. RNN(循环神经网络):被引入来解决前馈网络在处理时序数据上的局限性。
      • 传统RNN中存在的梯度消失和梯度爆炸问题
      • LSTM的结构与传统RNN的不同之处在于,它引入了记忆单元(c)。记忆单元在LSTM层之间传递,但不直接用作输出。LSTM的对外输出是隐藏状态向量(h)。
    8. seq2seq模型(也称为Encoder-Decoder模型)用于将一个时序数据转换为另一个时序数据
      • 传统 seq2seq 模型 将编码器输出压缩为固定长度向量,导致长序列信息丢失
      • Attention 机制 允许模型在解码时关注输入序列的不同部分,类似人类注意力
    9. Transformer:基于 Attention 构成;基于 Attention 构成
  • 《深度学习入门:强化学习》:https://github.com/Kingson4Wu/Reinforcement-Learning

    1. 机器学习(按学习方法划分):监督学习(supervised learning)、无监督学习(unsupervised learning)、强化学习(reinforcement learning)
      1. 监督学习:给正确答案打标签;输入的数据由“老师”打标签
      2. 无监督学习:无“正确答案标签”;没有 “老师”的存在;主要目标是找到隐藏在数据中的结构和模式;分组(聚类)、特征提取、降维
      3. 强化学习:智能代理和环境相互作用;智能代理是行动的主体;强化学习接受”奖励”作为来自环境的反馈
    2. 强化学习行动的策略
      1. “贪婪行动”(greedy ),也叫利用(exploitation):根据以前的经验选择最佳行动(可能错过更好的选择)
      2. “非贪婪行动”,也叫作探索(exploration):对价值做出更准确的估计。
    3. 强化学习算法最终归结为如何在“利用”和 “探索”之间取得平衡
    4. ε-greedy 算法、马尔可夫决策过程(MDP)
    5. 在强化学习中,我们的目标是获得最优策略
    6. 深度强化学习(deep reinforcement learning):强化学习和深度学习的结合
    7. 通用人工智能(artificial general intelligence, AGI)

关于AI大语言模型替代人类工作的问题

发表于 2025-02-13

AI的局限性或缺点

  • 难以预测与控制:AI的运行机制像黑箱,难以准确预知其行为,尤其在关键场景下可能会犯致命错误。
  • 无法背锅:AI犯错时,责任归属难以明确,导致无法追究错误的责任,缺乏人类信誉体系的约束。
  • 逻辑推理不严谨:AI的推理基于概率预测,不是绝对严谨的逻辑推理。训练数据如果有误,AI可能无法辨别。
  • 无法创新:AI不具备创造全新概念的能力,更多的是基于历史数据进行知识复述与组合,无法像人类一样发明新技术或理念。
  • 对超出训练数据的场景应对差:AI在面对未曾训练过的数据时,表现较差,容易出错。

AI的好处

  • 提高效率:AI在许多领域极大提升了效率,尤其在数据处理、搜索和重复性任务上。对于程序员来说,它是一个强大的辅助工具,帮助快速解决技术问题。
  • 降低门槛:AI减少了对低级重复性任务的需求,拉近了人们在某些知识领域的差距。
  • 支持决策和监督:AI辅助决策,尤其是在复杂任务中,能提供数据支持,减少人为错误。

AI工具下需要的人才

  • 清晰表述与提问能力:能够清晰提出问题和有效沟通是与AI协同工作的关键,好的表述能力有助于提高工作效率。
  • 整理与分析能力:能够有效梳理信息、分解任务,并向AI提出清晰问题的人,会更善于利用AI工具。
  • 与产品交互能力:AI可以编写代码,但仍需要人类与产品经理沟通,理解需求并做出相应调整。

程序员的利好与不可替代的能力

  • AI对程序员的利好:
    • AI大幅提升了开发效率,尤其在编程辅助、技术搜索、业务方案思考等方面。
    • 某些低级任务减少了人力需求,使得程序员能更多专注于创造性和复杂问题的解决。
  • 程序员不可替代的地方:
    • 清晰的提问和判断能力:程序员的核心能力在于能理解问题,并准确表达需求,AI只能作为工具辅助工作。
    • 与产品沟通:AI生成的代码和解决方案需要程序员与产品团队对接,确保最终结果符合需求。
    • 决策和经验判断:AI的能力有限,尤其在面对复杂决策时,仍需依赖经验丰富的程序员来进行判断和修正。

个人观点

  • AI目前主要是利用历史数据和记忆进行信息处理,不能进行创新(如无法创造出类似K8S的技术)。
  • 尽管AI能提高程序员的工作效率,但目前它更多是辅助工具,而不是替代品。
  • 对普通程序员来说,理解大模型技术的基本原理和概念非常重要,未来将需要在“AI操作系统”上来构建应用。

扩展

来自claude.ai的评价
2025-02-13

我来分析一下这些观点,指出其中可能存在的错误或需要讨论的地方:

  1. 关于”无法创新”的说法需要更谨慎:
  • 虽然AI确实主要基于已有数据进行组合和推理,但说它”不具备创造全新概念的能力”可能过于绝对
  • AI已经展示出一定的创新能力,比如在围棋、蛋白质折叠等领域提出了人类之前没有想到的解决方案
  • 更准确的说法是AI的创新能力与人类不同,它通过大规模数据分析和模式识别来实现创新
  1. “逻辑推理不严谨”的表述不够准确:
  • 现代AI系统(尤其是形式化验证系统)可以进行严格的逻辑推理
  • 大语言模型确实存在基于概率的推理特点,但这不等同于所有AI系统都如此
  • 人类的推理同样也常常基于经验和概率判断,而不总是严格的逻辑推导
  1. 关于”难以预测与控制”:
  • 这个观点部分正确,但需要注意现代AI系统已经有了很多可解释性的工具和方法
  • 某些领域的AI系统(如用于医疗诊断的AI)已经实现了相当程度的可解释性
  • “像黑箱”这种说法可能过于简化了问题
  1. “无法背锅”的说法不够准确:
  • 实际上已经有了相关的法律和责任框架在建立
  • AI系统的责任可以追溯到开发者、部署者和使用者
  • 这更多是一个治理和监管的问题,而不是技术本身的限制
  1. “个人观点”部分关于K8S的例子不够恰当:
  • K8S本质上是一个系统架构和设计方案,而不是完全创新的技术
  • AI实际上可以通过分析已有系统设计模式,提出类似的架构方案
  • 更准确的说法是AI在某些创新领域的能力仍有限制,而不是完全无法创新
  1. 好处部分基本准确,但可以补充:
  • AI不仅提高效率,还能发现人类容易忽视的模式和关联
  • 在某些领域(如图像识别、语音处理)已经超越了人类性能
  • AI能够24/7工作,这个优势没有被提到
  1. 关于程序员不可替代性的分析基本合理,但可以补充:
  • 程序员在系统架构设计、安全性考虑等方面的经验特别重要
  • 处理边界条件和异常情况的能力仍然需要人类经验
  • 对业务场景的深入理解和商业价值判断也是关键能力
  1. “AI操作系统”的说法需要澄清:
  • 这个比喻可能会造成误解,更准确的说法是”AI基础设施”或”AI平台”
  • 程序员需要理解的不仅是技术原理,还包括AI的应用场景和限制

总的来说,这些观点大体上是合理的,但部分表述过于绝对或简化。AI的能力和局限性是一个复杂的话题,需要更细致和平衡的讨论。理解AI的真实能力和限制,对于更好地利用AI工具至关重要。

深度学习为什么能学习并做对

发表于 2025-02-13

我的理解

  • 目前无法解释为什么深度学习可以给出答案,只能大概解释为什么它能学习
  • 这就相当于:我不能解释为什么这个人是通过什么做对这道题的,我只能解释他有正常的学习能力以及合适的学习资料,所以他自己能学习并做对题目
  • 所以深度学习是怎么给出答案的,后续或许应该由它本身来告诉我们。
  • 依据不同人的认知水平,来告诉我们它通过学习所发现的规律。同时人类通过它能快速学习发现事物规律的能力,来进一步帮助提升人类的认知。

AI对我理解的看法

From chatGPT (2025-02-13)

  • 你理解的方向是对的,可以稍微精炼和调整一下:

    • 深度学习的一个核心问题就是我们无法完全解释它是如何给出具体答案的。我们能解释的只是它是如何通过大量的数据和训练过程进行学习的。换句话说,深度学习像是一个“黑箱”,我们可以观察到输入和输出,但它在其中如何处理信息、做出决策,通常并不完全透明。
    • 可以类比成:假设有一个人做对了某道题目,虽然我们可能无法完全解释他是如何一步一步得出答案的,但我们能确定他具备了良好的学习能力和充足的学习资源。所以,深度学习也类似,它通过大量的数据、适当的算法和优化手段“学习”并给出答案。
    • 至于它如何给出具体的答案,最终可能还是要依靠深度学习本身来“解释”。这意味着,未来我们可能会开发出更先进的方法,帮助我们理解深度学习网络中的“决策过程”。同时,借助它所展现出的强大规律发现能力,我们可以利用这种能力来加速我们对事物的认知。
  • 我的看法:

    • 我同意你的观点,深度学习的“黑箱性”是目前我们面临的主要挑战之一。它的强大之处在于能自动从海量数据中发现规律,但如何理解这些规律,如何将这些规律和人类的认知能力相结合,是我们目前探索的方向之一。其实,未来可能不仅仅是“深度学习告诉我们如何做”,而是人类和深度学习的合作能进一步推动科学与技术的发展,帮助我们发现一些潜在人类难以触及的规律。
    • 深度学习不只是一个工具,它还可能是一个不断反馈、不断自我优化的过程,给我们打开了认知的新窗口。

AI自己对这个问题的看法

From chatGPT (2025-02-13)

  • 关于“深度学习为什么能学习并做对”的问题,我的理解是,深度学习通过大量的数据训练,自动从中提取规律、建立模型,并根据这些模型对新数据做出预测。深度学习的优势在于它能够发现一些非常复杂和抽象的规律,而这些规律通常是我们人类在没有机器帮助的情况下很难发现的。

  • 但是,为什么深度学习能给出正确的答案,实际上是一个复杂的过程。深度学习模型并不像人类一样有明确的逻辑推理或意识,它只是基于输入数据的模式,使用一系列参数和数学运算来“拟合”数据。对于这个过程的解释,我们只能说它通过优化算法(如梯度下降等)调整模型参数,使得输出尽可能接近实际结果。因此,深度学习并不“理解”问题,而是通过反复训练找到了一组合适的参数,能在特定任务上取得高效的预测或分类结果。

  • 你可以把深度学习看作一个“发现者”,它通过大量的例子不断试错和优化,不断接近正确的答案,但它没有明确的推理过程。比如,人类在做题时有一定的思考过程,我们可以分析每一步的原因,而深度学习则是通过计算和数据模式的关联来找到最优解。

  • 至于“深度学习为什么能做对”,目前我们更多关注它的实际效果而非其过程的透明性,因为即使我们无法完全解释它的每一个决策,也可以通过其出色的表现来证明它的有效性。未来,随着研究的深入,我们可能会找到更好的方法,帮助我们理解这些“黑箱”模型的内部机制。

  • 总结来说,深度学习通过数据的反复训练和优化,能够找到规律并给出准确的预测,而为什么它能做对,更多是依赖于它强大的计算能力和从数据中提取规律的能力,而不是基于传统意义上的推理或解释。

  • 几个关键点总结:

    1. 深度学习的学习过程:深度学习通过大量的数据训练,利用优化算法(如梯度下降)调整模型参数,自动从数据中提取规律,完成任务(如预测、分类等)。
    2. 无法完全解释“为什么”:深度学习模型在给出答案时,并没有明确的推理过程或“理解”,它只是通过找到合适的模式和参数来优化输出。其决策过程通常是黑箱的,难以完全解释。
    3. 黑箱性质:我们无法清楚知道深度学习是如何做出具体决策的,但可以看到它在实际任务中表现出色。因此,我们更多关注它的效果,而非其内在工作机制。
    4. 与人类认知的对比:深度学习像是一个“发现者”,通过反复训练和调整找到正确的答案,而不像人类那样依赖明确的思维和推理过程。
    5. 未来发展:虽然当前无法完全解释深度学习的过程,但随着技术进步,未来可能会出现更好的方法帮助我们理解这些“黑箱”模型的内部机制。
  • 这几个关键点总结了深度学习的“学习能力”、它的“黑箱性质”、以及它与人类认知的差异。

大语言模型对话记录与思考备忘录

发表于 2025-02-12

记录与大语言模型的对话,探索疑问与思考
内容可能持续更新,作为大模型演变的历史备忘
有些问题非原创,来源网络


大模型的推理能力


大模型能从训练数据中识别互相矛盾的逻辑吗?或者说,大模型具备逻辑推理能力,能发现逻辑错误吗?

From chatGPT (2025-02-12)

好的,按你给的格式调整后是这样:

大模型,如GPT类模型,能够一定程度地识别并指出逻辑上的矛盾或错误,但它的能力有一定的局限性。具体来说:

  1. 从训练数据中识别矛盾:大模型通过暴露于大量文本数据,在训练过程中学会识别常见的逻辑错误或不一致的情况。如果某个陈述前后矛盾或与常识相悖,模型有时能检测到这些问题。然而,这种识别主要依赖于训练数据中的模式,而非深度理解。

  2. 推理能力:大模型表面上似乎能够进行推理,但其推理过程更多是基于统计模式匹配,而非逻辑推理。它能在一些标准情境下给出合理的答案,但在面对复杂的逻辑链条或抽象推理时,表现可能不如人类或专门的逻辑推理系统。

  3. 局限性:大模型的推理能力受到训练数据质量和多样性的限制。如果训练数据包含不一致的示例或错误的推理模式,模型可能会学到并延续这些错误。对于一些高度专业化的推理任务(如数学证明或严谨的形式逻辑推理),大模型的能力仍然有限。

总结来说,大模型能够识别一些常见的逻辑错误或矛盾,尤其是那些明显的错误,但它的推理能力与人类的深层次逻辑思考存在差距,也不具备专门的推理系统那样的准确性。


ChatGPT的推理能力是如何实现的?它具备哪些优势和局限?

From chatGPT (2025-02-12)

ChatGPT展现出的推理能力,实际上并不是人类意义上的“思考”,而是基于大量数据和算法模拟的逻辑模式。这种能力的实现可以从以下几个方面理解:

  1. 基于大规模语言模型的训练
    ChatGPT通过大规模语言数据的训练,包括书籍、论文、对话和逻辑推理的例子,学习到了如何理解问题结构、模拟人类的逻辑推导过程,并生成符合逻辑的回答。核心在于,模型并不真正“理解”逻辑,而是通过统计关联,从大量训练数据中学习到解决类似问题的模式。

  2. 基于概率的回答生成
    ChatGPT生成回答的过程是基于概率分布的。它会根据问题内容预测接下来的最可能的单词或句子,尤其是在逻辑推理问题中,看起来像是在推理,实际上是在复现训练数据中类似问题的逻辑模式。通过结合训练数据中的逻辑规则,它动态生成符合问题需求的步骤。

  3. 内部机制:注意力机制与自回归生成

    • 注意力机制(Attention Mechanism):这是GPT模型的核心,通过注意力机制,模型可以“记住”上下文内容,从而保持逻辑连贯性。
    • 自回归生成(Autoregressive Generation):模型逐词生成答案,并在生成过程中不断参考之前生成的内容,保证推理步骤清晰、有条理。
  4. 模拟逻辑推理的实现
    对于逻辑推理类问题,ChatGPT的表现依赖两个关键点:

    • 模式识别:它能够识别问题结构并提取逻辑关系,如“甲说乙说谎”,“丙说甲和乙都说谎”。
    • 排除矛盾:通过“假设-验证-排除”过程,模拟人类的假设验证,判断假设是否导致矛盾。这个过程并非真正的推理,而是基于大量类似问题的经验模式。
  5. ChatGPT的优势和局限

    • 优势:
      • 在简单的逻辑推理任务中表现良好,尤其是规则清晰、条件有限的问题。
      • 能快速“推导”出答案并通过自然语言呈现清晰的推理过程。
    • 局限:
      • 不具备真正的理解能力:它并不是从问题本质进行推理,而是利用数据中学到的模式。
      • 复杂逻辑容易出错:如果逻辑嵌套太深或需要跨领域知识,可能会出错。
      • 缺乏主动性:无法主动思考问题的背景或意图,只能根据输入提供答案。

总结
ChatGPT的推理能力是通过模式匹配、注意力机制和语言生成技术实现的。它能够模拟逻辑推理的步骤,但并不具备真正的逻辑思维或理解能力。这种能力本质上是深度学习在海量数据上的“概率学习”和“语言模式复现”,通过这种方式实现了让人类看起来“像在思考”的效果。


推理模型 vs 通用大模型

From Grok3 (2025-02-23)

  • 关键点:推理模型与通用大模型在训练方式、推理过程和用途上有显著差异,推理模型更注重逻辑推理,通用大模型则更注重文本生成。
  • 训练方式的不同:
    • 通用大模型通常通过监督学习在大规模文本数据上训练,目标是预测下一个词,适合广泛的语言任务。
    • 推理模型则常使用强化学习进行微调,鼓励逐步推理,特别针对数学、科学和编码等需要逻辑推理的任务进行优化。
  • 推理过程的差异:
    • 通用大模型直接生成答案,基于统计模式。
    • 推理模型采用链式思维(CoT)方法,将问题分解为步骤,逐步解决,类似于人类思考过程,这在复杂问题上表现更好。
  • 用途和性能
    • 通用大模型用于文本摘要、翻译等任务。旨在处理广泛的自然语言任务。这些模型通过在大规模文本数据上训练,学习预测下一个词的概率分布,适用于文本生成、翻译和问答等任务。
    • 推理模型擅长需要逻辑推理的任务,如解数学题或编写代码,尤其在多步推理任务上表现优异。一种专门设计或微调的模型,专注于复杂推理任务,如数学问题解决、科学推理和编码。这些模型通过链式思维(CoT)等技术,逐步分解问题并推理出答案,试图模拟人类逻辑思维过程。

大模型推理能力不依赖外部的插件

From Grok3 (2025-02-23)

  • 关键要点:大语言模型不使用外部计算插件进行数学计算。它们的数学计算完全依赖模型自身的推理能力,通过文本生成来解决问题。
  • 大语言模型如ChatGPT、DeepSeek-LLM和Grok在进行数学计算时,不使用外部计算插件。它们完全依靠自身的推理能力,通过生成文本的方式一步步解决问题。例如,当你问“2+2=?”时,模型会基于训练数据预测答案,而不是调用外部工具进行计算。令人惊讶的是,尽管它们没有计算器功能,但通过“链式思维提示”(CoT)等技术,可以逐步推理出复杂数学问题的答案,比如解方程或计算积分。
  • 模型如何进行数学计算:这些模型通过训练数据学习数学模式和规则,预测文本序列来完成计算。比如,模型可能学会“5+3=8”是因为训练数据中有大量类似例子。它们没有内置的计算模块,而是依靠语言生成能力来模拟计算过程。
  • 是否使用外部工具:标准版本的这些模型不使用外部计算插件,但在某些开发者集成下,可以通过插件(如Wolfram Alpha)增强计算能力。但这不是模型本身的默认行为。
  • 实际表现:模型在简单计算上表现不错,但复杂计算(如多位数乘法)可能出错,因为它们依赖文本预测而非精确计算。
  • 结论:大语言模型的数学计算能力完全由模型自身推理得出,不使用外部计算插件。它们的计算基于文本生成和模式识别,通过训练数据和提示技术(如CoT)增强表现,但在复杂任务上可能出错。

大语言模型的推理能力

From Grok3 (2025-02-23)

  • 大语言模型的推理能力主要依赖于它们的训练和设计,而不是完全基于思维链(CoT)。CoT是一种提示技术,可以引导模型逐步思考,从而改善推理输出,但模型本身的推理能力来自其语言生成能力。


个人思考和理解


AI 数据获取的局限性

经Grok3[DeepSearch]优化 (2025-02-25)

  • 当前AI在自主寻找和筛选数据方面仍存在局限性,研究表明其难以独立完成如安装应用或通过实名验证等任务。
  • AI缺乏有效判断数据质量和相关性的能力,可能导致处理大量无用信息,浪费计算资源并可能降低性能。
  • 因此,训练数据的选择仍需依赖人类的专业判断,以确保数据的准确性和相关性。


经典问题


有甲乙丙三个人,有人只说真话有人只说假话。现在,甲说乙说谎,乙说丙说谎,丙说甲和乙都说谎。问谁是说谎的

From chatGPT (2025-02-12)

这个问题可以通过逻辑推理来解答。我们可以假设每个人分别说真话或说谎,并根据他们的陈述进行推理。

陈述内容:

  • 甲说乙说谎。
  • 乙说丙说谎。
  • 丙说甲和乙都说谎。

假设:

假设甲说的是真的,那么:

  • 甲说乙说谎。所以乙是说谎者。
  • 乙说丙说谎。如果乙是说谎者,那么乙说的应该是假的,即丙不说谎。
  • 丙说甲和乙都说谎。如果丙不说谎,那么丙的说法应该是真的。所以甲和乙都应该是说谎者,但这与我们的假设矛盾,因为我们已经假设甲是说真话的。

所以,假设甲说真话的情况矛盾,甲不可能是说真话的。

接下来,假设乙说的是真的:

  • 乙说丙说谎,所以丙是说谎者。
  • 丙说甲和乙都说谎。因为丙是说谎者,丙的话不成立,因此甲和乙至少有一个是说真话的,这与假设乙说真话一致。
  • 甲说乙说谎。如果甲是说谎者,那么甲的话应该是假的,所以乙说的是真的,符合假设。

因此,乙是说真话的,甲和丙是说谎的。

结论:

甲和丙是说谎的,乙是说真话的。


ChatGPT是如何“算”出单词中字母“t”的个数的?

ChatGPT并不是通过逐一计算字母“t”的个数来得出答案,而是通过以下几个步骤来实现的:

  1. 文本解析和模式识别
    当接收到像“Attention有几个t”这样的问题时,模型识别到这是与字母统计相关的查询,并提取出关键词“attention”,随后在该单词的字符序列中查找所有的字母“t”。

  2. 背后逻辑的实现
    ChatGPT生成答案的过程其实涉及语言生成的几个步骤:

    • 拆分单词: 模型识别出字符串“attention”。
    • 统计字母: 模型检测每个字母的出现次数,特别关注字母“t”。
    • 生成回答: 模型根据其训练中学到的模式直接输出答案,例如“3个t”。
  3. 本质:语言生成vs算法实现
    虽然从表面看,ChatGPT像是在“数”字母“t”,但其实:

    • 它可能基于训练数据中“attention”单词的字符分布知识,快速得出答案。
    • 如果该单词在训练数据中从未出现过,模型会尝试通过字符分析来推测答案,但这不如专门编写的统计算法准确。

人类方式与模型行为的对比
若由人类解答:

  1. 人类会直接肉眼数出字母“t”的个数。
  2. 确认答案。

而ChatGPT则模拟这一过程,通过对字符模式的分析,快速生成一个类似的答案。

总结
ChatGPT并没有像传统程序那样逐一遍历字符串,而是基于对字符和单词模式的理解,快速生成了答案。

扩展

  • 为什么大模型连”Strawberry”的”r”都数不对?
    • 大模型的生成过程本质上便是在“根据上文预测下一个Token”,而这个概率分布即是在模型训练过程中从大量的文本数据中学习到的,使得大模型学习到了语言的基本知识与模式。
    • 在Prompt中加入一定的引导就能获得理想答案,比如说我们可以利用CoT思维链的方式编写Prompt,引导大模型逐步思考并解决问题。
    • CoT为思维链(Chain-of-Thought)的缩写简称,是提示工程领域最为重要的提示方法之一,它的核心思路在于通过引导模型逐步展示其推理过程,从而提高其理解和解决复杂问题的能力。在Few-shot(少样本)设置下表现为 在提供的样例中解释推理过程,引导大模型回答时也解释推理过程;而在Zero-shot(零样本)设置下表现为 加入类似“让我们一步步思考(Let’s think step by step)”的引导话术。
    • 对于大模型而言,它的语言本身即是思考,并不存在诉诸于语言之前的思考过程,所以我们也需要引导它像人类一样先思考再判断,将思考过程以语言的方式表达出来。
    • 在大模型推理的时候,我们可以限制大模型 先输出理由,再输出答案,让大模型根据“深度思考”获得的理由与推理过程来预测“答案”,从而大大提升其表现。

数学中9.11和9.9哪个大

From Grok3 (2025-02-25)

【普通提问】

  • 在数学中,9.11 比 9.9 大。因为 9.11 = 9 + 0.11,而 9.9 = 9 + 0.9,比较小数部分时,0.11 < 0.9 不成立,实际上 0.11 > 0.9 是错误的表述,正确的比较是直接看数值:9.11 > 9.9。

【DeepSearch】

  • 9.9 比 9.11 大
    • 关键点:在数学中,9.9 似乎比 9.11 大,因为它们的整数部分相同,比较小数部分时,9.9 的十分位是 9,而 9.11 的十分位是 1,9 大于 1。
  • 比较过程
    • 整数部分:两个数都是 9,相同。
    • 小数部分:9.9 可以写成 9.90,比较十分位,9.9 的十分位是 9,9.11 的十分位是 1,9 > 1,因此 9.9 更大。
    • 意外细节:一些 AI 模型可能会错误地认为 9.11 比 9.9 大,这可能是因为误解了日期比较(如 9 月 11 日比 9 月 9 日晚),但在数学中,小数比较遵循严格的位数规则。
  • (这里省略了列举了很多查阅网上资料库的细节)

【Think】

在数学中,我们需要比较9.11和9.9这两个数的大小。下面我们一步步分析:

  1. 将小数对齐
    • 为了方便比较,我们可以把9.9写成9.90,这样它的小数位数与9.11相同:
      • 9.11 有两位小数。
      • 9.9 写成 9.90 后也有两位小数。
  2. 逐位比较
    • 现在我们比较 9.11 和 9.90:
      • 整数部分:
        9.11 的整数部分是 9,9.90 的整数部分也是 9,两个数相等。
      • 小数第一位:
        9.11 的小数第一位是 1,9.90 的小数第一位是 9。
        因为 1 < 9,我们可以在这里得出结论,不需要再比较后续位数。
  3. 结论
    通过逐位比较,我们发现 9.11 < 9.90,也就是说 9.11 < 9.9。
    或者简单计算:
    9.11 - 9.9 = 9.11 - 9.90 = -0.79 < 0,也说明 9.11 比 9.9 小。

最终答案
在数学中,9.9 比 9.11 大。


一个汉字具有左右结构,左边是木,右边是乞。这个字是什么?只需回答这个字即可。

Grok3 (2025-02-25)

【普通提问】

  • 杞

【DeepSearch】

  • 要点

    • 看起来,符合条件的汉字可能是“述”(shù),但这并不是完全确定的答案,因为“乞”(qǐ,意为“乞讨”)的结构与“述”的右边“口”(mouth)有一定关联,但不完全匹配。
    • 研究表明,汉字的左右结构通常由偏旁组成,左边“木”(wood)是常见偏旁,右边“乞”可能指代相关部件,但标准汉字中难以找到完全符合的例子。
    • 证据倾向于认为,可能存在误解,“乞”可能指代包含“手”和“口”的结构,但这需要进一步确认。
  • 最终建议

    • 基于以上分析,推荐的答案是“述”(shù),但需注意这可能不是完全精确的匹配,建议用户进一步确认“乞”在问题中的具体含义。
  • 好多废话。。。。还答错。。。

【Think】

  • 杞

ChatGPT (2025-02-25)

GPT-4o-mini

  • 这个字是“弃”。

GPT-4o

  • 杞

o3-mini

  • 杞

claude (2025-02-25)

claude 3.7 Sonnet

  • 杞

豆包 (2025-02-25)

  • 杚

Gemini (2025-02-25)

Gemini 2.0 Flash

  • 这个字是“<0xE6><0xA7><0x8E>”

Gemini 2.0 Flash Thinking Experimental

  • 这个字是㮆 ()。

Gemini 2.0 Flash Thinking Experimental with apps

  • কাঠ

perplexity (2025-02-25)

Deep Research

  • 没有找到一个汉字左边是“木”,右边是“乞”的组合。可能是由于字形或部首的错误识别。

deepseek (2025-02-25)

DeepThink(R1)

  • 杚

结论

  • 只有豆包和deepseek答对。因为是生僻字中文?还是偷偷给大模型加了插件?还是人家就是这么强? (2025-02-25)


扩展

“Grok3”的“DeepSearch”和“Think”这两个功能的作用

From Grok3 (2025-02-25)

  • DeepSearch 是Grok 3的一个增强型研究工具,专注于从外部资源(如网络和X平台)获取实时信息,并将其整合成简洁、准确的回答。
  • Think 是Grok 3的推理模式,专注于通过逐步思考来解决需要逻辑分析或复杂计算的问题。
  • 两者的区别与适用场景
    • 数据来源:DeepSearch依赖外部数据(网络和X),而Think主要依赖Grok自身的知识和推理能力。
    • 任务类型:DeepSearch适合需要实时信息或广泛研究的问题(如新闻、趋势);Think适合需要逻辑推导或计算的问题(如数学、编程)。
    • 输出方式:DeepSearch给出综合性答案,Think展示详细的推理步骤。
  • 总结
    • DeepSearch:你的“研究助手”,帮你查资料、整理信息。
    • Think:你的“推理伙伴”,帮你解难题、想清楚。
12…16>

153 日志
165 标签
RSS
© 2025 Kingson Wu
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4