【笔记】创建个人知识库+Text2SQL调用

先介绍部署搭建个人知识库的优势(为什么要创建个人知识库):
1.借助大语言模型(Large Language Model, LLM)的能力,方便个人、用户文档数据的实时检索;
2.因为知识库和文档全在本地,能够保护公司业务数据、个人隐私;
3.整合本地文档到知识库,便于检索和管理。

个人知识库的定义:
根据个人需求(当然也可以说公司、单位、局部用户、组织或团体),集中存储和管理信息的系统。

以下是个人知识库创建步骤:

创建个人知识库的步骤

1.选择适合的工具如Notion、Obsidian或Logseq,这些平台支持Markdown格式,便于结构化记录与链接相关内容。
2.将信息分类存储,例如按照技术、学习笔记、项目文档等标签归档,确保快速检索。
3.定期更新知识库,添加新的学习内容或项目经验,保持信息的时效性。
4.使用内部链接功能关联相关概念,形成知识网络,提升整体理解。

构建本地知识库

使用LangChain框架搭建本地知识库,结合向量数据库存储嵌入向量。

from langchain.document_loaders import DirectoryLoader
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS

loader = DirectoryLoader('./docs/', glob="**/*.txt")
documents = loader.load()
# 创建嵌入模型
embeddings = OpenAIEmbeddings()

# 从文件创建知识库
db = FAISS.from_documents(documents, embeddings)
db.save_local("my_knowledgebase")
 

构建完成后,接下来是知识库调用。已知个人知识库通常以结构化数据(如数据库表)或非结构化数据(如文档)形式存储,通过 Text2SQL 技术可以高效检索其中的信息。以下是实现方式:

数据库结构化知识库

若知识库以关系型数据库(如 MySQL、PostgreSQL)存储,Text2SQL 可直接将自然语言问题转换为 SQL 查询。例如,用户提问“去年销售额最高的产品是什么?”,模型会生成类似以下查询:

SELECT product_name, MAX(sales_amount) 
FROM sales_records 
WHERE year = YEAR(CURRENT_DATE) - 1 
GROUP BY product_name 
ORDER BY sales_amount DESC 
LIMIT 1;

工具如 LangChainLlamaIndex 可集成 Text2SQL 模型与数据库,实现端到端问答。

非结构化文档知识库

若知识库为文档(如 PDF、Markdown),需先通过以下流程处理:

  1. 文档向量化:使用嵌入模型(如 OpenAI Embeddings、Word2vec)将文本转换为向量,存储至向量数据库(如 Pinecone、FAISS)。
  2. 检索增强生成(RAG):用户提问时,先从向量库检索相关片段,再结合 Text2SQL 生成查询。例如,提问“财务部预算规则”会先检索相关文档段落,再提取关键字段生成 SQL。
代码示例(Python)

以下为调用 LangChain 实现 Text2SQL 的简化代码:

from langchain_community.utilities import SQLDatabase
from langchain_community.agent_toolkits import create_sql_agent
from langchain_openai import ChatOpenAI

# 连接个人知识库数据库
db = SQLDatabase.from_uri("sqlite:///knowledge_base.db")
agent = create_sql_agent(llm=ChatOpenAI(model="gpt-4"), toolkit=db)

# 自然语言提问
response = agent.run("2023年有哪些项目超预算?")
print(response)

关键优势

  • 降低技术门槛:非技术人员可直接查询数据。
  • 高效检索:结合向量搜索(高性能索引)与 SQL 生成,覆盖结构化和非结构化知识。
  • 灵活性:适配多种数据库类型(SQLite、PostgreSQL 等)。

注意:实际应用中需优化提示词(Prompt)以提高 SQL 生成准确性,并设置权限确保数据安全。

Text2SQL的调用注意事项

1.确保数据表结构清晰,提供必要的元数据(如表名、字段名)以提高模型准确性。
2.调试生成的SQL语句,验证执行结果,优化提示词以提升查询质量。结合知识库存储常见查询模板,提高重复任务的效率。

Text2SQL实现
采用序列到序列(Seq2Seq)模型将自然语言转换为SQL查询。以下公式描述注意力机制:
Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})VAttention(Q,K,V)=softmax(dkQKT)V
公式含义:
Q (Query):查询矩阵,通常是由解码器(Decoder)产生的向量,表示要查询的内容。
K (Key):键矩阵,通常是由编码器(Encoder)产生的向量,表示可被查询的信息的键。
V (Value):值矩阵,同样由编码器产生,表示实际的信息内容。
dk :键向量的维度,用于缩放调节。
softmax :softmax函数,用于将注意力权重归一化(点积结果转换为概率分布),使其之和为1,突出重要信息。
QK^T :通过计算查询向量和键向量的点积来衡量它们之间的相关性。

示例(自然语言 to SQL,Text2SQL)调用代码:

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
#加载模型
tokenizer = AutoTokenizer.from_pretrained("tscholak/text2sql")
model = AutoModelForSeq2SeqLM.from_pretrained("tscholak/text2sql")
#输入处理
input_text = "查询销售额大于100万的客户"
inputs = tokenizer(input_text, return_tensors="pt")
#生成输出
outputs = model.generate(**inputs)
#解码结果
sql = tokenizer.decode(outputs[0], skip_special_tokens=True)
 

● ● ●
补充内容1.知识库与SQL系统集成
建立联合查询管道,将知识库检索结果作为SQL查询上下文:

def hybrid_query(question):
    docs = db.similarity_search(question)
    context = "\n".join([doc.page_content for doc in docs])
    augmented_query = f"基于以下信息:{context}\n问题:{question}"
    return sql_query(augmented_query)
 

补充内容2.性能优化
引入查询缓存机制,使用LRU算法管理缓存:
Cache Hit Ratio(缓存命中率)=NhitNhit+Nmiss∗100%Cache\ Hit\ Ratio(缓存命中率) = \frac{N_{hit}}{N_{hit} + N_{miss}}*100\%Cache Hit Ratio(缓存命中率)=Nhit+NmissNhit100%
实现代码片段:

from functools import lru_cache

@lru_cache(maxsize=1000)
def cached_sql_query(query):
    return sql_query(query)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值