LangChain快速开始
代码仓库ChainReaction 本指南将帮助你在几分钟内从简单的设置到构建一个功能完整的AI智能体。 构建基础智能体 Quickstart.py 首先创建一个简单的智能体,能够回答问题并调用工具。该智能体将使用DeepSeek作为语言模型,一个基础的天气函数作为工具,以及一个简单的提示来指导其行为。 对于此示例,你需要设置一个 DeepSeek 账户并获取API密钥。然后,在你的终端中设置 DEEPSEEK_API_KEY 环境变量,或创建.env文件,通过 python-dotenv 加载它。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051import os # 导入操作系统接口模块,用于访问环境变量等系统功能from langchain_openai import ChatOpenAI # 导入LangChain的OpenAI聊天模型类,用于与AI模型进行交互from dotenv import load_dotenv # 导入...
友元
代码仓库shanchuann/CPP-Learninng 基本概念在C++面向对象编程中,封装是核心特性之一。类通过private和protected访问控制符,将内部数据和实现细节隐藏起来,仅暴露public接口与外部交互,以此保证数据安全和代码的可维护性。但在某些场景下,这种严格的封装可能带来不便——比如两个紧密协作的类需要互相访问对方的内部状态,或者某个外部函数需要直接操作类的私有成员以实现特定功能(如运算符重载)。此时,友元机制便提供了一种灵活的解决方案,它允许特定的外部实体临时获得访问类私有成员的权限,成为类的“特殊访客”。 友元可以是函数,也可以是类,甚至可以是另一个类的某个成员函数。它们的共同特点是,一旦被类声明为友元,就能够绕过访问控制符的限制,直接访问类中的private和protected成员。这种机制并非破坏封装的设计,而是在保证整体封装性的前提下,为特殊场景提供的灵活接口。 外部函数的特殊访问权普通函数可以被声明为友元函数。要将一个函数声明为类的友元,只需在类的内部(通常是public区域,也可在private或protected区域...
Linux进程复制与替换
在Linux系统中,fork()是创建新进程的核心系统调用,它通过“复制父进程”生成子进程,二者形成独立但关联的执行单元。理解fork()的返回特性、父子进程关系及底层优化机制,是掌握多进程编程的基础。 fork()函数的基本用法与返回特性fork()函数用于创建新进程,调用者为父进程,新生成的进程为子进程,其核心特点是“一次调用,两次返回”,返回值是区分父子进程的关键。 函数定义与返回值fork()的函数原型为: 12#include <unistd.h>pid_t fork(void); 返回值类型:pid_t本质是int类型(Linux内核中通过typedef定义),用于表示进程ID。 返回规则(核心特性): 父进程中:返回子进程的PID(正整数),用于父进程识别和管理子进程; 子进程中:返回0(无特殊含义,仅作为子进程的标识); 失败时:返回**-1**(如系统资源不足、进程数达到上限),并设置errno提示错误原因。 父子进程的执行逻辑fork()调用后,子进程并非从main函数开始执行,而是从fork()调用的下一行代码继续执行,且初始状态与父进...
Linux系统上的库文件生成与使用
库文件的基本概念库文件是一组预先编译好的函数、方法或数据的集合,封装了常用功能(如输入输出、字符串处理、数学计算等),目的是避免重复编写代码、简化工程编译流程。开发时只需引用库的“接口声明”(头文件),无需关注内部实现,编译时直接链接库文件即可使用其功能。 Linux系统中,库文件的存储位置有明确规范: 库文件本体:主要存于 /lib(系统核心库)、/usr/lib(用户级库);64位系统额外有 /usr/lib64(64位专用库); 库的头文件:对应存于 /usr/include 或其下子目录(如数学库头文件 math.h 在 /usr/include,OpenGL库头文件在 /usr/include/GL)。 两种核心库文件:静态库与共享库Linux下的库分为静态库和共享库(也称动态库),二者在命名规则、编译链接方式、使用场景上差异显著,核心区别在于“是否将库代码嵌入可执行文件”。 静态库(Static Library)静态库是“编译时完整嵌入可执行文件”的库,一旦链接,可执行文件便不再依赖原库文件,独立运行。 核心特征 命名规则:固定以 lib 开头、....
Linux系统上C程序的编译与调试
gcc 分步编译链接GCC(GNU Compiler Collection)是一套功能强大的编译器套件,可将 C/C++ 等源代码转化为可执行程序。从源代码(.c)到可执行程序的过程分为预编译、编译、汇编、链接四个核心阶段,每个阶段生成特定格式的中间文件,最终输出可执行程序。这些过程共同搭建了从 “人类可读的高级语言” 到 “机器可执行的二进制指令” 的桥梁,最终产物需加载到计算机存储器(内存)中,由控制器按指令顺序调度,运算器执行算术 / 逻辑运算,通过输入设备(如键盘)获取数据,输出设备(如显示器)展示结果,完成程序功能。 预编译(Preprocessing)命令:gcc -E main.c -o main.i作用是处理源代码中的预处理指令,生成预处理后的文本文件(.i)。具体操作包括展开所有#include头文件(将头文件内容插入当前文件)、处理所有#define宏定义(替换宏名与宏体,删除#define指令)、删除注释(//或/*...*/)、处理条件编译指令(如#if、#elif、#else、#endif,保留满足条件的代码)。输出文件为main.i...
Linux目录结构介绍
Linux系统的使用前置工作我在这里就不做赘述,大家尽可以选择喜欢的或是方便的方法来学习,我这里使用的是虚拟机+Ubuntu22.04和WSL Ubuntu24.04,大部分操作会在Linux子系统完成,涉及到图片等内容还是会去Ubuntu下截屏 目录结构介绍Linux 目录结构 Linux 目录结构是单根倒树状结构,所有目录都从根目录(/)衍生,遵循以下核心规则: 根目录唯一:所有文件 / 目录的起点都是 /,无 Windows 的 C 盘、D 盘概念。 FHS 标准:目录功能由 FHS 统一规定,确保不同 Linux 发行版(如 Ubuntu、CentOS)目录结构一致。 文件类型无关路径:无论文件是普通文件、设备文件还是虚拟文件,都通过目录路径访问。 常用目录详解 目录路径 核心作用 补充细节 / 根目录 所有目录的顶层,仅存放一级子目录(如/bin、/etc),不直接存文件 /bin 普通用户常用命令 存放ls、cd、cp等所有用户可执行的基础命令,命令多为二进制文件 /sbin 管理员专用命令 补充基础目录遗漏项,存放ifconfig...
拷贝构造函数
代码仓库shanchuann/CPP-Learninng 在C++面向对象编程中,拷贝构造函数是一种特殊的构造函数,用于用已存在的对象创建新对象。它是对象生命周期管理的核心机制之一,理解拷贝构造函数的原理和使用场景,对编写安全、高效的C++代码至关重要。 123456789101112131415class Int {private: int value;public: Int() :value(0) { std::cout << "Default create Int" << "at" << this << std::endl; } Int(int v) :value(v) { std::cout << "Create Int with value " << value << " at " << this << std::endl; ...
operator
代码仓库shanchuann/CPP-Learninng 在C++中,operator关键字用于定义和重载运算符,使得自定义类的对象可以使用标准运算符进行操作,从而提高代码的可读性和可维护性。 运算符重载的基本概念 作用:operator主要有两个作用,一是操作符的重载,二是操作符的转换。操作符重载是对C++进行扩展,让自定义类的对象能够像内置类型一样使用运算符。 可重载与不可重载的操作符:可重载的操作符包括+、-、*、/、%、^、&、|、~、!、=、<、>等;不可重载的操作符有.、.*、::、?:等。 运算符重载的语法运算符重载通过定义一个特殊的成员函数或友元函数来实现,其基本语法为:返回类型 operator 运算符 (参数列表)。例如,重载+运算符: 123456789class Complex {public: double real, imag; Complex(double r, double i) : real(r), imag(i) {} // 重载 + 运算符 Comple...
构造和析构
代码仓库shanchuann/CPP-Learninng 在C++中,构造函数和析构函数是类的特殊成员函数,分别用于对象的初始化和资源清理,它们由编译器自动调用,是面向对象编程中管理对象生命周期的核心机制。 this指针编译器对类型编译的过程中分为三个部分 **类型解析:**编译器首先对代码中的类型声明进行解析,识别类型的定义、成员结构(如类的成员变量和成员函数)、继承关系等信息。 函数识别:在语义分析阶段,编译器基于类型解析的结果,对程序中的函数返回类型、函数名、参数类型进行识别。 **成员方法改写:**无论成员方法是公有私有,他会对非静态成员方法加入常性this指针。 12345678910111213141516171819202122232425262728293031class Pointer {private: int row, col;public: void SetRow(int r) { row = r; } /* void SetRow(Pointer *const this...
关于spec-kit的使用经历
前几天我编写的《C语言圣经》成功配置并发布到互联网上,苦于没有合适的练习系统,又因为之前参加了一个训练营,其中的rustlings让我格外喜欢,因此也想做一个控制台交互程序来进行C语言的练习。 很可惜本人对相关脚本的知识八窍通了七窍,只好寄希望于AI来实现。这个系统的第一个版本是由cursor来为我设计并成功运行的,他由于是我第一次进行AI设计我毫无涉及领域的内容,因此只能浮于表象对大模型只通过自然语言对其进行鞭笞。不过好在最后成功上线Github上并给其命名为CStudy。 显而易见的,我对他的功能并不满意,因此我删掉了存储库后这个项目便一直搁置,知道前段时间我将Gitbook上传才重新开始编写。 这次我用的是字节跳动的Trea,参加过Cursor Meetup Xi’an后我尝试使用设计文档下的微调开发模式,先行给他一个设计文档,再根据模型的反馈进行逐步微调。但是Trea_CN的内置模型用到最后又变成了我面向结果的开发过程,导致整个项目混乱到像是恋爱关系,只好又清空文档,将目光投向前几天刷到的spec-kit上。 规范驱动开发颠覆了传统软件开发的脚本。几十年来,代码一直是王...







