自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(86)
  • 收藏
  • 关注

原创 15|BabyAGI:根据气候变化自动制定鲜花存储策略

一种新型的代理——Autonomous Agents(自治代 理或自主代理), 在 LangChain 的代理、工具和记忆这些组件的支持下,。

2024-03-19 22:36:05 648

原创 14|CAMEL:通过角色扮演脑暴一个鲜花营销方案

定义 CAMELAgent 类。这是一个核心类,用于管理与语言模型的交互。它包含了初始 化消息、更新消息和与模型进行交互的方法。# 定义CAMELAgent类,用于管理与语言模型的交互self,) -> None:"""重置对话消息""""""初始化对话消息""""""更新对话消息列表""""""进行一步交互,并获取模型的响应"""CAMEL 框架的实现 角色扮演 、 任务的具体化 、 初始提示的设定 、 交互规范。

2024-03-19 22:34:32 1014

原创 13|连接数据库:通过链和代理查询鲜花信息

告诉计算机要做什么”的编程范式向“告诉计算机我们想要什么”的范式的转变。更大的可达性:不再需要深入的技术知识或特定的编程背景。这意味着非技术人员,比如业 务分析师、项目经理甚至是终端用户,都可以直接与数据交互。高效率与生产力:传统的编程方法需要大量的时间和努力,尤其是在复杂的数据操作中。自 然语言处理和理解能够显著减少这种负担,使得复杂的数据操作变得更加直观。错误的减少:许多编程错误源于对特定语法或结构的误解,通过使用自然语言,这些源于误 解的错误将大大减少。

2024-03-19 22:30:52 1164

原创 12|检索增强生成:通过RAG助力鲜花运营

【第二种是 embed_query 方法,为查询创建嵌入】一直有个疑问,如果query是需要“复杂理 解”的,那么是怎么通过“相似度”去match到文档内容的呢。比如文档是一片小说,而query 是:请解读文中描写主人翁心理活动的部分?这里面 LangChain 是否做了特殊处理?问题特别好。这边LangChain并没有做特别的处理,而目前的LLM还无法处理超长的 文本。那么,首先:你的问题要非常细。解读心理活动,解读那部分?哪年哪月?哪个环境?你泛 泛,回答肯定不准。

2024-03-19 22:29:41 899

原创 11|代理(下):结构化工具对话、Self-Ask with Search以及 Plan and execute代理

Playwright是一个开源的自动化框架,它可以让你模拟真实用户操作网页,帮助开发者和测试者自动化网页交互和测试。安装Playwright工具。还需要通过命令来安装三种常用的浏览器工具。通过Playwright浏览器工具来访问一个测试网页def run():# 使用Playwright上下文管理器# 使用Chromium,但你也可以选择firefox或webkit# 创建一个新的页面# 导航到指定的URL# 获取并打印页面标题。

2024-03-19 22:27:28 989

原创 10|代理(中):AgentExecutor究竟是怎样驱动模型和工具完成任务的?

这些本质上都是给大模型提供Prompt, Prompt是会越来越多的,可以看看langchain是怎么解决 token上限。此外,在AgentExecutor中,还构建了自主计划和调用 工具的逻辑。Profile : 定义了Agent的个性、知识和经验。提供了“选择操作序列”时推理所需的高层次背景信息。当Agent处理特定的任务时,它会考虑Profile中的信息来做出与其“个性”和“经验”相一致的决策。Memory (记忆): 让Agent能够记住之前的交互和决策,帮助其更好地适应和处理后续的任务。

2024-03-18 22:42:06 1016

原创 09|代理(上):ReAct框架,推理与行动的协同

也就是说,因为缺乏和外部世界的接触,大模型只拥有训练时见过的知识,以及提示信息中作为上下文提供的附加知识。如果你问的问题超出它的知识范围,要么大模型向你坦白:“我的训练时间截至XXXX年XX月XX日”,要么它就会开始一本正经地胡说。

2024-03-18 22:40:21 323

原创 08|记忆:通过Memory记住客户上次买花时的对话细节

无论是LLM还是代理都是无状态的,每次模型的调用都是独立于其他交互的。也就是说,我们每次通过API开始和大语言模型展开一次新的对话,它都不知道你其实昨天或者前天曾经和它聊过天了。{history} 是存储会话记忆的地方,也就是人类和人工智能之间对话历史的信息。{input} 是新输入的地方,你可以把它看成是和ChatGPT对话时,文本框中的输入在LangChain中,通过ConversationBufferMemory(缓冲记忆)可以实现最简单的记忆机制。实际上,这些聊天历史信息,都被传入了

2024-03-18 22:36:39 919

原创 07|链(下):想学“育花”还是“插花”用RouterChain确定客户意图

RouterChain,也叫路由链,能动态选择用于给定输入的下一个链。我们会根据用户的问题内容,首先使用路由器链确定问题更适合哪个处理模板,然后将问题发送到该处理模板进行回答。如果问题不适合任何已定义的处理模板,它会被发送到默认链.

2024-03-18 22:33:38 260

原创 06|链(上):写一篇完美鲜花推文?用SequencialChain链接不同的组件

如果你想开发更复杂的应用程序,那么就需要通过 “Chain” 来链接LangChain的各个组件和功能——模型之间彼此链接,或模型与其他组件链接。首先LangChain通过设计好的接口,实现一个具体的链的功能。例如,LLM链(LLMChain)能够接受用户输入,使用 PromptTemplate 对其进行格式化,然后将格式化的响应传递给 LLM。这就相当于把整个Model I/O的流程封装到链里面。实现了链的具体功能之后,我们可以通过将多个链组合在一起,或者将链与其他组件组合来构建更复杂的链。

2024-03-18 22:30:07 648

原创 05|输出解析:用OutputParser生成鲜花推荐列表

先创建了一个空的DataFrame,用于存储从模型生成的描述。接下来,通过一个名为FlowerDescription的Pydantic BaseModel类,定义了期望的数据格式(也就是数据的结构)。# 创建一个空的DataFrame用于存储结果# 数据准备flowers = ["玫瑰", "百合", "康乃馨"]# 定义我们想要接收的数据格式flower_type: str = Field(description="鲜花的种类")

2024-03-18 22:28:19 1093

原创 04|调用模型:使用OpenAI API还是微调开源Llama2/ChatGLM?

想训练属于自己的模型。而且出于商业秘密的原因,不想开源它,不想上传到HuggingFace,就是要在本机运行模型。此时应该如何利用LangChain的功能?我们可以创建一个LLM的衍生类,自己定义模型。而LLM这个基类,则位于langchain.llms.base中,通过from langchain.llms.base import LLM语句导入。_call方法:用于接收输入字符串并返回响应字符串。_identifying_params方法:用于帮助打印此类的属性。

2024-03-18 22:24:24 765

原创 03|提示工程(下):用思维链和思维树提升模型思考质量

CoT这个概念来源于学术界,是谷歌大脑的Jason Wei等人于2022年在论文《(自我一致性提升了语言模型中的思维链推理能力)》中提出来的概念。它提出,如果生成一系列的中间推理步骤,就能够显著提高大型语言模型进行复杂推理的能力。CoT的核心思想是通过生成一系列中间推理步骤来增强模型的推理能力。在Few-Shot CoT和Zero-Shot CoT两种应用方法中,前者通过提供链式思考示例传递给模型,后者则直接告诉模型进行要按部就班的推理。

2024-03-18 22:21:14 819

原创 02|提示工程(上):用少样本FewShotTemplate和ExampleSelector创建应景文案

在Open AI的官方文档 GPT 最佳实践中,也给出了和上面这两大原则一脉相承的6大策略。分别是:也可以通过提示模板类的构造函数,在创建模板时手工指定input_variables对于OpenAI推出的ChatGPT这一类的聊天模型,LangChain也提供了一系列的模板,这些模板的不同之处是它们有对应的角色。消息必须是消息对象的数组,其中每个对象都有一个角色(系统、用户或助理)和内容。对话可以短至一条消息,也可以来回多次。通常,对话首先由系统消息格式化,然后是交替的用户消息和助理消息。故事:今

2024-03-18 22:18:27 852

原创 01|模型IO:输入提示、调用模型、解析输出

50元就可以拥有这支充满浪漫气息的玫瑰花束,让TA感受你的真心爱意。reason: “因为爱情是无价的,50元对应热恋中的情侣也会觉得值得。:“文案是:让你心动!50元就可以拥有这支充满浪漫气息的玫瑰花束,让TA感受你的真心爱意。因为爱情是无价的,50元对应热恋中的情侣也会觉得值得。具体的提示:“您是一位专业的鲜花店文案撰写员。对于售价为 50 元的玫瑰,您能提供一个吸引人的简短描述吗?(对应图中的Parse)。(对应图中的Predict)和。在开发具体应用的过程中,很明显。(对应图中的Format)、

2024-03-18 22:14:27 772

原创 《开发实战》18 | 数据存储:NoSQL与RDBMS如何取长补短、相辅相成?

这张索引表的大部分列都可以建上二级索引,用于进行简单搜索,搜索的结果是主键的列表,而不是完整的数据。但,由于 ES 的索引是文档维度的,所以不适用于频繁更新的 OLTP 业务。一般而言,我们会把 ES 和 MySQL 结合使用,MySQL 直接承担业务系统的增删改操作,而ES 作为辅助数据库,直接扁平化保存一份业务数据,用于复杂查询、全文搜索和统计。由统一的查询服务,对接所有查询需求,根据不同的查询需求路由查询到合适的存储,确保每一个存储系统可以根据场景发挥所长,并分散各数据库系统的查询压力。

2023-09-25 21:11:03 302

原创 《开发实战》17 | 异步处理好用,但非常容易用错

大多数业务项目都是由同步处理、异步处理和定时任务处理三种模式相辅相成实现的。异步处理因为可以有 MQ 中间件的介入用于任务的缓冲的分发,所以相比于同步处理,在应对流量洪峰、实现模块解耦和消息广播方面有功能优势。用三个代码案例结合目前常用的 MQ 系统 RabbitMQ讲解。

2023-09-24 10:43:22 125

原创 《开发实战》16 | 缓存设计:缓存可以锦上添花也可以落井下石

第一,从客户端的角度来说,缓存数据的特点一定是有原始数据来源,且允许丢失,即使设置的缓存时间是 1 分钟,在 30 秒时缓存数据因为某种原因消失了,我们也要能接受。我们的做法是,空间换效率,同一个key保留2份,1个不带后缀,1个带后缀,不带的后缀的有ttl,带后缀的没有,先查询不带后缀的,查询不到,做两件事情:1、后台程序查询DB更新缓存;,对于不存在的数据,同样设置一个特殊的 Value 到缓存中,比如当数据库中查出的用户信息为空的时候,设置 NODATA 这样具有特殊含义的字符串到缓存中。

2023-09-24 10:27:11 163

原创 《开发实战》15 | 接口设计:系统间对话的语言,一定要统一

但 info 里却提示订单存在风险,code 是一个 5001 的错误码,data 中能看到订单状态是 Cancelled,订单 ID 是 -1,好像又说明没有下单成功。有一个文件上传服务 FileService,其中一个 upload 文件上传接口特别慢,原因是这个上传接口在内部需要进行两步操作,首先上传原图,然后压缩后上传缩略图。如果做大的功能调整或重构,涉及参数定义的变化或是参数废弃,导致接口无法向前兼容,这时接口就需要有版本的概念。接下来,我们看看异步的上传文件接口如何实现。

2023-09-23 17:05:03 123

原创 《开发实战》14 | Spring框架:IoC和AOP是扩展的核心

许多开发同学认为,@Service 注解的意义在于,能通过 @Autowired 注解让 Spring 自动注入对象,就比如可以直接使用注入的 List获取到 SayHello 和 SayBye,而没想过类的生命周期,这一个点非常容易忽略。而开发子类的同学,没多想就直接标记了 @Service,让类成为了 Bean,通过 @Autowired 注解来注入这个服务。如果以容器为依托来管理所有的框架、业务对象,我们不仅可以无侵入地调整对象的关系,还可以无侵入地随时调整对象的属性,甚至是实现对象的替换。

2023-09-03 17:39:14 215

原创 《开发实战》13 | 用好Java 8的日期时间类,少踩一些“老三样”的坑

因此只能在同一个线程复用 SimpleDateFormat,比较好的解决方式是,通过 ThreadLocal 来存放 SimpleDateFormat:

2023-09-03 17:35:32 172

原创 《开发实战》12 | 异常处理:别让自己在出问题的时候变为瞎子

public static BusinessException ORDEREXISTS = new BusinessException("订单已经存在");...try {try {//这里有问题//这里有问题cancelOrder got error 的提示对应了 createOrderWrong 方法。显然,cancelOrderWrong 方法在出错后抛出的异常,其实是 createOrderWrong 方法出错的异常修复方式。

2023-08-29 20:06:12 77

原创 《开发实战》11 | 空值处理:分不清楚的null和恼人的空指针

解决空指针异常,还是要真正 case by case 地定位分析案例,然后再去做判空处理,而处理时也并不只是判断非空然后进行正常业务流程这么简单,同样需要考虑为空的时候是应该出异常、设默认值还是记录日志等。如果是分支复杂的业务逻辑,你需要再借助 stack 命令来查看 wrongMethod 方法的调用栈,并配合 watch 命令查看各方法的入参,就可以很方便地定位到空指针的根源了。有时候线上的空指针异常是很难排查的,因为是不能打断点的,往往是将代码进行拆分,或者添加日志。

2023-08-29 19:58:53 289

原创 《开发实战》10 | 集合类:坑满地的List列表操作

使用 ObjectSizeCalculator 工具打印 ArrayList 和 HashMap 的内存占用,可以看到 ArrayList 占用内存 21M,而 HashMap 占用的内存达到了 72M,是 List 的三倍多。讽刺的是,LinkedList 的作者约书亚 · 布洛克(Josh Bloch),在其推特上回复别人时说,虽然 LinkedList 是我写的但我从来不用,有谁会真的用吗?这个List 包含的其实是一个 int 数组,整个 List 的元素个数是 1,元素类型是整数数组。

2023-08-08 21:03:56 83

原创 《开发实战》09 | 数值计算:注意精度、舍入和溢出问题

国外的计算程序使用的是单步计算法。在单步计算法中,a+b%代表的是 a*(1+b%)。所以,手机计算器计算 10%+10% 时,其实计算的是10%*(1+10%),所以得到的是 0.11 而不是 0.2。

2023-08-08 20:57:26 177

原创 《开发实战》08 | 判等问题:程序里如何确定你就是你?

之前遇到过一个坑:重启后,两个对象相等,结果是true,但是修改了某些东西后,热加载(不用重启即可生效)后,再次执行equals,返回就是false,因为热加载使用的类加载器和程序正常启动的类加载器不同。这种机制,就是字符串驻留或池化。因为引用类型的直接值是指针,使用 == 的话,比较的是指针,也就是两个对象在内存中的地址,即比较它们是不是同一个对象,而不是比较对象的内容。对基本类型,比如 int、long,进行判等,只能使用 ==,比较的是直接值。对象的判断,默认的equals比较的是对象的引用。

2023-08-08 20:54:55 77

原创 《开发实战》07 | 数据库索引:索引并不是万能药

第一,无需一开始就建立索引,可以等到业务场景明确后,或者是数据量超过 1 万、查询变慢后,再针对需要查询、排序或分组的字段创建索引。第三,尽量不要在 SQL 语句中 SELECT *,而是 SELECT 必要的字段,甚至可以考虑使用联合索引来包含我们要搜索的字段,既能实现索引加速,又可以避免回表的开销。虽然二级索引不保存原始数据,但要保存索引列的数据,所以会占用更多的空间,有时候索引的数据占的内存会比数据本身的占的内存大。把聚簇索引中的记录依次和给定的搜索条件做比较,把符合搜索条件的记录加入结果集的过程。

2023-07-22 17:23:39 59

原创 《开发实战》06 | 20%的业务代码的Spring声明式事务,可能都没处理正确

因为Spring默认通过动态代理的方式实现 AOP,对目标方法进行增强,private 方法无法代理到。默认情况下,出现 RuntimeException(非受检异常)或 Error 的时候,Spring才会回滚事务。( otherTask 文件读取操作,文件不存在会抛出一个IOException,是受检异常,无法传播)只有异常传播出了标记了 @Transactional 注解的方法,事务才能回滚,必须通过代理过的类从外部调用目标方法才能生效。8、数据库本身不支持事务。7、没有配置事务管理器。

2023-07-22 17:13:39 59

原创 《Java8实战》第12章 新的日期和时间 API

Duration 类的静态工厂方法 between 就是为这个目的而设计的。由于 LocalDateTime 和 Instant 是为不同的目的而设计的,一个是为了便于人阅读使用,另一个是为了便于机器处理,因此不能将二者混用。如果你试图在这两类对象之间创建Duration,就会触发一个 DateTimeException 异常。

2023-04-19 20:26:46 787

原创 《Java8实战》第11章 用 Optional 取代 null

在你的代码中始终如一地使用 Optional,能非常清晰地界定出变量值的缺失是结构上的问题,还是算法上的缺陷,抑或是数据中的问题。与此相反,它的目标是帮助你更好地设计出普适的 API,让程序员看到方法签名,就能了解它是否接受一个 Optional 的值。这段代码的表述相当清晰。Java 9 引入了 Optional 的 stream()方法,使用该方法可以把一个含值的 Optional 对象转换成由该值构成的 Stream 对象,或者把一个空的 Optional 对象转换成等价的空 Stream。

2023-04-19 20:24:18 635

原创 《Java8实战》第9章 重构、测试和调试

如果你发现你需要频繁地从客户端代码去查询一个对象的状态(比如前文例子中的日志器的状态),只是为了传递参数、调用该对象的一个方法(比如输出一条日志),那么可以考虑实现一个新的方法,以 Lambda 或者方法引用作为参数,新方法在检查完该对象的状态之后才调用原来的方法。匿名类的类型是在初始化时确定的,而 Lambda 的类型取决于它的上下文,这样可能会使代码更加晦涩。但是为了代码的可读性,尽量使用方法引用。第3章讲过,就是前后的代码都是相同的,但是中间的代码不同,使用这种模式,可以减少代码的冗余。

2023-04-19 20:21:31 925

原创 《Java8实战》第8章 Collection API 的增强功能

ConcurrentHashMap 类还提供了一个新的 keySet 方法,该方法以 Set 的形式返回ConcurrentHashMap 的一个视图(Map 中的变化会反映在返回的 Set 中,反之亦然)。规模比较大的话,就使用Map.ofEntries 的工厂方法,该工厂方法接受以变长参数列表形式组织的 Map.Entry对象作为参数。从 Java 8 开始,Map 接口开始支持 forEach 方法,该方法接受一个 BiConsumer,以 Map的键和值作为参数。

2023-04-19 20:17:36 771

原创 《Java8实战》第7章 并行数据处理与性能

这是一个全局设置,因此它会对代码中所有的并行流产生影响。并行流内部使用了默认的 ForkJoinPool(7.2节会进一步讲到分支/合并框架),它默认的线程数量就是你的处理器数量,这个值是由 Runtime.getRuntime().availableProcessors()得到的。要把任务提交到这个池,必须创建 RecursiveTask的一个子类,其中 R 是并行化任务(以及所有子任务)产生的结果类型,或者如果任务不返回结果,则是 RecursiveAction类型(当然它可能会更新其他非局部机构)

2023-04-19 20:13:20 672

原创 《Java8实战》第6章 用流收集数据

函数式编程相对于指令式编程的一个主要优势:你只需指出希望的结果——“做什么”,而不用操心执行的步骤——“如何做”。将流元素归约和汇总为一个值;元素分组;元素分区。

2023-04-17 20:44:31 389

原创 《Java8实战》第5章 使用流

Optional类(java.util.Optional)是一个容器类,代表一个值存在或不存在。Optional 里面几种可以迫使你显式地检查值是否存在或处理值不存在的情形的方法。

2023-04-10 22:15:28 543

原创 《Java8实战》第4章 引入流

流简短的定义就是“从支持数据处理操作的源生成的元素序列”元素序列——就像集合一样,流也提供了一个接口,可以访问特定元素类型的一组有序值。集合讲的是数据,流讲的是计算。源——流会使用一个提供数据的源,比如集合、数组或 I/O 资源。由列表生成的流,其元素顺序与列表一致。数据处理操作——流的数据处理功能支持类似于数据库的操作,以及函数式编程语言中的常用操作,比如 filter、map、reduce、find、match、sort 等。流操作可以顺序执行,也可以并行执行。流水线。

2023-04-10 22:12:02 375

原创 《Java8实战》第3章 Lambda 表达式

以把 Lambda 表达式理解为一种简洁的可传递匿名函数:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。这个定义够大的,让我们慢慢道来。

2023-04-10 21:52:56 659

原创 《Java8实战》第2章 通过行为参数化传递代码

一个系统需求,今天需要找全是绿色的苹果,明天说要找大于150G的水果,后天要找体积大于120立方厘米的苹果。如果这样子,你的代码就需要一直改。就是可以帮助你处理频繁变更的需求的一种软件开发模式。

2023-04-10 21:50:16 202

原创 《Java8实战》第1章 Java 8、9、10 以及 11 的变化

前面的代码传递了方法 Apple::isGreenApple(它接受参数 Apple 并返回一个boolean)给 filterApples,后者则希望接受一个 Predicate参数。谓词(predicate)在数学上常常用来代表类似于函数的东西,它接受一个参数值,并返回 true 或 false。

2023-04-10 21:45:03 477

原创 05 | HTTP调用:你考虑到超时、重试、并发了吗?

客户端发送数据到服务端,首先接力连接(TCP),然后写入TCP缓冲区,TCP缓冲区根据时间窗口,发送数据到服务端,因此写入操作可以任务是自己本地的操作,本地操作是不需要什么超时时间的,如果真的有什么异常,那也是连接(TCP)不上,或者超时的问题,连接超时和读取超时就能覆盖这种场景。是服务处理超时,指的是,向 Socket 写入数据后,我们等到 Socket 返回数据的超时时间,其中包含的时间或者说绝大部分的时间,是服务端处理业务逻辑的时间。按理还说,爬一次需要1秒,那么我并发10个线程爬,也是耗时1秒。

2023-04-10 21:04:32 688

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除