赞
踩
使用大模型,通过自然语言的查询语句,从数据库获取结果,是目前大模型和结构化数据交互的一种主流形式。
举个例子,存储朝阳区高中学校招生信息的数据库,现在问它 陈经纶招多少人?
,生成回答的大致步骤是:
陈经纶招多少人?
转化为 SQL 查询语句,比如 select * from school_info where school_name like '%陈经纶%'
北京市陈经纶中学招收的学生人数为279名。
以下使用 Jupyter 笔记实现了一个示例:
下面介绍下主要过程和初步结论。
使用 sqlalchemy 在 sqlite 建内存数据库和相关记录:
# 建立连接和表 from sqlalchemy import ( create_engine, MetaData, Table, Column, String, Integer, select, ) engine = create_engine("sqlite:///:memory:") metadata_obj = MetaData() # 创建学校信息表结构 table_name = "school_info" school_info_table = Table( table_name, metadata_obj, Column("school_name", String(200), primary_key=True), Column("students_enrolled", Integer,nullable=False), ) metadata_obj.create_all(engine) # 插入学校信息记录 rows = [ {"school_name": "北京市第八十中学", "students_enrolled": 260}, {"school_name": "北京市陈经纶中学", "students_enrolled": 279}, {"school_name": "北京市日坛中学", "students_enrolled": 403}, {"school_name": "中国人民大学附属中学朝阳学校", "students_enrolled": 247}, {"school_name": "北京工业大学附属中学", "students_enrolled": 418}, {"school_name": "北京中学", "students_enrolled": 121}, ] for row in rows: stmt = insert(school_info_table).values(**row) with engine.begin() as connection: cursor = connection.execute(stmt)
数据可以通过 pandas
查询显示:
需要 LLM 和嵌入模型,设置到 LlamaIndex 全局 Settings
中,这样后续不必在方法参数中设置:
Settings.llm=OpenAILike(
model="qwen2",
api_base="http://monkey:11434/v1",
api_key="ollama",
is_chat_model=True,
temperature=0.1,
request_timeout=60.0
)
Settings.embed_model =OllamaEmbedding(
model_name="quentinz/bge-large-zh-v1.5",
base_url="http://monkey:11434",
ollama_additional_kwargs={"mirostat": 0}, # -mirostat N 使用 Mirostat 采样。
)
执行查询:
query_engine = NLSQLTableQueryEngine(
sql_database=sql_database,
tables=["school_info"],
)
query_str = "招生最多的是哪个学校?"
response = query_engine.query(query_str)
# '招生最多的是北京工业大学附属中学,共有418名学生。'
这种方式的不足:
需要使用 LlamaIndex 底层的检索 API:
nl_sql_retriever = NLSQLRetriever(
sql_database, tables=["school_info"], return_raw=True
)
query_engine = RetrieverQueryEngine.from_args(
nl_sql_retriever,
streaming=True
)
response = query_engine.query(
"招生最多的前三个学校?"
)
response.print_response_stream()
运行效果:
默认情况下查询是不支持模糊查询的:
response = query_engine.query("陈经纶招多少?")
response.print_response_stream()
# 无法回答这个问题,因为提供的上下文信息是一个空列表,没有包含任何与“陈经纶招多少”相关的内容。需要具体的数字、单位或者上下文来提供一个准确的答案。
需要增加提示词,另外需要高级 LLM 模型,本地模型(qwen 7b,14b/qwen2 7b/yi 6b)都不行,云端模型目前只有 qwen-turbo
生成的 sql 符合要求:
nl_sql_retriever = NLSQLRetriever( sql_database, tables=["school_info"], return_raw=False, llm=OpenAILike( model='qwen-turbo', api_base="http://ape:3000/v1", api_key="sk-bJP6QSnUfjAYeYeE505d3eBf63A643BeB0B8E350Df9b7750", is_chat_model=True, temperature=0.1, request_timeout=60.0 ) ) old_prompt_str=nl_sql_retriever.get_prompts()['text_to_sql_prompt'].template new_prompt = PromptTemplate( f"{old_prompt_str}" "查询关键字使用模糊查询, 并且查询结果应包含关键字所属的列" ) nl_sql_retriever.update_prompts({"text_to_sql_prompt": new_prompt}) query_engine = RetrieverQueryEngine.from_args( nl_sql_retriever, streaming=True, ) response = query_engine.query( "陈经纶招多少?" ) response.print_response_stream() # 陈经纶招收279名学生。
可以查看到检索数据详情:
[NodeWithScore(node=TextNode(id_=‘5baee8fa-73df-4133-952a-9a0e3b1b31ae’, embedding=None, metadata={‘sql_query’: “SELECT school_name, students_enrolled FROM school_info WHERE school_name LIKE ‘%陈经纶%’ ORDER BY students_enrolled DESC LIMIT 1;”, ‘result’: [(‘北京市陈经纶中学’, 279)], ‘col_keys’: [‘school_name’, ‘students_enrolled’]}, excluded_embed_metadata_keys=[‘sql_query’, ‘result’, ‘col_keys’], excluded_llm_metadata_keys=[‘sql_query’, ‘result’, ‘col_keys’], relationships={}, text=“[(‘北京市陈经纶中学’, 279)]”, mimetype=‘text/plain’, start_char_idx=None, end_char_idx=None, text_template=‘{metadata_str}\n\n{content}’, metadata_template=‘{key}: {value}’, metadata_seperator=‘\n’), score=None)]
如果需要更多要求,比如显示学校名称应该用全名,那么还得定制提示词,并且有与之匹配的模型,这里需要再上述检索基础上对回答内容增加提示词要求:
my_qa_prompt_template = ( "回答中要求使用学校的完整名称(school_name)" "不用再计算,给出的就是答案" "Context information is below.\n" "---------------------\n" "{context_str}\n" "---------------------\n" "Given the context information and not prior knowledge, " "answer the query.\n" "Query: {query_str}\n" "Answer: " ) my_qa_prompt = PromptTemplate( my_qa_prompt_template, prompt_type=PromptType.QUESTION_ANSWER ) query_engine = RetrieverQueryEngine.from_args( nl_sql_retriever, streaming=True, text_qa_template=my_qa_prompt, ) response = query_engine.query( "陈经纶招多少?" ) response.print_response_stream()
运行效果:
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。