总结:
有时候思维不要定式了,搜不到可以去大胆去猜想,然后小心求证。不要因为任务紧急就太囫囵吞枣,要快慢相间,抓住重点。
本周知识清单:
- 调研LlamaIndex,实现demo
- 学会python远程debug
- flask学习
下周任务:
- flask应用
- 想办法把任务闭环
关键记录
调研LlamaIndex,实现demo
LlamaIndex 是一个将大语言模型(Large Language Models, LLMs,后简称大模型)和外部数据连接在一起的工具。大模型依靠上下文学习(Context Learning)来推理知识,针对一个输入(或者是prompt),根据其输出结果。因此Prompt的质量很大程度上决定了输出结果的质量,因此提示工程(Prompt engineering)现在也很受欢迎。目前大模型的输入输出长度因模型结构、显卡算力等因素影响,都有一个长度限制(以Token为单位,ChatGPT限制长度为4k个,GPT-4是32k等,Claude最新版有个100k的)。当我们外部知识的内容超过这个长度时,就无法同时将有效的信息传递给大模型。因此就诞生了 LlamaIndex 等项目。
假设有一个10w的外部数据,我们的原始输入Prompt长度为100,长度限制为4k,通过查询-检索的方式,我们能将最有效的信息提取集中在这4k的长度中,与Prompt一起送给大模型,从而让大模型得到更多的信息。此外,还能通过多轮对话的方式不断提纯外部数据,达到在有限的输入长度限制下,传达更多的信息给大模型。
原文链接:【LlamaIndex 教程】一文看懂LlamaIndex用法,为LLMs学习私有知识-CSDN博客
LlamaIndex 是一个“数据框架”,可帮助您构建 LLM 应用程序。它提供以下工具:
- 提供数据连接器来引入现有的数据源和数据格式(API、PDF、DOC、SQL 等)。
- 提供构建数据(索引、图形)的方法,以便这些数据可以轻松地与 LLM 一起使用。
- 为您的数据提供高级检索/查询接口:输入任何 LLM 输入提示,取回检索到的上下文和知识增强的输出。
- 允许与您的外部应用程序框架轻松集成(例如与 LangChain、Flask、Docker、ChatGPT 等任何内容)。
LlamaIndex 为初学者和高级用户提供工具。我们的高级 API 允许初学者使用 LlamaIndex 来摄取和查询他们的数据 5 行代码。我们的较低级别的 API 允许高级用户自定义和扩展任何模块(数据连接器、索引、检索器、查询引擎、重新排名模块), 以满足他们的需求。
入门
入门者示例:骆驼指数 ·皮皮 (pypi.org)
入门下载数据的时报错,找不到字典,换了路径也没用,只有下载完整LlamaIndex才不报错,用的里面的2张照片
documents = SimpleDirectoryReader("llama_index/docs/docs/indices").load_data()
问题是:
response =query_engine.query("What is the main content of these two images?")
完整代码
import os
os.environ["REPLICATE_API_TOKEN"] = "r8_2h46WP9yrH5DzGohizGEwsffdeNY5wN2y574X"
from llama_index.core import Settings, VectorStoreIndex, SimpleDirectoryReader
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.replicate import Replicate
from transformers import AutoTokenizer
# set the LLM
llama2_7b_chat = "meta/llama-2-7b-chat:8e6975e5ed6174911a6ff3d60540dfd4844201974602551e10e9e87ab143d81e"
Settings.llm = Replicate(
model=llama2_7b_chat,
temperature=0.01,
additional_kwargs={"top_p": 1, "max_new_tokens": 300},
)
# set tokenizer to match LLM
Settings.tokenizer = AutoTokenizer.from_pretrained(
"NousResearch/Llama-2-7b-chat-hf"
)
# set the embed model
Settings.embed_model = HuggingFaceEmbedding(
model_name="BAAI/bge-small-en-v1.5"
)
#documents = SimpleDirectoryReader(input_dir='/module').load_data()
#documents = SimpleDirectoryReader("input_dir='./data'").load_data()
#documents = SimpleDirectoryReader("docs/examples/indices").load_data()
documents = SimpleDirectoryReader("llama_index/docs/docs/indices").load_data()
# from llama_index import Document
# text_list = [100, 102,104,106,111]
# documents = [Document(t) for t in text_list]
index = VectorStoreIndex.from_documents(
documents,
)
query_engine = index.as_query_engine()
response =query_engine.query("What is the main content of these two images?")
print(response)
结果:
Thank you for providing the context information. Based on the two images you provided, I can infer that they are related to a tree and a keyword query, respectively.
The first image, /data/bsy/llama_index/docs/docs/indices/tree_summarize.png, appears to be a graph or a summary of a tree structure. It may represent a hierarchical organization of something, such as a company's organizational structure or a tree's branching pattern.
The second image, /data/bsy/llama_index/docs/docs/indices/keyword_query.png, appears to be a keyword query or a search term. It may represent a list of keywords or phrases that a user can use to search for relevant content, such as a list of search terms for a search engine.
Therefore, the main content of these two images appears to be related to organizing and searching for information, possibly in a hierarchical or structured manner.
谢谢您提供了上下文信息。根据您提供的两张图片,我可以推断它们分别与一棵树的结构总结和关键词查询有关。
第一张图片,/data/bsy/llama_index/docs/docs/indices/tree_summarize.png,似乎是一棵树状结构的图表或总结。它可能代表了一种层次化的组织形式,例如公司的组织结构或者是树木的分支模式。
第二张图片,/data/bsy/llama_index/docs/docs/indices/keyword_query.png,似乎是一个关键词查询或搜索词。它可能代表了一组关键词或短语,用户可以用这些关键词或短语来搜索相关信息,例如搜索引擎中的搜索词条列表。
因此,这两张图片的主要内容似乎与组织和搜索信息有关,可能是以一种层次化或结构化的方式来进行的。
【LlamaIndex 教程】一文看懂LlamaIndex用法,为LLMs学习私有知识-CSDN博客
llamaindex chat界面
参照run-llama/chat-llamaindex (github.com)
官网说的改机器人的网址是找不到的,应该是在:https://github.com/run-llama/chat-llamaindex/blob/main/app/components/bot/
这里下载出来问题,用gitee也解决不了,少了很多文件,最后是先zip下载到本地,然后mobaxbox拖拽到容器,然后unzip命令解压才完整,否则后面经常报错,找不到dictory字典。
运行到
pnpm install
就报错没有pnpm命令,结果是nodejs没下载,在官网下载.tar.gz包再解压,老是报错找不到pnpm命令,要安装pnpm命令有需要npm命令又安装不了npm命令,直接apt install nodejs安装,运行nodejs -v会显示有版本号,但是npm -v不会显示版本号,因为国内网络不稳定,后面是用镜像安装解决的。
npm config set registry https://registry.npmmirror.com
pnpm config set registry https://registry.npmmirror.com/
然后再按照官网运行
pnpm install
pnpm run create-llama
注意:把文件密钥改了:
vi .env.development.local
这样就会进去文件
注意里面的删除键是:delete,在文件中找到您要设置或修改的环境变量,例如 OPENAI_API_KEY
,并进行相应的编辑
保存并退出编辑:
- 在
vi
中,按Esc
键,然后输入:wq
保存并退出。
然后在vscode级联容器中运行
pnpm dev
跳转到端口:聊天 LlamaIndex
就能出现页面了:
但是这个页面不能手动点击什么,比原始界面少了一些,一些按钮都是灰色的,也上传不了文件,python端报错:
POST /api/chat 500 in 349189ms
[LlamaIndex] APIConnectionError: Connection error.
at OpenAI.makeRequest (webpack-internal:///(rsc)/./node_modules/.pnpm/openai@4.54.0_encoding@0.1.13/node_modules/openai/core.mjs:333:19)
可能是密钥的问题,再去看看,原来密钥更改后没保存,重新保存还是报错:
查了原因:
它实际上只是由 vercel/ai 生成的警告,参见 ai/packages/core/streams/stream-data.ts at e0d0d4670f5f6f4f0f6a0b3325ff6c71d9fcc2f3 · vercel/ai · GitHub
它会在 3 秒后显示,并且仅在 DEV 模式下显示。
3 秒后,LLM 通常不会完成流式传输,所以我看不到任何影响,我会忽略此警告。但是我这边有影响,输入对话,它一直在加载。
本质的报错源头在这:
只知道数据文件在:/data/bsy/chat-llamaindex/cache/basic_law_germany
上传文件之后保存路径:/data/bsy/chat-llamaindex/output
实际上是接口出现问题,在.env.development.local中加上一行OPENAI_BASE_URL=https://ai-yyds.com/v1就行
要产生自己的数据源,需要在/data/bsy/chat-llamaindex/datasources路径下新建一个文件夹A,里面放数据文件,然后在/data/bsy/chat-llamaindex/cache路径下也新建一个文件夹A,然后运行
pnpm run generate A
之后/data/bsy/chat-llamaindex/cache/A文件夹下就会出现3个标准的json文件。但是界面还是选择不了新的数据源A,这是因为设置UI界面对应的文件没改,官网说的是
- Modify the demo bots by using the UI or directly editing the ./app/bots/bot.data.ts file.
但是那个路径没有,其实是在chat-llamaindex/app/store/bot.ts下面,把21行下面添加新数据源的名称,比如llm加进去就好了
export const AVAILABLE_DATASOURCES = [
"documents",
"redhat",
"watchos",
"llm",
"basic_law_germany",
] as const;
对于下面点击按钮报错,需要在/data/bsy/chat-llamaindex子目录下新建一个data文件夹,里面放要上传的数据,就能点击之后跳转了。
点击1那个按钮就能出现回答的数据来源,方便查看。
官网的链接,只能询问跟数据源有关的才会出现来源1,2,3,但是点击按钮会报错Sorry, unknown node type. Please add a new renderer in the NodeInfo component.:
学会python远程debug
参考:VS Code进行Python远程调试_vscode 远程 python-CSDN博客
flask学习
Flask框架入门教程(非常详细)从零基础入门到精通,看完这一篇就够了-CSDN博客
文件目录架构
参考:Dify后端源码目录结构和蓝图_dify后端项目结构解析-CSDN博客
了解dify/api at main · langgenius/dify (github.com)api文件夹内的文件夹功能:
configs
:通常存放项目的配置相关文件,例如数据库连接配置、服务器配置、环境变量配置等。constants
:用于存储常量值,例如固定的字符串、数值或其他不会改变的值,方便在项目中统一使用和管理。contexts
:可能包含与上下文相关的代码,比如处理特定上下文环境中的逻辑。controllers
:包含处理 API 请求和响应的控制器逻辑,决定如何响应不同的请求。core
:一般存放核心的业务逻辑或关键的功能模块。docker
:包含与 Docker 容器化相关的配置和脚本。events
:用于处理事件相关的逻辑,例如系统事件的监听和响应。extensions
:可能是一些扩展功能或第三方库的整合部分。fields
:也许包含数据字段的定义、验证规则或与数据字段处理相关的代码。libs
:通常是自定义的库或通用工具函数的存放位置。migrations
:用于数据库迁移脚本,管理数据库结构的变更。models
:存放数据模型,定义数据库中的表结构和数据关系。schedule
:可能涉及定时任务的配置和实现。services
:包含业务服务层的代码,处理复杂的业务逻辑。tasks
:存放任务相关的代码,可能是异步任务或后台任务。templates
:如果项目使用模板引擎,这里会存放模板文件。这个项目是放xtml文件。tests
:用于存放测试用例和测试相关的代码。
文件功能:
.dockerignore
:指定在构建 Docker 镜像时要忽略的文件和文件夹。.env.example
:提供环境变量的示例,说明项目可能需要的配置变量。Dockerfile
:用于定义 Docker 镜像的构建步骤和配置。app.py
:应用的主入口文件或主要的应用逻辑实现。commands.py
:自定义的命令行命令的实现。poetry.lock
:当您使用 Poetry 作为项目的依赖管理工具时,这个文件会被生成。它详细记录了项目所依赖的包的确切版本以及它们的依赖关系。这有助于确保在不同环境中安装依赖时能够得到一致的结果。poetry.toml
:也是与 Poetry 相关的配置文件,可能包含项目的一些基本设置,例如名称、版本、作者等信息,以及对依赖的一些更高级的配置。pyproject.toml
:这是 Python 项目的配置文件,常用于定义项目的构建系统、依赖管理工具(如 Poetry 或其他)的配置,以及一些与项目相关的工具和插件的设置。
数据库连接池
原文链接:数据库连接池的作用及理解-CSDN博客
为什么要用连接池:
对于一个简单的数据库引用,用于对数据库的访问不是很频繁,这种情况可以简单的在需要访问数据库时,创建一个链接,用完关闭它,这样做不会有太明显的性能上的开销。但是对于复杂的数据库引用,情况就截然不同了,频繁的建立、关闭连接,会极大的减低系统的性能,这是对于连接的使用造成系统性能的瓶颈。
为什么频繁建立、关闭连接会降低系统的性能:数据库连接是一项有限的昂贵资源,一个数据库连接对象均对应一个物理数据库连接,每次使用都要打开一个物理连接,使用完都关闭。建立数据库连接时非常耗费资源和时间的,首先要建立TCP连接;然后TCP协议三次握手的发送与响应;客户端的账户验证,服务器返回确认;用户验证后,需要传输相关链接变量如是否自动提交事务的设置等,会有很多次的数据交互,然后才能建立连接。
连接池作用:是将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接对数据库进行访问。这样省略了创建和销毁的过程。这样以提高系统的性能。
连接池基本原理:
1、建立数据库连接池对象(服务器启动)。
2、按照事先指定的参数创建对应初始数量的数据库连接(即空闲连接),设置连接池连接数量极值(最大活跃链接)。
3、对于一个数据库的访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲连接,且数量没有达到极值(即:最大活跃链接),创建一个新的数据库连接。
4、存取数据库。
5、关闭数据库,释放大于初始数量的空闲数据库连接。(并非真正关闭,而是将其放入空闲队列中。如实际空闲连接大于初始数量空闲连接则释放连接)。
6、释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。
JDBC
(Java Database Connectivity)
通常指的是 Java 中的一种用于数据库连接和操作的应用程序接口(API)。
它提供了一组标准的类和接口,使得 Java 程序能够以统一的方式连接各种不同类型的数据库,执行 SQL 语句,处理查询结果,进行事务管理等操作。
通过 JDBC
,开发人员可以使用相同的代码模式与不同的数据库(如 MySQL、Oracle、SQL Server 等)进行交互,而无需为每种数据库编写特定的连接和操作代码。
例如,使用 JDBC
可以执行以下常见的数据库操作:
- 建立与数据库的连接。
- 发送 SQL 语句,如查询(SELECT)、插入(INSERT)、更新(UPDATE)和删除(DELETE)。
- 处理查询结果,将结果集读取到 Java 中的数据结构中。
- 管理事务,确保一组数据库操作的原子性、一致性、隔离性和持久性。
总之,JDBC
是 Java 中实现数据库连接和操作的重要技术手段,有助于提高数据库应用程序的可移植性和可维护性。
数据库连接池提供商实际上将JDBC
的常用类进行了再次包装,比如Connecton,Statement等等。
主要是使用的适配器模式,比如从数据库连接池中获取的Connnection可能是一个实现了java.sql.Connection接口的类,所以当我们使用完Connection后所进行的close()操作,实际上只是对这个实现类进行了close。在实现类内部实现的close并没有关闭数据库物理连接,只是将其归还到连接池中。
来源:
从数据库连接池中获取连接调用close后,为什么不是关闭物理连接?_conn.close()无法结束进程-CSDN博客
其余的在wps,下周再整理。
每天一些linux操作小知识:
1.解压.tar.gz文件:
tar -zxvf demo.tar.gz -C /home
tar -zxvf 压缩文件名.tar.gz -C /指定路径。
压缩.tar.gz文件:
tar -zcvf demo.tar.gz test
tar -zcvf 压缩文件名.tar.gz 被压缩文件名
来源:Linux解压.tgz,.tar.gz文件(tar详细参数使用介绍)_虚拟机tgz文件解压-CSDN博客
2.网络问题
当遇到timeout、retry、需要证书、warn skipping、https://github...
WARN GET https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz error (ERR_SOCKET_TIMEOUT). Will retry in 10 seconds. 2 retries left.B/20.60 MB
基本上都是网络问题,要用镜像安装国内源。