- 博客(45)
- 收藏
- 关注
原创 探索 HTTP 请求头中的 “Host” 字段及其安全风险
在 HTTP 请求头中,“Host”字段是一个至关重要的部分。它告诉服务器,我们访问的目标域名是什么。这在共享 IP 地址的服务器上尤其重要,因为同一台服务器上可能托管了多个不同的网站。“Host”字段在 HTTP 请求中有着重要作用,并在虚拟主机、代理服务器和安全访问等多个场景中得到广泛应用。然而,使用不当也可能带来安全风险,如 HTTP 主机头攻击。通过严格验证Host头、使用 HTTPS 和 HSTS、配置 WAF 以及反向代理验证等多种手段,可以有效防范此类攻击,保障应用安全。
2024-12-15 22:24:18
1846
2
原创 AI - 浅聊一下基于LangChain的AI Agent
简单来说,AI Agent就是一个能够自主进行任务的人工智能系统。它可以理解输入、处理数据并做出决策。比如自动客服机器人就在很多情况下充当AI Agent。AI Agent通过接收用户的指令和信息,利用内置的AI模型或算法进行处理,并提供相应的输出或采取行动。
2024-12-08 11:03:26
1091
2
原创 AI - RAG中的状态化管理聊天记录
状态和聊天记录对于聊天机器人来说非常重要,它们不仅帮助我们保持对话的一致性和上下文,还能提供更个性化和准确的服务。在实现上,我们可以根据需求选择内存、文件、数据库或者状态图等不同的方式来管理和保留聊天记录。如果有问题或者想要深入探讨,欢迎随时交流!
2024-12-07 22:58:40
1388
原创 AI - 谈谈RAG中的查询分析(2)
本文通过OpenAI语言模型和自定义检索工具,构建了一个智能问答系统。首先,从网络上加载和分割文档内容,并将其存储到向量数据库中。然后,定义一个检索工具,可以根据查询请求从数据库中寻找相关文档。使用状态图管理对话流程,根据不同条件,系统会决定是否调用检索工具或者直接生成回复。最终,通过与状态图交互,实现智能应答。这样一个系统大大增强了自动化问答的能力,通过结合嵌入模型和语言模型,能够处理更为复杂和多样化的用户查询。
2024-12-03 11:38:29
1006
原创 AI - 谈谈RAG中的查询分析
查询分析,说简单点,就是理解用户在问什么。在RAG系统中,用户输入一个查询,我们的任务是通过一些技术手段弄明白这个查询的真正意图。这个过程可以包括很多步骤,比如分词、实体识别、情感分析、上下文理解等等。就好比你走进一家图书馆,告诉馆员你在找一本关于古代历史的书,馆员会通过你提供的信息,给你推荐相关的书籍。查询分析就是这位“馆员”理解用户需求的那一部分。
2024-12-02 10:00:00
1227
原创 AI - 如何构建一个RAG应用程序
RAG是一种结合了信息检索和生成模型的技术,用来提升生成式模型的生成效果。简单来说,RAG先从一个大型文档集合中检索出与问题相关的信息片段,然后使用这些片段作为生成模型的辅助输入,生成更为准确和相关的回答。检索:首先,通过信息检索系统从一个大型的知识库中找到与问题相关的文档或文本片段。生成:然后,利用这些检索到的文档作为额外的上下文信息,由生成模型根据输入生成更为精确且相关的回答。
2024-12-01 11:28:12
1264
原创 AI - 如何构建一个大模型中的Tool
LangChain是一个框架,旨在帮助开发者用大语言模型(例如GPT-4)构建智能应用。通过LangChain,你可以将不同的数据源、模型和工具整合到一起,从而构建出复杂、功能强大的应用程序。在自然语言处理和大语言模型的领域,"工具"实际上指的就是一些可以执行特定任务的外部函数、API或者服务。比如说,你可以有一个工具来查询天气,一个工具来翻译文本,或者一个工具来进行复杂的数学计算。简单来说,工具就是那些帮助我们扩展大语言模型功能的小插件。这个函数就是一个简单的工具。
2024-11-30 22:50:06
1118
原创 认识领域驱动设计 (DDD) 的魅力(3) - 事件风暴篇
事件风暴(Event Storming)是一种集体头脑风暴的方法,旨在发现和理解系统中的关键业务事件。这种方法由Alberto Brandolini在2013年提出,旨在让所有相关人员(包括开发者、领域专家、业务分析师等)通过可视化的方式,快速、直观地捕捉领域知识。事件风暴的核心理念是通过"事件"来驱动讨论和设计。事件是指系统中发生的具有业务意义的活动,用过去时来描述。例如,“订单已创建”、“付款已完成”。事件风暴不仅可以帮助我们理解当前系统的业务流程,还可以发现潜在的问题和改进点。
2024-11-28 08:07:12
1203
原创 认识领域驱动设计 (DDD) 的魅力(2) - 基本概念篇
DDD 通过清晰的领域模型、限界上下文和领域服务等概念,帮助我们更好地应对复杂业务逻辑,提高系统的可维护性和扩展性。通过定义每个上下文及其边界,我们能够更有效地分解和管理复杂系统。
2024-11-24 12:01:58
815
原创 认识领域驱动设计 (DDD) 的魅力
领域驱动设计,顾名思义,就是从“领域”这个概念出发来设计和实现软件。这里的“领域”主要是指你的业务领域,无论是电子商务、金融、还是医疗等等,都有自己的业务规则和知识。DDD 强调的是我们要从业务逻辑出发,以业务需求为核心来构建系统。通过对业务领域的深刻理解,把业务逻辑和技术实现分开,形成一种更清晰、更具扩展性和维护性的设计方式。正如 DDD 的创始人Eric Evans所说:“领域驱动设计主要是关于意义和实现之间的关系。
2024-11-23 17:36:02
1168
原创 微服务设计模式 - 物化视图模式(Materialized View Pattern)
物化视图模式(Materialized View Pattern)是一种设计模式,用于预先计算并存储复杂查询的结果,以便在后续的查询中能够快速访问这些数据。通过将查询结果物化(即存储为物理表格),该模式可以极大地提高查询性能,尤其是在需要进行复杂计算和整合多个数据源时。物化视图模式通过预先计算并存储复杂查询结果,解决了实时查询时的高延迟和性能问题。在实际应用中,根据业务需求和数据更新频率选择合适的刷新的机制非常重要。希望这个简短的介绍和实战示例能帮助你理解和使用物化视图模式!
2024-11-20 17:09:55
2596
原创 C++20中的Concepts 与 Java/C#中的范型约束
C++20 引入了概念(Concepts),它是一种用来对模板参数进行约束的机制,能够提升模板编程的类型安全性和可读性。虽然 Java 和 C# 语言并没有直接等价于 C++20 概念(Concepts)的特性,但它们通过泛型约束和接口机制可以实现类似的功能。
2024-11-19 09:56:35
914
原创 C++20中的Concepts与TypeScript
虽然TypeScript没有完全等同于C++20的Concepts,但通过TypeScript的类型系统、泛型和类型约束,可以实现类似的功能。定义接口、使用类型约束,我们可以确保传递给函数的类型满足特定的条件,从而使代码更加健壮和类型安全。希望这些示例能帮助你更好地理解如何在TypeScript中实现类似C++20 Concepts的功能,同时,又可以让你对C++20 Concepts有更深入的理解。
2024-11-18 09:55:27
980
原创 C++20中的概念(Concepts)到底是什么概念?
C++20中的Concepts为模板编程带来了巨大的提升,让模板代码变得更加清晰、易读且易于维护。通过Concepts,我们可以明确指定模板参数应满足的要求,避免了在编译时因为不匹配的类型而报出一堆晦涩难懂的错误信息。
2024-11-17 15:31:57
1229
原创 你的服务器缓存中毒过么?
缓存,就像是一个临时存储空间,用来存储经常访问的数据,以便加快后续请求的速度。在网络世界中,这意味着网页、API响应和静态资源(如图片和脚本)会被缓存,以提高加载速度,减轻服务器负载。缓存中毒发生在攻击者往缓存中注入恶意数据,当缓存被“中毒”后,任何访问到这些缓存内容的用户都会得到假的或恶意版本,从而可能导致各种攻击,如网站篡改、钓鱼或恶意软件的分发。注意,这里的缓存指的是服务器中间缓存层,比如CDN、反向代理服务器等。
2024-11-16 10:37:18
1219
原创 HTTP CRLF注入攻击
CRLF注入是一种利用`Carriage Return`(`\r`)和`Line Feed`(`\n`)字符的注入攻击,常见于HTTP响应拆分攻击。了解和防御这种攻击对维护Web应用的安全至关重要。通过严格验证用户输入,使用安全库,正确设置响应头的内容类型等方法,可以有效防止CRLF注入相关的安全漏洞。
2024-11-15 09:15:48
1456
原创 你真的了解浏览器的缓存机制么?
缓存就是把一些访问过的数据保存起来,以便下次再用的时候可以直接从缓存中读取,而不需要重新从服务器获取。这个过程可以极大地提升访问速度。对于浏览器来说,常见的缓存存储位置包括浏览器本地的缓存存储(硬盘或内存)和缓存服务器(比如CDN)。浏览器和服务器之间的缓存机制复杂而强大,它在提升网页加载速度和减轻服务器负担方面起到了重要作用。通过合理利用HTTP头中的缓存控制字段,我们可以显著优化用户体验。希望通过这次讲解,大家能对浏览器缓存机制有一个更简单清晰的理解。
2024-11-14 09:31:10
1245
原创 C++20 中最优雅的那个小特性 - Ranges
C++20 的 Ranges 库为 C++ 提供了许多函数式编程的特性,使得代码更加声明性、易读、易维护。通过 Ranges 和std::views,开发者可以利用高阶函数、惰性求值、管道操作等函数式编程概念来处理数据流和集合,编写出更高效和优雅的代码。这些特性不仅增强了 C++ 的表达能力,也让开发者能够以更简洁和自然的方式来进行复杂的数据操作和变换。希望上述内容能帮助你理解和应用 C++20 的 Ranges 库,更好地结合函数式编程理念进行开发。
2024-11-12 09:51:20
1275
1
原创 C++ 里面散发的咖喱味儿 - Currying函数式编程
`std::bind` 是 C++ 标准库中非常重要的工具,能够将函数与其部分参数绑定生成新的函数对象。它能够与普通函数、成员函数、函数对象以及 lambda 表达式一起使用,极大地提高了代码的灵活性和可重用性。通过掌握 `std::bind`,开发者可以在 C++ 中更好地实现函数式编程中的柯里化理念,写出更清晰、更简洁的代码。
2024-11-11 08:05:33
2385
2
原创 C++ 越来越像函数式编程了!
在深入探讨 C++ 的演变之前,我们先简单介绍一下什么是函数式编程(Functional Programming)。函数式编程是一种编程范式,它把计算视为数学函数的求值,强调引用透明性纯函数高阶函数和惰性求值等概念。引用透明性:相同输入总是得到相同的输出,没有副作用。纯函数:函数内部不修改任何外部状态,也不依赖外部状态。高阶函数:可以接受函数作为参数或者返回函数。惰性求值:表达式只在需要时才计算。HaskellLisp (及其变种,如 Scheme 和 Clojure)ErlangF#
2024-11-10 09:00:00
1144
原创 探索 C++20:C++ 的新纪元
C++20 为开发者带来了一系列激动人心的新特性,这些特性不仅改善了编程体验,而且打开了新的可能性的大门。无论您是通过使用概念提升模板编程的安全性,或是利用协程简化异步操作,C++20 都将助您一臂之力。C++20 的未来无疑是光明的,让我们继续探索和实践,释放这一强大语言的全部潜力。祝大家在 C++20 中编写出更高效、更优雅的代码!
2024-11-09 08:31:43
2332
原创 AI - 使用LangChain请求LLM结构化生成内容
在本文中,我们使用LangChain和JavaScript创建了一个简单的格式化输出应用程序,通过配置Groq API并使用LangChain框架,在利用大型语言模型(LLM)生成结构化内容时,我们可以通过直接设置提示(prompting)或使用方法来达到目的。在这个基础上,您可以扩展该应用程序,以支持更多的功能和更复杂的应用场景。希望本教程对您有所帮助!
2024-11-06 23:41:19
1322
原创 微服务设计模式 - 事件溯源模式(Event Sourcing Pattern)
事件溯源(Event Sourcing)是一种将所有状态更改保存为一系列事件的设计模式。每次系统状态发生变化时,都会生成一个事件,这些事件在事件存储库(Event Store)中按照时间顺序保存。通过重放这些事件,可以重建对象的当前状态。Axon框架是一个专注于实现CQRS(Command Query Responsibility Segregation,命令查询责任分离)和事件溯源(Event Sourcing)模式的Java框架。
2024-11-05 12:10:14
1426
原创 AI - 使用LangChain构建简单LLM应用程序
LangChain是一个强大的框架,旨在简化与大型语言模型(LLM)的交互。这一框架为开发人员提供了结构化的方式来调用和操作语言模型,从而增加开发效率和应用程序的可维护性。在本文中,我们使用LangChain和JavaScript创建了一个简单的单词翻译应用程序,通过配置Groq API并使用LangChain框架,我们能够轻松构建出功能强大的语言模型应用程序。在这个基础上,您可以扩展该应用程序,以支持更多的功能和更复杂的应用场景。希望本文对您有所帮助!
2024-11-04 08:30:34
986
原创 微服务设计模式 - 网关路由模式(Gateway Routing Pattern)
网关路由模式(Gateway Routing Pattern)通过在客户端和微服务之间引入一个网关,提供了请求的统一处理和路由功能。它不仅提高了系统的安全性和可扩展性,还简化了客户端的开发。在本文中,我们详细介绍了网关路由模式的定义、结构、优势、工作原理,并通过 Spring Boot 的具体示例展示了该模式的应用和实现方法。希望对您在微服务架构中的开发有所帮助。
2024-11-03 19:12:32
989
原创 微服务设计模式 - 发布订阅模式(Publisher Subscriber Pattern)
发布-订阅模式是实现松耦合系统的强大工具,在云计算和分布式系统中应用广泛。通过使用如RabbitMQ的消息中间件,我们可以很容易地在Spring Boot项目中实现这一模式。通过本文的示例,我们展示了如何利用配置消费者行为,并通过Spring Boot注解进行订阅,从而实现发布-订阅模式的精细化控制和一个完整的发布-订阅模式。这种模式不仅提高了系统的扩展性和灵活性,还大大简化了开发过程中的依赖管理。
2024-11-02 11:22:55
1788
原创 微服务设计模式:节流模式(Throttling Pattern)
节流模式(Throttling Pattern)是一种用来限制请求频率的设计模式,在云计算和微服务架构中非常重要。它通过对请求进行计数和限制,防止系统过载,保证资源的公平使用。Spring Boot 支持通过拦截器实现这一模式,为开发者提供了简便灵活的实现方式。通过理解和应用节流模式,可以有效提升系统的稳定性和可用性。当然,Spring Interceptor 是在 Spring MVC 中用于拦截 HTTP 请求和响应的重要工具。
2024-11-01 09:51:37
944
原创 微服务设计模式 — 补偿事务模式(Compensating Transaction Pattern)
补偿事务模式是一种非常有效的方法,用于处理分布式系统中长时间运行事务的一致性问题。通过在主事务执行失败时执行补偿操作,系统能够恢复到一致性状态。尽管这一设计模式涉及较高的复杂性和代码冗余,但其在保证系统一致性和稳定性方面的优势是不可忽视的。在实际应用中,补偿事务模式广泛用于订单处理、银行转账等需要跨多个服务协调的业务场景。通过本文的示例,希望读者能够更好地理解和应用补偿事务模式。
2024-10-31 08:47:33
1145
原创 微服务设计模式 - 断路器模式 (Circuit Breaker Pattern)
断路器模式通过在服务间调用失败时切断请求,从而有效地防止级联故障,提升系统的稳定性和容错能力。在微服务架构中,断路器模式是保护服务正常运行的关键设计模式。Spring Boot 提供了丰富的工具和库(Spring Cloud Netflix Hystrix ),使得断路器模式的实现更加简单和高效。希望本文能帮助您更好地理解断路器模式及其在实际中的应用,为系统设计和实现提供参考。
2024-10-30 07:57:49
1270
原创 微服务设计模式 - 重试模式(Retry Pattern)
在云计算和微服务架构中,重试模式是一种重要的设计模式,通过处理暂时性故障来增强系统的可靠性。当实现重试模式时,必须考虑幂等性、事务一致性、性能影响和异常类型,以确保系统的整体稳定性和正确性。`Resilience4j`库提供了实现重试模式的便利方法,通过合理配置可以满足各种不同的业务需求。
2024-10-29 08:22:39
1506
原创 微服务设计模式 - 大使模式(Ambassador Pattern)
Ambassador Pattern 是一种常见的微服务设计模式,通常用于在微服务架构中代理和处理外部服务调用。通过使用 Ambassador Pattern,可以在调用外部服务时添加额外的逻辑,例如监控、日志记录、安全检查等。这种模式类似于一个中介(Ambassador),在真正的服务调用之前处理所有的预处理任务。Ambassador Pattern 是一种强大的设计模式,可以在微服务架构中处理外部服务调用的复杂性。它不仅可以增加安全性,还能进行监控和日志记录,并对外部服务调用进行重试和统一管理。
2024-10-28 08:11:48
1248
原创 微服务设计模式 - 特性标志(Feature Flags)
特性标志是一种强大的技术手段,它在云计算和微服务架构中具有广泛的应用。通过特性标志,开发团队可以降低风险、快速迭代、进行 A/B 测试和实现动态配置。在微服务架构中,特性标志可以用于新功能发布、性能优化等场景。通过合理地使用特性标志,可以提高软件开发的效率和质量,为用户提供更好的服务体验。
2024-10-27 08:12:18
1213
2
原创 微服务设计模式-边车模式(Sidecar Pattern)
边车模式(Sidecar Pattern)是一种将应用程序的功能分离到一个独立的进程或容器中的设计模式。这个独立的进程或容器被称为边车(Sidecar),它与主应用程序(Main Application)一起运行,并为其提供额外的功能和服务。边车模式可以看作是一种插件式的架构,它允许开发人员在不修改主应用程序代码的情况下,为其添加新的功能,帮助我们构建灵活、可维护的系统。
2024-10-26 08:52:49
1867
原创 SOLID - 依赖倒置原则(Dependency Inversion Principle)
依赖倒置原则(DIP)是创建高效、灵活、可维护系统的重要原则之一。依赖倒置原则通过让高层模块依赖抽象接口,而不是具体实现,使得系统更具灵活性和可扩展性。Spring Boot通过依赖注入(Dependency Injection)和配置类(Configuration)提供了优雅的方式来实现这一原则,使得开发更加简便和高效。
2024-10-25 03:49:12
1532
原创 SOLID - 接口隔离原则(Interface Segregation Principle)
接口隔离原则是创建高效、维护良好的面向对象系统的重要原则之一。在云原生编程中,遵循这一原则可以设计出更加灵活、可扩展的微服务系统。通过识别不同客户端的需求,创建小而专用的接口,并将服务模块化,能够显著提高系统的可维护性和灵活性。接口隔离原则不仅适用于传统的面向对象编程,同样也适用于现代的云原生架构设计,是确保系统稳定性、可扩展性及高效性的重要设计指南。
2024-10-24 08:34:05
1156
原创 SOLID - Liskov替换原则(Liskov Substitution Principle)
在软件设计领域,SOLID原则中的"L"代表Liskov替换原则(Liskov Substitution Principle, 简称LSP)。Liskov替换原则由计算机科学家Barbara Liskov在她关于数据抽象和类型理论的工作中提出,是面向对象编程中的一项核心原则。(英语:Barbara Liskov,1939年11月7日—),本名芭芭拉·简·休伯曼(英语:Barbara Jane Huberman)。美国计算机科学家,2008年得主,2004年得主。现任电子电气与计算机科学系教授。
2024-10-23 05:44:33
855
原创 SOLID - 开放封闭原则 (Open/Closed Principle)
开放封闭原则(OCP)是SOLID设计原则中至关重要的一部分,它通过对扩展开放、对修改封闭的设计,使我们的软件系统更加灵活和可维护。在云原生编程环境中,利用微服务架构和事件驱动模式,我们可以更好地坚持这一原则,从而实现高质量的软件开发。希望本文能够帮助大家更好地理解和应用开放封闭原则,提高系统设计和编程技能。
2024-10-22 07:39:20
1187
原创 SOLID - 单一责任原则(Single Responsibility Principle)
单一职责原则(Single Responsibility Principle,SRP)是SOLID设计原则中的一个重要部分,先看一下它的经典定义:它的核心思想是一个类应该只有一个引起它变化的原因,即一个类应该只负责一项职责。这有助于保持代码的清晰性,易于维护和理解。
2024-10-21 08:10:45
938
原创 package-lock.json到底在锁什么
在 Node.js 项目中,包管理是至关重要的一环。文件广为人知,它记录了项目的依赖包及其版本信息。然而,还有一个同样重要但容易被忽视的文件 —。本文将详细介绍,并阐述它与的关系,以及它在和npm ci命令中的具体使用方式和区别。
2024-10-19 10:06:54
830
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人