AI算法工程师实习周记(四)

总结:

有时候思维不要定式了,搜不到可以去大胆去猜想,然后小心求证。不要因为任务紧急就太囫囵吞枣,要快慢相间,抓住重点。

本周知识清单:

  • 调研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界面对应的文件没改,官网说的是

但是那个路径没有,其实是在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博客

08 答疑_哔哩哔哩_bilibili

文件目录架构

参考: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 可以执行以下常见的数据库操作:

  1. 建立与数据库的连接。
  2. 发送 SQL 语句,如查询(SELECT)、插入(INSERT)、更新(UPDATE)和删除(DELETE)。
  3. 处理查询结果,将结果集读取到 Java 中的数据结构中。
  4. 管理事务,确保一组数据库操作的原子性、一致性、隔离性和持久性。

总之,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
基本上都是网络问题,要用镜像安装国内源。

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值