【LangChain】(五) 利用Langchain实现表格与文本的检索增强生成(RAG)教程与实战案例!
Langchain作为一个强大的框架,能够帮助我们实现表格和文本的检索增强生成(RAG)。本文将为您详细介绍如何使用Langchain进行表格和文本的RAG,并提供实用的代码示例,助您快速上手!@
-
\1. 引言
-
\2. 不使用Langchain的RAG实现
-
- 表格处理
- 文本处理
-
\3. 使用Langchain的RAG实现
-
- 表格处理
- 文本处理
-
\4. 使用Agent组合多种文档
-
\5. 总结与引导
1. 引言
在学习Langchain的过程中,我发现自己在能力提升上遇到了一些瓶颈,因此决定深入研究如何利用Langchain进行数据库和文档的检索增强生成。通过这次学习,我不仅掌握了如何快速查看文档API,还积累了一些实用的代码经验。接下来,我将分享我的学习成果,希望对您有所帮助!
2. 不使用Langchain的RAG实现
表格处理
在这一部分,我们将介绍如何在不使用Langchain的情况下进行表格的RAG实现。
方法1:读取Markdown格式的表格并嵌入模板
import pandas as pd
import sqlalchemy
from zhipuai import ZhipuAI
# 创建数据库连接
def create_db_connection(role, password, port, db):
return sqlalchemy.create_engine(f'mysql+pymysql://{role}:{password}@localhost:{port}/{db}')
# 读取数据并转换为Markdown格式
def fetch_data_as_markdown(engine):
sql = 'SELECT * FROM major_list'
df = pd.read_sql(sql, engine)
return df.to_markdown()
# 生成回答
def generate_response(question, context):
prompt_template = """请阅读下表的Markdown格式,然后根据表格回答问题。一行中的表单元格用“|”分隔,不同行用“n”分隔
问题:
{question}
表格:
{context}
"""
return prompt_template.format(question=question, context=context)
# 主程序
if __name__ == "__main__":
engine = create_db_connection('{role}', '{password}', '{port}', '{db}')
tb = fetch_data_as_markdown(engine)
client = ZhipuAI(api_key='{your_api_key}') # 填写您的API Key
response = generate_response("设计学类有什么专业?授予学位是什么?学制多久?", tb)
print(response)
方法2:直接使用函数调用
import json
import pandas as pd
import sqlalchemy
from zhipuai import ZhipuAI
# 创建数据库连接
def create_db_connection(role, password, port, db):
return sqlalchemy.create_engine(f'mysql+pymysql://{role}:{password}@localhost:{port}/{db}')
# 读取数据
def fetch_data(engine):
sql = 'SELECT * FROM major_list'
return pd.read_sql(sql, engine)
# 根据条件过滤数据
def get_major_name(df, maj_category=None, maj_name=None, maj_code=None, degree_category=None, years=None, added_years=None):
if maj_category:
df = df[df['maj_category'] == maj_category]
if maj_name:
df = df[df['maj_name'] == maj_name]
if maj_code:
df = df[df['maj_code'] == maj_code]
if degree_category:
df = df[df['degree_category'] == degree_category]
if years:
df = df[df['years'] == years]
if added_years:
df = df[df['added_years'] == added_years]
return df.to_markdown()
# 处理函数调用结果
def parse_function_call(model_response, messages):
if model_response.choices[0].message.tool_calls:
tool_call = model_response.choices[0].message.tool_calls[0]
args = tool_call.function.arguments
function_result = {}
if tool_call.function.name == "get_major_name":
function_result = get_major_name(**json.loads(args))
messages.append({
"role": "tool",
"content": json.dumps(function_result),
"tool_call_id": tool_call.id
})
return messages
# 主程序
if __name__ == "__main__":
engine = create_db_connection('{role}', '{password}', '{port}', '{db}')
df = fetch_data(engine)
client = ZhipuAI(api_key='{your_api_key}') # 填写您的API Key
messages = [{"role": "user", "content": "帮我查询视觉传达这个专业所有信息"}]
response = client.chat.completions.create(model="glm-4", messages=messages)
messages = parse_function_call(response, messages)
print(messages)
文本处理
文本相似度检索的过程如下:
- 读入文本并进行清洗
- 文本句子切分
- 文本向量化
- 计算相似度
- 取前几的答案作为输入
3. 使用Langchain的RAG实现
表格处理
方法1:使用Agent
from langchain.agents import tool
from langchain_community.utilities.sql_database import SQLDatabase
from langchain_community.agent_toolkits import create_sql_agent
# 创建数据库连接
db = SQLDatabase.from_uri('mysql+pymysql://{role}:{password}@localhost:{port}/{db}')
llm = get_glm(0.01)
# 创建Agent
agent_executor = create_sql_agent(llm, db=db, agent_type="openai-tools", verbose=True)
# 执行查询
output_res = agent_executor.invoke({"input": "2024年中国石油大学招收学生高考分数线是多少分?"})['output']
print(output_res)
方法2:使用Chain
from langchain_experimental.sql import SQLDatabaseChain
# 创建数据库连接
db = SQLDatabase.from_uri('mysql+pymysql://{role}:{password}@localhost:{port}/{db}')
db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)
# 执行查询
result = db_chain.run("2024年中国石油大学招收学生高考分数线是多少分?")
print(result)
文本处理
使用Langchain的RetrievalQA进行文本处理:
from langchain.chains import RetrievalQA
from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.llms import OpenAI
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
# 加载文档
loader = TextLoader("../../state_of_the_union.txt")
documents = loader.load()
# 文本切分
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
# 向量化
embeddings = OpenAIEmbeddings()
docsearch = Chroma.from_documents(texts, embeddings)
# 创建RetrievalQA
qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=docsearch.as_retriever())
# 执行查询
query = "What did the president say about Ketanji Brown Jackson?"
result = qa.run(query)
print(result)
4. 使用Agent组合多种文档
在这一部分,我们将展示如何使用Agent将文本和数据库表格等多种文档组合起来。
from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType
from langchain.chains import RetrievalQA
from langchain_community.document_loaders import PyPDFLoader
from langchain_openai import ChatOpenAI
from langchain_text_splitters import CharacterTextSplitter
from langchain_experimental.sql import SQLDatabaseChain
from langchain_community.retrievers import BM25Retriever
from langchain.utilities import SQLDatabase
# 初始化模型
llm = ChatOpenAI() # 或者使用其他模型
# 创建数据库连接
db = SQLDatabase.from_uri('mysql+pymysql://{role}:{password}@localhost:{port}/{db}')
db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)
# 加载PDF文档
loader = PyPDFLoader("./CollegesandUniversities.pdf")
pages = loader.load_and_split()
# 文本切分
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(pages)
# 创建检索器
retriever = BM25Retriever.from_documents(docs)
# 创建功能列表
tools = [
Tool(
name="txt_search",
func=RetrievalQA.from_chain_type(llm=llm, retriever=retriever),
description="用于回答关于大学的问题。"
),
Tool(
name="db_search",
func=db_chain.run,
description="用于回答关于专业的问题。"
)
]
# 初始化Agent
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
# 执行Agent
res = agent({"input": "Do you know the name of the major whose major code is 020309T?"})["output"]
print("-----------------------------------")
print(res)
🔥codemoss_能用AI
【无限GPT4.omini】 【拒绝爬梯】 【上百种AI工作流落地场景】 【主流大模型集聚地:GPT-4o-Mini、GPT-3.5 Turbo、GPT-4 Turbo、GPT-4o、GPT-o1、Claude-3.5-Sonnet、Gemini Pro、月之暗面、文心一言 4.0、通易千问 Plus等众多模型】
🔥传送门:https://www.nyai.chat/chat?invite=nyai_1141439&fromChannel=hp_gzh
在这里插入图片描述
5. 总结与引导
通过本文的介绍,您应该对如何使用Langchain进行表格和文本的检索增强生成有了更深入的了解。无论是通过直接的函数调用,还是利用Langchain的Agent和Chain,您都可以灵活地处理各种数据源,提升信息检索的效率。
零基础入门AI大模型
今天贴心为大家准备好了一系列AI大模型资源,包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
有需要的小伙伴,可以点击下方链接免费领取【保证100%免费
】
1.学习路线图
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
(都打包成一块的了,不能一一展开,总共300多集)
3.技术文档和电子书
这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。
4.LLM面试题和面经合集
这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集
5.免费获取
这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码或者点击以下链接都可以免费领取【保证100%免费】