初级菜鸟学 Langchain 实录:Langchain 做简单 RAG
初级菜鸟学 Langchain 实录:Langchain 做简单 RAG
初级菜鸟学 Langchain 实录:Langchain 做简单 RAG 初级菜鸟学 Langchain 实录:Langchain 做简单 RAG Code block Plain Text prompt template = """请阅读下表的Markdown格式,然后根据表格回答问题。一行中的表单元格用“|”分隔,不同行用“n”分隔 问题: {question} 表格: {context} """ text2chatglm = prompt template.format map({ 'question': "设计学类有什么专业?授予学位为什么?学制多久?", 'context': tb }) 这里举例为 GLM 的例子,Azure openai 同理。 方法 2:直接使用 function call。 绕过 langchain 定义数据库读取的方式。这里我只尝试了 GLM 的官方方法。 Code block Plain Text from zhipuai import ZhipuAI import json import pandas as pd import sqlalchemy engine = sqlalchemy.create engine('mysql+pymysql://{role}:{password}@localhost:{port}/{db}') sql=''' select from major list ''' df = pd.read sql(sql,engine) tb=df.to markdown() def get major name(maj category:str,maj name:str,maj code:str,degree catgory:str,years:str,added years:str): if maj category is not None: df= df[df['maj category']==maj category] if maj name is not None: df= df[df['maj name']==maj name] if maj code is not None: df= df[df['maj code']==maj code] if degree catgory is not None: df= df[df['degree category']==degree catgory] if years is not None: df= df[df['years']==years] if added years is not None: df= df[df['added years']==added years] tb=df.to markdown() return {"major list":tb} def parse function call(model response,messages): 处理函数调用结果,根据模型返回参数,调用对应的函数。 调用函数返回结果后构造tool message,再次调用模型,将函数结果输入模型 模型会将函数调用结果以自然语言格式返回给用户。 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 flight number( json.loads(args)) messages.append({ "role": "tool", "content": f"{json.dumps(function result)}", "tool call id":tool call.id }) response = client.chat.completions.create( model="glm 4", 填写需要调用的模型名称 messages=messages, tools=tools, ) print(response.choices[0].message) messages.append(response.choices[0].message.model dump()) client = ZhipuAI(api key) tools = [ { "type": "function", "function": { "name": "get flight number", "description": "根据专业大类或专业名或专业代码或学位授予分类或学制或增设年份查询专业信息", "parameters": { "type": "object", "properties": { "maj category": { "description": "专业大类", "type": "string" }, "maj name": { "description": "专业名字", "type": "string" }, "maj code": { "description": "专业代码", "type": "string", }, "degree category": { "description": "学位授予分类", "type": "string" }, "years": { "description": "学制", "type": "string" }, "added years": { "description": "增设时间", "type": "string", } } }, } } ] messages = [] messages.append({"role": "system", "content": "不要假设或猜测传入函数的参数值。如果用户的描述不明确,请要求用户提供必要信息"}) messages.append({"role": "user", "content": "帮我查询工艺美术这个专业所有信息"}) response = client.chat.completions.create( model="glm 4", messages=messages, tools=tools, ) print(response.choices[0].message) messages.append(response.choices[0].message.model dump()) parse function call(response,messages) 这里的 parse function call 是 GLM 的 SDK 开放的工具。我的理解是大模型从用户输入的语言提炼出函数所需的参数变量然后进行传参完成数据库查询。 Text 文字 文字相似度检索过程 读入文字,进行文字清洗 文本句子切分 文本向量化 计算相似度 取前几的答案为输入 详情见 https://github.com/yuanzhoulvpi2017/DocumentSearch 脚本简单易懂,不再赘述。 Part1 不用学习框架,快速实现。氮素过于简单,写得太死,不利于后期持续开发,如果有好的方法尝试基本重开【正常人开发都不会这样的。。除非很紧急没空看文档】 Part2 用 Langchain 做 table 和 text 的 RAG Table 表格 法 1:运用 Agent: Code block Plain Text from langchain.agents import tool from langchain community.utilities.sql database import SQLDatabase Db=SQLDatabase.from uri('mysql+pymysql://{role}:{password}@localhost:{port}/{db}') from langchain community.agent toolkits import create sql agent llm=get glm(0.01) agent executor = create sql agent(llm, db=db, agent type="openai tools", verbose=True) output Res=agent executor.invoke( {"input":"2023年浙江大学招收北京地区学生高考分数线是多少分?"} )['output'] 法 2:运用 Chain: Code block Plain Text 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) Db chain.run(“prompt”) Text 文字 RetrievalQA.from chain type Code block Plain Text 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) qa = RetrievalQA.from chain type(llm=OpenAI(), chain type="stuff", retriever=docsearch.as retriever()) query = "What did the president say about Ketanji Brown Jackson" qa.run(query) Part3 使用 Agent 把文本多种文档组合起来! 这里只示范文本和数据库表格等等,别的我觉得就是差不多类似的写法! 主要用 chain。Agent 套来套去也可以,就是容易眼花。。 Code block Plain Text from langchain.agents import initialize agent, Tool from langchain.agents import AgentType from langchain.tools import BaseTool from langchain import LLMMathChain, SerpAPIWrapper import os from langchain.agents import Tool from langchain.chains import RetrievalQA from langchain community.document loaders import PyPDFLoader from langchain openai import ChatOpenAI,AzureChatOpenAI from langchain text splitters import CharacterTextSplitter from pydantic.v1 import BaseModel,Field import os from langchain experimental.sql import SQLDatabaseChain from langchain community.retrievers import BM25Retriever from langchain.utilities import SQLDatabase llm = AzureChatOpenAI() or llm=zhupuai() Whatever... db = SQLDatabase.from uri('mysql+pymysql://{role}:{password}@localhost:{port}/{db}') db chain = SQLDatabaseChain.from llm(llm, db, verbose=True) 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) 创建一个功能列表,指明这个 agent 里面都有哪些可用工具,agent 执行过程可以看必知概念里的 Agent 那张图 tools = [ Tool( name = "txt search", func=RetrievalQA.from chain type(llm=llm, retriever=retriever), description="useful for when you need to answer questions about universities." ), Tool( name="db search", func=db chain.run, description="useful for when you need to answer questions about major." ) ] 初始化 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) 最后 https://gitee.com/cyz6668/langchain simple rag 整理好了,欢迎踩踩 这里举例为 GLM 的例子,Azure openai 同理。 方法 2:直接使用 function call。 绕过 langchain 定义数据库读取的方式。这里我只尝试了 GLM 的官方方法。 这里的 parse function call 是 GLM 的 SDK 开放的工具。我的理解是大模型从用户输入的语言提炼出函数所需的参数变量然后进行传参完成数据库查询。 Text 文字 文字相似度检索过程 读入文字,进行文字清洗 文本句子切分 文本向量化 计算相似度 取前几的答案为输入 详情见 https://github.com/yuanzhoulvpi2017/DocumentSearch 脚本简单易懂,不再赘述。 Part1 不用学习框架,快速实现。氮素过于简单,写得太死,不利于后期持续开发,如果有好的方法尝试基本重开【正常人开发都不会这样的。。除非很紧急没空看文档】 Part2 用 Langchain 做 table 和 text 的 RAG Table 表格 法 1:运用 Agent: 法 2:运用 Chain: Text 文字 RetrievalQA.from chain type Part3 使用 Agent 把文本多种文档组合起来! 这里只示范文本和数据库表格等等,别的我觉得就是差不多类似的写法! 主要用 chain。Agent 套来套去也可以,就是容易眼花。。 最后 https://gitee.com/cyz6668/langchain simple rag 整理好了,欢迎踩踩 🔗 原文链接: https://mp.weixin.qq.com/s? biz=Mz... https://mp.weixin.qq.com/s? biz=Mz... ⏰ 发表时间:2024 04 25 作者 菜叶子 公众号 capycapybabala 欢迎关注 内容目录 🎥 Part 1 没有用 Langchain 做 table 和 text 的 RAG Table 表格 方法 1:读入表格嵌入 template 方法 2:直接使用 function call Text 文字 Part2 用 Langchain 做 table 和 text 的 RAG Table 表格 方法 1:运用 Agent: 方法 2:运用 Chain: Text 文字 Part3 使用 Agent 把文本多种文档组合起来! Part 1 没有用 Langchain 做 table 和 text 的 RAG Table 表格 方法 1:读入表格嵌入 template 方法 2:直接使用 function call Text 文字 Part2 用 Langchain 做 table 和 text 的 RAG Table 表格 方法 1:运用 Agent: 方法 2:运用 Chain: Text 文字 Part3 使用 Agent 把文本多种文档组合起来! 初级菜鸟学 Langchain 实录! 本文记录利用 GLM/Azure openai 检索数据库/文档生成答案的代码脚本! 这周我在学习 Langchain 做数据库和文档的检索增强生成。实不相瞒,我已经在工作中处于能力增长的停滞期,我得自己寻求机会去锻炼写代码的能力!这周学习 Langchain 框架,让我有了一点点如何快速看文档 api 写代码产出的经验认识。【我知道这个对于大佬来说很简单,对于我来说不是那么简单,甚至需要一点点工程直觉,后面熟练工了就越做越快】 Part 1 没有用 Langchain 做 table 和 text 的 RAG 这里就讲简单的 retrieve 的过程。 Table 表格 方法 1: 读入表格 markdown 格式,嵌入 template。