当前位置:   article > 正文

langchain入门

langchain入门

1、langchain的2个能力

  1. 可以将 LLM 模型与外部数据源进行连接
  2. 允许与 LLM 模型进行交互

2、基础功能

LLM 调用

  • 支持多种模型接口,比如 OpenAI、Hugging Face、AzureOpenAI ...
  • Fake LLM,用于测试
  • 缓存的支持,比如 in-mem(内存)、SQLite、Redis、SQL
  • 用量记录
  • 支持流模式(就是一个字一个字的返回,类似打字效果)

Prompt管理,支持各种自定义模板

拥有大量的文档加载器,比如 Email、Markdown、PDF、Youtube ...

对索引的支持

  • 文档分割器
  • 向量化
  • 对接向量存储与搜索,比如 Chroma、Pinecone、Qdrand

Chains

  • LLMChain
  • 各种工具Chain
  • LangChainHub

3、一些概念

3.1、loader加载器

文件夹、csv文件、印象笔记、google网盘、任意网页、pdf、s3、youtube等加载器

3.2、Document 文档

loader加载器读取到数据源后,数据源需要转换为Document 对象才能使用。

3.3、text spltters文本分割

prompt、openai api embedding 功能都是有字符限制,需要进行分割

3.4、向量数据库

数据相关搜索是向量运算。doc需要先转化为向量才能进行向量运算,不能直接查询

3.5、chain链

chain可以理解为任务,一个chain就是一个任务。

3.6、agent代理

动态帮助我们选择或调用已有工具的代理器

3.7、embedding

用于衡量文本的相关性,openai实现知识库的关键所在

4、实战

4.1、完成一次问答

  1. import os
  2. os.environ["OPENAI_API_KEY"] = '你的api key'
  3. from langchain.llms import OpenAI
  4. llm = OpenAI(model_name="text-davinci-003",max_tokens=1024)
  5. llm("怎么评价人工智能")

4.2、调用google工具实现问答

SerpApi: Google Search API  注册Serpapi账号

  1. import os
  2. os.environ["OPENAI_API_KEY"] = '你的api key'
  3. os.environ["SERPAPI_API_KEY"] = '你的api key'
  4. from langchain.agents import load_tools
  5. from langchain.agents import initialize_agent
  6. from langchain.llms import OpenAI
  7. from langchain.agents import AgentType
  8. # 加载 OpenAI 模型
  9. llm = OpenAI(temperature=0,max_tokens=2048)
  10. # 加载 serpapi 工具
  11. tools = load_tools(["serpapi"])
  12. # 如果搜索完想再计算一下可以这么写
  13. # tools = load_tools(['serpapi', 'llm-math'], llm=llm)
  14. # 如果搜索完想再让他再用python的print做点简单的计算,可以这样写
  15. # tools=load_tools(["serpapi","python_repl"])
  16. # 工具加载后都需要初始化,verbose 参数为 True,会打印全部的执行详情
  17. agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
  18. # 运行 agent
  19. agent.run("What's the date today? What great events have taken place today in history?")

4.3、对超长文本进行总结

现将文本分段,然后逐段总结,最后合并各个总结。

  1. from langchain.document_loaders import UnstructuredFileLoader
  2. from langchain.chains.summarize import load_summarize_chain
  3. from langchain.text_splitter import RecursiveCharacterTextSplitter
  4. from langchain import OpenAI
  5. # 导入文本
  6. loader = UnstructuredFileLoader("/content/sample_data/data/lg_test.txt")
  7. # 将文本转成 Document 对象
  8. document = loader.load()
  9. print(f'documents:{len(document)}')
  10. # 初始化文本分割器
  11. text_splitter = RecursiveCharacterTextSplitter(
  12. chunk_size = 500,
  13. chunk_overlap = 0
  14. )
  15. # 切分文本
  16. split_documents = text_splitter.split_documents(document)
  17. print(f'documents:{len(split_documents)}')
  18. # 加载 llm 模型
  19. llm = OpenAI(model_name="text-davinci-003", max_tokens=1500)
  20. # 创建总结链
  21. chain = load_summarize_chain(llm, chain_type="refine", verbose=True)
  22. # 执行总结链,(为了快速演示,只总结前5段)
  23. chain.run(split_documents[:5])

4.4、构建本地问答机器人

文档向量化、query向量化检索

  1. from langchain.embeddings.openai import OpenAIEmbeddings
  2. from langchain.vectorstores import Chroma
  3. from langchain.text_splitter import CharacterTextSplitter
  4. from langchain import OpenAI
  5. from langchain.document_loaders import DirectoryLoader
  6. from langchain.chains import RetrievalQA
  7. # 加载文件夹中的所有txt类型的文件
  8. loader = DirectoryLoader('/content/sample_data/data/', glob='**/*.txt')
  9. # 将数据转成 document 对象,每个文件会作为一个 document
  10. documents = loader.load()
  11. # 初始化加载器
  12. text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
  13. # 切割加载的 document
  14. split_docs = text_splitter.split_documents(documents)
  15. # 初始化 openai 的 embeddings 对象
  16. embeddings = OpenAIEmbeddings()
  17. # 将 document 通过 openai 的 embeddings 对象计算 embedding 向量信息并临时存入 Chroma 向量数据库,用于后续匹配查询
  18. docsearch = Chroma.from_documents(split_docs, embeddings)
  19. # 创建问答对象
  20. qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=docsearch.as_retriever(), return_source_documents=True)
  21. # 进行问答
  22. result = qa({"query": "科大讯飞今年第一季度收入是多少?"})
  23. print(result)

4.5、构建向量索引数据库

4.4中的向量化需要实时计算,可以考虑通过 Chroma 和 Pinecone 这两个数据库来讲一下如何做向量数据持久化。

Chroma持久化

  1. from langchain.vectorstores import Chroma
  2. # 持久化数据
  3. docsearch = Chroma.from_documents(documents, embeddings, persist_directory="D:/vector_store")
  4. docsearch.persist()
  5. # 加载数据
  6. docsearch = Chroma(persist_directory="D:/vector_store", embedding_function=embeddings)

Pinecone持久化

  1. # 持久化数据
  2. docsearch = Pinecone.from_texts([t.page_content for t in split_docs], embeddings, index_name=index_name)
  3. # 加载数据
  4. docsearch = Pinecone.from_existing_index(index_name, embeddings)

问答搜索

  1. from langchain.text_splitter import CharacterTextSplitter
  2. from langchain.document_loaders import DirectoryLoader
  3. from langchain.vectorstores import Chroma, Pinecone
  4. from langchain.embeddings.openai import OpenAIEmbeddings
  5. from langchain.llms import OpenAI
  6. from langchain.chains.question_answering import load_qa_chain
  7. import pinecone
  8. # 初始化 pinecone
  9. pinecone.init(
  10. api_key="你的api key",
  11. environment="你的Environment"
  12. )
  13. loader = DirectoryLoader('/content/sample_data/data/', glob='**/*.txt')
  14. # 将数据转成 document 对象,每个文件会作为一个 document
  15. documents = loader.load()
  16. # 初始化加载器
  17. text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=0)
  18. # 切割加载的 document
  19. split_docs = text_splitter.split_documents(documents)
  20. index_name="liaokong-test"
  21. # 持久化数据
  22. # docsearch = Pinecone.from_texts([t.page_content for t in split_docs], embeddings, index_name=index_name)
  23. # 加载数据
  24. docsearch = Pinecone.from_existing_index(index_name,embeddings)
  25. query = "科大讯飞今年第一季度收入是多少?"
  26. docs = docsearch.similarity_search(query, include_metadata=True)
  27. llm = OpenAI(temperature=0)
  28. chain = load_qa_chain(llm, chain_type="stuff", verbose=True)
  29. chain.run(input_documents=docs, question=query)

4.6、使用GPT3.5模型构建油管频道问答机器人

加载视频,文本化、构建向量索引库,构建模版、初始化prompt,初始化问答链、回答问题

  1. import os
  2. from langchain.document_loaders import YoutubeLoader
  3. from langchain.embeddings.openai import OpenAIEmbeddings
  4. from langchain.vectorstores import Chroma
  5. from langchain.text_splitter import RecursiveCharacterTextSplitter
  6. from langchain.chains import ChatVectorDBChain, ConversationalRetrievalChain
  7. from langchain.chat_models import ChatOpenAI
  8. from langchain.prompts.chat import (
  9. ChatPromptTemplate,
  10. SystemMessagePromptTemplate,
  11. HumanMessagePromptTemplate
  12. )
  13. # 加载 youtube 频道
  14. loader = YoutubeLoader.from_youtube_url('https://www.youtube.com/watch?v=Dj60HHy-Kqk')
  15. # 将数据转成 document
  16. documents = loader.load()
  17. # 初始化文本分割器
  18. text_splitter = RecursiveCharacterTextSplitter(
  19. chunk_size=1000,
  20. chunk_overlap=20
  21. )
  22. # 分割 youtube documents
  23. documents = text_splitter.split_documents(documents)
  24. # 初始化 openai embeddings
  25. embeddings = OpenAIEmbeddings()
  26. # 将数据存入向量存储
  27. vector_store = Chroma.from_documents(documents, embeddings)
  28. # 通过向量存储初始化检索器
  29. retriever = vector_store.as_retriever()
  30. system_template = """
  31. Use the following context to answer the user's question.
  32. If you don't know the answer, say you don't, don't try to make it up. And answer in Chinese.
  33. -----------
  34. {question}
  35. -----------
  36. {chat_history}
  37. """
  38. # 构建初始 messages 列表,这里可以理解为是 openai 传入的 messages 参数
  39. messages = [
  40. SystemMessagePromptTemplate.from_template(system_template),
  41. HumanMessagePromptTemplate.from_template('{question}')
  42. ]
  43. # 初始化 prompt 对象
  44. prompt = ChatPromptTemplate.from_messages(messages)
  45. # 初始化问答链
  46. qa = ConversationalRetrievalChain.from_llm(ChatOpenAI(temperature=0.1,max_tokens=2048),retriever,condense_question_prompt=prompt)
  47. chat_history = []
  48. while True:
  49. question = input('问题:')
  50. # 开始发送问题 chat_history 为必须参数,用于存储对话历史
  51. result = qa({'question': question, 'chat_history': chat_history})
  52. chat_history.append((question, result['answer']))
  53. print(result['answer'])

4.7、用 OpenAI 连接万种工具

使用 zapier 来实现将万种工具连接;申请zapier的api key .4Get Started - Zapier AI Actions

  1. import os
  2. os.environ["ZAPIER_NLA_API_KEY"] = ''
  3. from langchain.llms import OpenAI
  4. from langchain.agents import initialize_agent
  5. from langchain.agents.agent_toolkits import ZapierToolkit
  6. from langchain.utilities.zapier import ZapierNLAWrapper
  7. llm = OpenAI(temperature=.3)
  8. zapier = ZapierNLAWrapper()
  9. toolkit = ZapierToolkit.from_zapier_nla_wrapper(zapier)
  10. agent = initialize_agent(toolkit.get_tools(), llm, agent="zero-shot-react-description", verbose=True)
  11. # 我们可以通过打印的方式看到我们都在 Zapier 里面配置了哪些可以用的工具
  12. for tool in toolkit.get_tools():
  13. print (tool.name)
  14. print (tool.description)
  15. print ("\n\n")
  16. agent.run('请用中文总结最后一封"******@qq.com"发给我的邮件。并将总结发送给"******@qq.com"')

4.8、执行多个chain

链式或顺序执行多个chain,定义多个chain通过SimpleSequentialChain串联起来

  1. from langchain.llms import OpenAI
  2. from langchain.chains import LLMChain
  3. from langchain.prompts import PromptTemplate
  4. from langchain.chains import SimpleSequentialChain
  5. # location 链
  6. llm = OpenAI(temperature=1)
  7. template = """Your job is to come up with a classic dish from the area that the users suggests.
  8. % USER LOCATION
  9. {user_location}
  10. YOUR RESPONSE:
  11. """
  12. prompt_template = PromptTemplate(input_variables=["user_location"], template=template)
  13. location_chain = LLMChain(llm=llm, prompt=prompt_template)
  14. # meal 链
  15. template = """Given a meal, give a short and simple recipe on how to make that dish at home.
  16. % MEAL
  17. {user_meal}
  18. YOUR RESPONSE:
  19. """
  20. prompt_template = PromptTemplate(input_variables=["user_meal"], template=template)
  21. meal_chain = LLMChain(llm=llm, prompt=prompt_template)
  22. # 通过 SimpleSequentialChain 串联起来,第一个答案会被替换第二个中的user_meal,然后再进行询问
  23. overall_chain = SimpleSequentialChain(chains=[location_chain, meal_chain], verbose=True)
  24. review = overall_chain.run("Rome")

4.9、结构化输出

定义输出结构,使用StructuredOutputParser结构化,让模型按照结构输出

  1. from langchain.output_parsers import StructuredOutputParser, ResponseSchema
  2. from langchain.prompts import PromptTemplate
  3. from langchain.llms import OpenAI
  4. llm = OpenAI(model_name="text-davinci-003")
  5. # 告诉他我们生成的内容需要哪些字段,每个字段类型式啥
  6. response_schemas = [
  7. ResponseSchema(name="bad_string", description="This a poorly formatted user input string"),
  8. ResponseSchema(name="good_string", description="This is your response, a reformatted response")
  9. ]
  10. # 初始化解析器
  11. output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
  12. # 生成的格式提示符
  13. # {
  14. # "bad_string": string // This a poorly formatted user input string
  15. # "good_string": string // This is your response, a reformatted response
  16. #}
  17. format_instructions = output_parser.get_format_instructions()
  18. template = """
  19. You will be given a poorly formatted string from a user.
  20. Reformat it and make sure all the words are spelled correctly
  21. {format_instructions}
  22. % USER INPUT:
  23. {user_input}
  24. YOUR RESPONSE:
  25. """
  26. # 将我们的格式描述嵌入到 prompt 中去,告诉 llm 我们需要他输出什么样格式的内容
  27. prompt = PromptTemplate(
  28. input_variables=["user_input"],
  29. partial_variables={"format_instructions": format_instructions},
  30. template=template
  31. )
  32. promptValue = prompt.format(user_input="welcom to califonya!")
  33. llm_output = llm(promptValue)
  34. # 使用解析器进行解析生成的内容
  35. output_parser.parse(llm_output)

4.10、以prompt的方式格式化输出

  1. from langchain.prompts import PromptTemplate
  2. from langchain.llms import OpenAI
  3. from langchain.chains import LLMRequestsChain, LLMChain
  4. llm = OpenAI(model_name="gpt-3.5-turbo", temperature=0)
  5. template = """在 >>> 和 <<< 之间是网页的返回的HTML内容。
  6. 网页是新浪财经A股上市公司的公司简介。
  7. 请抽取参数请求的信息。
  8. >>> {requests_result} <<<
  9. 请使用如下的JSON格式返回数据
  10. {{
  11. "company_name":"a",
  12. "company_english_name":"b",
  13. "issue_price":"c",
  14. "date_of_establishment":"d",
  15. "registered_capital":"e",
  16. "office_address":"f",
  17. "Company_profile":"g"
  18. }}
  19. Extracted:"""
  20. prompt = PromptTemplate(
  21. input_variables=["requests_result"],
  22. template=template
  23. )
  24. chain = LLMRequestsChain(llm_chain=LLMChain(llm=llm, prompt=prompt))
  25. inputs = {
  26. "url": "https://vip.stock.finance.sina.com.cn/corp/go.php/vCI_CorpInfo/stockid/600519.phtml"
  27. }
  28. response = chain(inputs)
  29. print(response['output'])

4.11、自定义agent使用工具

定义工具的具体使用情景,遇到相应的任务使用自定义的工具

  1. from langchain.agents import initialize_agent, Tool
  2. from langchain.agents import AgentType
  3. from langchain.tools import BaseTool
  4. from langchain.llms import OpenAI
  5. from langchain import LLMMathChain, SerpAPIWrapper
  6. llm = OpenAI(temperature=0)
  7. # 初始化搜索链和计算链
  8. search = SerpAPIWrapper()
  9. llm_math_chain = LLMMathChain(llm=llm, verbose=True)
  10. # 创建一个功能列表,指明这个 agent 里面都有哪些可用工具,agent 执行过程可以看必知概念里的 Agent 那张图
  11. tools = [
  12. Tool(
  13. name = "Search",
  14. func=search.run,
  15. description="useful for when you need to answer questions about current events"
  16. ),
  17. Tool(
  18. name="Calculator",
  19. func=llm_math_chain.run,
  20. description="useful for when you need to answer questions about math"
  21. )
  22. ]
  23. # 初始化 agent
  24. agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
  25. # 执行 agent
  26. agent.run("Who is Leo DiCaprio's girlfriend? What is her current age raised to the 0.43 power?")

4.12、使用memory实现带记忆机器人

使用自带memory实现带记忆机器人

  1. from langchain.memory import ChatMessageHistory
  2. from langchain.chat_models import ChatOpenAI
  3. chat = ChatOpenAI(temperature=0)
  4. # 初始化 MessageHistory 对象
  5. history = ChatMessageHistory()
  6. # 给 MessageHistory 对象添加对话内容
  7. history.add_ai_message("你好!")
  8. history.add_user_message("中国的首都是哪里?")
  9. # 执行对话
  10. ai_response = chat(history.messages)
  11. print(ai_response)

4.13、使用hugging face模型

有2种使用hugging face的方式:在线、离线

在线使用hugging face

  1. #配置hugging face环境变量
  2. import os
  3. os.environ['HUGGINGFACEHUB_API_TOKEN'] = ''
  4. from langchain import PromptTemplate, HuggingFaceHub, LLMChain
  5. template = """Question: {question}
  6. Answer: Let's think step by step."""
  7. prompt = PromptTemplate(template=template, input_variables=["question"])
  8. llm = HuggingFaceHub(repo_id="google/flan-t5-xl", model_kwargs={"temperature":0, "max_length":64})
  9. llm_chain = LLMChain(prompt=prompt, llm=llm)
  10. question = "What NFL team won the Super Bowl in the year Justin Beiber was born?"
  11. print(llm_chain.run(question))

将模型加载到本地运行

  1. from langchain import PromptTemplate, LLMChain
  2. from langchain.llms import HuggingFacePipeline
  3. from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline, AutoModelForSeq2SeqLM
  4. model_id = 'google/flan-t5-large'
  5. tokenizer = AutoTokenizer.from_pretrained(model_id)
  6. model = AutoModelForSeq2SeqLM.from_pretrained(model_id)
  7. pipe = pipeline(
  8. "text2text-generation",
  9. model=model,
  10. tokenizer=tokenizer,
  11. max_length=100
  12. )
  13. local_llm = HuggingFacePipeline(pipeline=pipe)
  14. print(local_llm('What is the capital of France? '))
  15. template = """Question: {question} Answer: Let's think step by step."""
  16. prompt = PromptTemplate(template=template, input_variables=["question"])
  17. llm_chain = LLMChain(prompt=prompt, llm=local_llm)
  18. question = "What is the capital of England?"
  19. print(llm_chain.run(question))

4.14、根据自然语言执行sql

  1. from langchain.agents import create_sql_agent
  2. from langchain.agents.agent_toolkits import SQLDatabaseToolkit
  3. from langchain.sql_database import SQLDatabase
  4. from langchain.llms.openai import OpenAI
  5. db = SQLDatabase.from_uri("sqlite:///../notebooks/Chinook.db")
  6. toolkit = SQLDatabaseToolkit(db=db)
  7. agent_executor = create_sql_agent(
  8. llm=OpenAI(temperature=0),
  9. toolkit=toolkit,
  10. verbose=True
  11. )
  12. agent_executor.run("Describe the playlisttrack table")

5、参考文档

GitHub - liaokongVFX/LangChain-Chinese-Getting-Started-Guide: LangChain 的中文入门教程

使用 LangChain 在本地部署私有化 HuggingFace 模型 - 知乎

吴恩达OPENAI《ChatGPT 提示工程》学习笔记7:自动回复评论及temperature温度参数 - 知乎

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/287395
推荐阅读
相关标签
  

闽ICP备14008679号