SQLModel时间戳字段的使用
在表定义中,经常需要使用createtime、updatetime两个字段,在SQLModel中,可以定义这样一个数据模型:
1234567891011121314151617181920class TimestampModel(SQLModel): """ 时间公共字段模型定义 """ create_time: datetime = Field( default_factory=partial(datetime.now, UTC), nullable=False, description="创建时间", sa_column_kwargs={ "server_default": text("CURRENT_TIMESTAMP") } ) update_time: datetime = Field( default_fac ...
FastAPI统一异常处理
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192# -*- coding: utf-8 -*-import loggingfrom starlette.exceptions import HTTPExceptionfrom fastapi import FastAPI, Request, statusfrom fastapi.encoders import jsonable_encoderfrom fastapi.exceptions import RequestValidationErrorfrom app.extensions.fastapi.api import ApiResponselogger = logging.getLogger(__name__)error_message ...
python asyncio
asyncio 概述asyncio 是 Python 3.4 之后引入的一个标准库,用于编写单线程并发网络代码。它使用事件循环(event loop)来管理 I/O 操作,从而避免了传统的多线程或多进程带来的复杂性和性能开销。asyncio 的主要特点是它支持异步 I/O 操作、任务(task)调度和协程(coroutine)。
asyncio 原理性解析1 事件循环
事件循环是 asyncio 的核心,它负责监听 I/O 事件、执行回调函数以及调度协程。事件循环通常通过 asyncio.get_event_loop() 获取,并使用 run_until_complete() 或 create_task() 来执行协程。但通常我们使用 asyncio.run() 来启动最顶层的协程,并自动创建和关闭事件循环。
1234567import asyncioasync def main(): loop = asyncio.get_running_loop() print(loop)asyncio.run(main())
2 协程
协程是一种轻量级的 ...
Python依赖和包管理工具Poetry
Poetry 是一个现代的Python包管理工具,它解决了很多传统工具如 pip 和 virtualenv 组合使用时遇到的问题,同时还集成了包的依赖管理和发布功能。
为什么使用 Poetry
依赖管理和版本控制:Poetry 自动处理项目的依赖关系,并确保解决方案的一致性。它通过 pyproject.toml 和 poetry.lock 文件精确控制依赖版本,避免了依赖地狱。
简化虚拟环境管理:Poetry 自动创建和管理虚拟环境,无需手动使用 virtualenv。这意味着每个项目都有自己独立的环境,从而避免了包版本冲突。
一体化工作流:从创建项目、添加依赖、安装依赖到打包和发布,Poetry 提供了一套一致的命令接口,简化了工作流程。
便于项目协作:通过将 pyproject.toml 和 poetry.lock 文件加入版本控制,团队成员可以确保在不同的开发环境中使用完全相同的依赖,从而减少“在我机器上能运行”这类问题。
安装 Poetry首先,需要安装 Poetry。官方推荐的安装方式是使用其安装脚本,以确保安装最新版本:
1curl -sSL https://raw.gi ...
LCEL 接口
为了尽可能简单地创建自定义链,LangChain 提出了“Runnable”标准接口协议。目前,LangChain 中的大多数组件都已实现了 Runnable 协议,用户可以轻松构建自定义链并以标准方式调用它们。其中,标准接口包括:
stream:流式输出响应内容块
invoke:通过输入来调用链
batch:通过批量输入来调用链
对应的异步方法:
astream:异步流式调用
ainvoke:简单异步调用
abatch:批量异步调用
astream_log:除了最终响应之外,同时返回中间步骤
astream_events:链中发生的流事件(在 langchain-core 0.1.14 中引入)
各组件的输入类型和输出类型列表如下:
组件
输入
输出
Prompt
Dictionary
PromptValue
ChatModel
单一字符串 / 聊天信息列表 / PromptValue
ChatMessage
LLM
单一字符串 / 聊天信息列表 / PromptValue
字符串
OutputParser
LL ...
LangSmith 入门
LangChain 可以用来轻松构建LLM应用和 Agent 的原型。然而,将LLM应用交付到生产环境将会困难得多。我们必须多次迭代提示词、链和其他组件才能构建高质量的产品。
在这个过程中间,LangSmith 可以协助我们轻松调试、测试和持续改进LLM应用程序。
那么,什么时候需要用到 LangSmith 呢。主要使用场景如下:
快速调试一个新的链、Agent或工具集
创建和管理数据集以进行微调、少样本提示以及评估
对应用程序进行回归测试以便开发更顺利
为进一步洞察产品和持续改进,需要进行产品深入分析
前提创建 LangSmith 帐户并在 Settings - API keys 创建 API 密钥。相关文档参见 docs**
注:LangSmith 处于封闭测试阶段,单人使用有免费额度。
将记录运行结果记录到 LangSmith要将中间运行结果记录到 LangSmith,我们需要配置几个环境变量。
1234LANGCHAIN_TRACING_V2="true"LANGCHAIN_PROJECT="Tracing Walkthrough - my ...
LangChain 为什么使用 LCEL(二)
运行时可配置如果我们想要在运行时灵活配置所使用的大模型,可以使用如下方法:
首先,先安装 langchain_anthropic,方便下文中使用 claude 模型
1pip install langchain_anthropic
1234567891011121314151617181920212223242526272829303132from langchain_openai import OpenAIfrom langchain_openai import ChatOpenAIfrom langchain_anthropic import ChatAnthropicfrom langchain_core.runnables import ConfigurableFieldfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.runnables import Runnable ...
提示工程(学习笔记)
概念
Prompt template 是生成语言模型提示词的预定义方案。模板包括说明、少量示例以及给定任务的特定上下文和问题。
PromptTemplate创建字符串提示的模板。支持任意数量的变量,包括无变量。一般使用在单轮对话中
ChatPromptTemplate 聊天消息列表,每条聊天消息都有内容以及附加参数相关联 role
高质量 prompt 核心要点具体、丰富、少歧义
Prompt 的典型构成(把AI当人看)
角色:给 AI 定义一个最匹配任务的角色,比如:「你是一位软件工程师」「你是一位小学老师」。通过角色定义,在开头收紧问题域,减少二义性。
指示:对任务进行描述
上下文:给出与任务相关的其它背景信息(尤其在多轮交互中)
例子:必要时给出举例,学术中称为 one-shot learning, few-shot learning 或 in-context learning;实践证明其对输出正确性有很大帮助
输入:任务的输入信息;在提示词中明确的标识出输入
输出:输出的格式描述,以便后继模块自动解析模型的输出结果,比如(JSON、XML)
大模型对 prompt 开头和 ...
LangChain 为什么使用 LCEL
通过如下设计实现,LCEL 提供了一系列功能,使从基本组件构建复杂链变得容易便捷。
统一接口:每一个 LCEL对象都实现了 Runnable 接口,该接口定义了一组公共调用方法(invoke, batch, stream, ainvoke, …)。这使得 LCEL 链本身也可以支持这种调用,即每个 LCEL 对象链本身也是一个 LCEL 对象。
组合原语:LCEL 提供了一系列原语,可以很容易支持组合链,并行组件,添加回退,动态配置链内部运行机制等等。
为了更好理解 LCEL 的价值,看看使用了 LCEL 之前、之后的案例是很有帮助的。下面,我们将选用入门部分的部分基本案例,进行两者之间的对比。
Invoke在这个最简单的案例中,我们只需传入一个 topic 字符串,并获得一个相关的笑话字符串:
无 LCEL 的实现12345678910111213141516171819from typing import Listimport openaiprompt_template = "Tell me a short joke about {topic}&q ...
LangChain LCEL 起步(二)
RAG 案例下一个例子,我们将构建一个检索增强生成(RAG)链,以便在回答问题时添加一些上下文。
12345678910111213141516171819202122232425262728293031# 在运行前,需要安装以下包:# pip install langchain docarray tiktokenfrom langchain_community.vectorstores import DocArrayInMemorySearchfrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_core.runnables import RunnableParallel, RunnablePassthroughfrom langchain_openai.chat_models import ChatOpenAIfrom langchain_openai import OpenAIEmbed ...