AI创想

标题: LangChain入门指南,学习Langchain看这篇足够了 [打印本页]

作者: 含湄素依    时间: 10 小时前
标题: LangChain入门指南,学习Langchain看这篇足够了
作者:CSDN博客
什么是LangChain

LangChain是一个强大的框架,旨在帮助开发人员使用语言模型构建端到端的应用程序。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互,将多个组件链接在一起,并集成额外的资源,例如 API 和数据库。
官方文档:https://python.langchain.com/en/latest/
中文文档:https://www.langchain.com.cn/
如何使用 LangChain?

要使用 LangChain,开发人员首先要导入必要的组件和工具,例如 LLMs, chat models, agents, chains, 内存功能。这些组件组合起来创建一个可以理解、处理和响应用户输入的应用程序。
LangChain 为特定用例提供了多种组件,例如个人助理、文档问答、聊天机器人、查询表格数据、与 API 交互、提取、评估和汇总。
LangChain的模型

LangChain model 是一种抽象,表示框架中使用的不同类型的模型。LangChain 中的模型主要分为三类:
1.LLM(大型语言模型):这些模型将文本字符串作为输入并返回文本字符串作为输出。它们是许多语言模型应用程序的支柱。
2.聊天模型( Chat Model):聊天模型由语言模型支持,但具有更结构化的 API。他们将聊天消息列表作为输入并返回聊天消息。这使得管理对话历史记录和维护上下文变得容易。
3.文本嵌入模型(Text Embedding Models):这些模型将文本作为输入并返回表示文本嵌入的浮点列表。这些嵌入可用于文档检索、聚类和相似性比较等任务。
LangChain 的主要特点

LangChain 旨在为六个主要领域的开发人员提供支持:
1.LLM 和提示:LangChain 使管理提示、优化它们以及为所有 LLM 创建通用界面变得容易。此外,它还包括一些用于处理 LLM 的便捷实用程序。
2.链(Chain):这些是对 LLM 或其他实用程序的调用序列。LangChain 为链提供标准接口,与各种工具集成,为流行应用提供端到端的链。数据增强生成:
3.LangChain 使链能够与外部数据源交互以收集生成步骤的数据。例如,它可以帮助总结长文本或使用特定数据源回答问题。
4.Agents:Agents 让 LLM 做出有关行动的决定,采取这些行动,检查结果,并继续前进直到工作完成。LangChain 提供了代理的标准接口,多种代理可供选择,以及端到端的代理示例。
5.内存:LangChain 有一个标准的内存接口,有助于维护链或代理调用之间的状态。它还提供了一系列内存实现和使用内存的链或代理的示例。
6.评估:很难用传统指标评估生成模型。这就是为什么 LangChain 提供提示和链来帮助开发者自己使用 LLM 评估他们的模型。
使用示例

LangChain 支持大量用例,例如:
  1. 针对特定文档的问答:根据给定的文档回答问题,使用这些文档中的信息来创建答案。聊天机器人:构建可以利用 LLM 的功能生成文本的聊天机器人。Agents:开发可以决定行动、采取这些行动、观察结果并继续执行直到完成的代理。
复制代码
快速入门指南:使用 LangChain 构建端到端语言模型应用程序
[OPENAI_API_KEY可以去官网生成(调用接口要钱,比较便宜)]
安装
首先,安装 LangChain。只需运行以下命令:
  1. pip install langchain
  2. 环境设置
  3. 现在,由于 LangChain 经常需要与模型提供者、数据存储、API 等集成,我们将设置我们的环境。在这个例子中,我们将使用 OpenAI 的 API,因此我们需要安装他们的 SDK:
  4. pip install openai
  5. 接下来,让我们在终端中设置环境变量:
  6. export OPENAI_API_KEY = "..."
  7. 或者,如果您更喜欢在 Jupyter notebook 或 Python 脚本中工作,您可以像这样设置环境变量:
  8. import os
  9. os .environ[ "OPENAI_API_KEY" ] = "..."
复制代码
构建语言模型应用程序:LLM
  1.     # 导入LLM包装器。
  2.     from langchain.llms import OpenAI
  3.     # 初始化包装器,temperature越高结果越随机
  4.     llm = OpenAI(temperature=0.9)
  5.     # 进行调用
  6.     text = "What would be a good company name for a company that makes colorful socks?"
  7.     print(llm(text))
  8.     #生成结果,结果是随机的 例如: Glee Socks. Rainbow Cozy SocksKaleidoscope Socks.
复制代码
Prompt Templates: 管理LLMs的Prompts

一般来说我们不会直接把输入给模型,而是将输入和一些别的句子连在一起,形成prompts之后给模型。
例如之前根据产品取名的用例,在实际服务中我们可能只想输入"socks",那么"What would be a good company name for a company that makes"就是我们的template。
  1.     from langchain.prompts import PromptTemplate
  2.     prompt = PromptTemplate(
  3.         input_variables=["product"],
  4.         template="What is a good name for a company that makes {product}?",
  5.     )
  6.     print(prompt.format(product="colorful socks"))
  7.     # 输出结果 What is a good name for a company that makes colorful socks?
复制代码
构建语言模型应用程序:Chat Model

还可以使用聊天模型。这些是语言模型的变体,它们在底层使用语言模型但具有不同的界面。聊天模型使用聊天消息作为输入和输出,而不是“文本输入、文本输出”API。聊天模型 API 的使用还比较新,所以大家都还在寻找最佳抽象使用方式。
要完成聊天,您需要将一条或多条消息传递给聊天模型。LangChain 目前支持 AIMessage、HumanMessage、SystemMessage 和 ChatMessage 类型。您将主要使用 HumanMessage、AIMessage 和 SystemMessage。
  1. from langchain.chat_models import ChatOpenAI
  2. from langchain.schema import (
  3.     AIMessage,
  4.     HumanMessage,
  5.     SystemMessage
  6. )
  7. chat = ChatOpenAI(temperature=0)
  8. chat([HumanMessage(content="Translate this sentence from English to French. I love programming.")])
  9. #输出结果 AIMessage(content="J'aime programmer.", additional_kwargs={})
复制代码
使用 generate 为多组消息生成完成。这将返回一个带有附加消息参数的 LLMResult:
  1. from langchain.chat_models import ChatOpenAI
  2. from langchain.schema import (
  3.     AIMessage,
  4.     HumanMessage,
  5.     SystemMessage
  6. )
  7. batch_messages = [
  8.     [
  9.         SystemMessage(content="You are a helpful assistant that translates English to Chinese."),
  10.         HumanMessage(content="Translate this sentence from English to Chinese. I love programming.")
  11.     ],
  12.     [
  13.         SystemMessage(content="You are a helpful assistant that translates English to Chinese."),
  14.         HumanMessage(content="Translate this sentence from English to Chinese. I love artificial intelligence.")
  15.     ],
  16. ]
  17. result = chat.generate(batch_messages)
  18. print(result)
复制代码
(, 下载次数: 0)

  1. result.llm_output['token_usage']
复制代码
(, 下载次数: 0)

对于聊天模型,您还可以通过使用 MessagePromptTemplate 来使用模板。您可以从一个或多个 MessagePromptTemplates 创建 ChatPromptTemplate。ChatPromptTemplate 的方法format_prompt返回一个 PromptValue,您可以将其转换为字符串或 Message 对象,具体取决于您是否要使用格式化值作为 LLM 或聊天模型的输入。
  1. from langchain.chat_models import ChatOpenAI
  2. from langchain.prompts.chat import (
  3.     ChatPromptTemplate,
  4.     SystemMessagePromptTemplate,
  5.     HumanMessagePromptTemplate,
  6. )
  7. chat = ChatOpenAI(temperature=0)
  8. template="You are a helpful assistant that translates {input_language} to {output_language}."
  9. system_message_prompt = SystemMessagePromptTemplate.from_template(template)
  10. human_template="{text}"
  11. human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
  12. chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
  13. # get a chat completion from the formatted messages
  14. chat(chat_prompt.format_prompt(input_language="English", output_language="Chinese", text="I love programming.").to_messages())
  15. # -> AIMessage(content="我喜欢编程。(Wǒ xǐhuān biānchéng.)", additional_kwargs={})
复制代码
探索将内存与使用聊天模型初始化的链和代理一起使用。这与 Memory for LLMs 的主要区别在于我们可以将以前的消息保留为它们自己唯一的内存对象,而不是将它们压缩成一个字符串。
  1. from langchain.prompts import (
  2.     ChatPromptTemplate,
  3.     MessagesPlaceholder,
  4.     SystemMessagePromptTemplate,
  5.     HumanMessagePromptTemplate
  6. )
  7. from langchain.chains import ConversationChain
  8. from langchain.chat_models import ChatOpenAI
  9. from langchain.memory import ConversationBufferMemory
  10. prompt = ChatPromptTemplate.from_messages([
  11.     SystemMessagePromptTemplate.from_template("The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know."),
  12.     MessagesPlaceholder(variable_name="history"),
  13.     HumanMessagePromptTemplate.from_template("{input}")
  14. ])
  15. llm = ChatOpenAI(temperature=0)
  16. memory = ConversationBufferMemory(return_messages=True)
  17. conversation = ConversationChain(memory=memory, prompt=prompt, llm=llm)
  18. conversation.predict(input="Hi there!")
  19. # -> 'Hello! How can I assist you today?'
  20. conversation.predict(input="I'm doing well! Just having a conversation with an AI.")
  21. # -> "That sounds like fun! I'm happy to chat with you. Is there anything specific you'd like to talk about?"
  22. conversation.predict(input="Tell me about yourself.")
复制代码
(, 下载次数: 0)


完整代码
  1. import os
  2. os .environ[ "OPENAI_API_KEY" ] = ""
  3. from langchain.chat_models import ChatOpenAI
  4. from langchain.schema import (
  5.     AIMessage,
  6.     HumanMessage,
  7.     SystemMessage
  8. )
  9. chat = ChatOpenAI(temperature=0)
  10. batch_messages = [
  11.     [
  12.         SystemMessage(content="You are a helpful assistant that translates English to Chinese."),
  13.         HumanMessage(content="Translate this sentence from English to Chinese. I love programming.")
  14.     ],
  15.     [
  16.         SystemMessage(content="You are a helpful assistant that translates English to Chinese."),
  17.         HumanMessage(content="Translate this sentence from English to Chinese. I love artificial intelligence.")
  18.     ],
  19. ]
  20. result = chat.generate(batch_messages)
  21. print(result)
  22. print(result.llm_output['token_usage'])
  23. print("********************************************************************")
  24. from langchain.chat_models import ChatOpenAI
  25. from langchain.chat_models import ChatOpenAI
  26. from langchain import LLMChain
  27. from langchain.prompts.chat import (
  28.     ChatPromptTemplate,
  29.     SystemMessagePromptTemplate,
  30.     HumanMessagePromptTemplate,
  31. )
  32. chat = ChatOpenAI(temperature=0)
  33. template="You are a helpful assistant that translates {input_language} to {output_language}."
  34. system_message_prompt = SystemMessagePromptTemplate.from_template(template)
  35. human_template="{text}"
  36. human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
  37. chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
  38. chain = LLMChain(llm=chat, prompt=chat_prompt)
  39. print(chain.run(input_language="English", output_language="Chinese", text="I love programming."))
  40. print("********************************************************************")
  41. from langchain.prompts import (
  42.     ChatPromptTemplate,
  43.     MessagesPlaceholder,
  44.     SystemMessagePromptTemplate,
  45.     HumanMessagePromptTemplate
  46. )
  47. from langchain.chains import ConversationChain
  48. from langchain.chat_models import ChatOpenAI
  49. from langchain.memory import ConversationBufferMemory
  50. prompt = ChatPromptTemplate.from_messages([
  51.     SystemMessagePromptTemplate.from_template("The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know."),
  52.     MessagesPlaceholder(variable_name="history"),
  53.     HumanMessagePromptTemplate.from_template("{input}")
  54. ])
  55. llm = ChatOpenAI(temperature=0)
  56. memory = ConversationBufferMemory(return_messages=True)
  57. conversation = ConversationChain(memory=memory, prompt=prompt, llm=llm)
  58. conversation.predict(input="Hi there!")
  59. # -> 'Hello! How can I assist you today?'
  60. conversation.predict(input="I'm doing well! Just having a conversation with an AI.")
  61. # -> "That sounds like fun! I'm happy to chat with you. Is there anything specific you'd like to talk about?"
  62. print(conversation.predict(input="Tell me about yourself."))
复制代码
(, 下载次数: 0)

  1. print("aaaaaaaa")
  2. print(sum(range(0,101)))
  3. # # 导入LLM包装器。
  4. from langchain.llms import OpenAI
  5. # 初始化包装器,temperature越高结果越随机
  6. import os
  7. from langchain.prompts import PromptTemplate
  8. import openai
  9. from langchain.prompts import PromptTemplate
  10. from langchain.llms import OpenAI
  11. #你申请的openai的api key
  12. os .environ[ "OPENAI_API_KEY" ] = ""
  13. llm = OpenAI(temperature=0.9)
  14. # 进行调用
  15. text = "What would be a good company name for a company that makes colorful socks?"
  16. print(llm(text))
  17. prompt = PromptTemplate(
  18.     input_variables=["product"],
  19.     template="What is a good name for a company that makes {product}?",
  20. )
  21. print(prompt.format(product="colorful socks"))
  22. llm = OpenAI(temperature=0.9)
  23. prompt = PromptTemplate(
  24.     input_variables=["product"],
  25.     template="What is a good name for a company that makes {product}?",
  26. )
  27. from langchain.chains import LLMChain
  28. chain = LLMChain(llm=llm, prompt=prompt)
  29. chain.run("colorful socks")
  30. def completion(prompt):
  31.     completions = openai.Completion.create(
  32.     engine="text-davinci-003",
  33.     prompt=prompt,
  34.     max_tokens=1024,
  35.     n=1,
  36.     stop=None,
  37.     temperature=0.8,
  38.     )
  39.     message = completions.choices[0].text
  40.     return message
  41. print(completion("中关村科金是一家怎样的公司?"))
复制代码
(, 下载次数: 0)

(, 下载次数: 0)


信息抽取

根据输入的内容抽取关键信息
  1. from langchain.prompts import PromptTemplate
  2. from langchain.llms import OpenAIChat
  3. from langchain.chains import LLMChain
  4. import os
  5. import openai
  6. # #你申请的openai的api key
  7. os.environ['OPENAI_API_KEY'] = ''
  8. text="北京市(Beijing),简称“京”,古称燕京、北平,是中华人民共和国首都、直辖市、国家中心城市、超大城市,国务院批复确定的中国政治中心、文化中心、国际交往中心、科技创新中心, \
  9.     中国历史文化名城和古都之一。 截至2020年,北京市下辖16个区,总面积16410.54平方千米。  2022年末,北京市常住人口2184.3万人。 \
  10. 北京市地处中国北部、华北平原北部,东与天津市毗连,其余均与河北省相邻,中心位于东经116°20′、北纬39°56′,是世界著名古都和现代化国际城市, \
  11.     也是中国中央委员会、中华人民共和国中央人民政府和中华人民共和国全国人民代表大会常务委员会所在地。\
  12. 北京市地势西北高、东南低。西部、北部和东北部三面环山,东南部是一片缓缓向渤海倾斜的平原。境内流经的主要河流有:永定河、潮白河、北运河、拒马河等,\
  13. 北京市的气候为暖温带半湿润半干旱季风气候,夏季高温多雨,冬季寒冷干燥,春、秋短促。北京被世界城市研究机构GaWC评为世界一线城市,  \
  14. 联合国报告指出北京市人类发展指数居中国城市第二位。 [4] 北京市成功举办夏奥会与冬奥会,成为全世界第一个“双奥之城”。 \
  15. 2022年,北京市实现地区生产总值41610.9亿元,按不变价格计算,比上年增长0.7%。其中,第一产业增加值111.5亿元,下降1.6%;第二产业增加值6605.1亿元,下降11.4%;第三产业增加值34894.3亿元,增长3.4%。"
  16. #加载openai的llm
  17. llm = OpenAIChat(model_name="gpt-3.5-turbo")
  18. #创建模板
  19. fact_extraction_prompt = PromptTemplate(
  20.     input_variables=["text_input"],
  21.     template="从下面的本文中提取关键事实。尽量使用文本中的统计数据来说明事实:\n\n {text_input}"
  22. )
  23. #定义chain
  24. fact_extraction_chain = LLMChain(llm=llm, prompt=fact_extraction_prompt)
  25. facts = fact_extraction_chain.run(text)
  26. print(facts)
复制代码
输出结果:

(, 下载次数: 0)


文档问答
  1. import os
  2. from langchain.embeddings.openai import OpenAIEmbeddings
  3. from langchain.vectorstores import Chroma
  4. from langchain.text_splitter import TokenTextSplitter
  5. from langchain.llms import OpenAI
  6. from langchain.chains import ChatVectorDBChain
  7. from langchain.document_loaders import DirectoryLoader
  8. import jieba as jb
  9. import openai
  10. files=['xxx.txt','xxx.txt']
  11. import time
  12. start_time = time.time()  
  13. for file in files:
  14.     #读取data文件夹中的中文文档
  15.     my_file=f"./data/{file}"
  16.     with open(my_file,"r",encoding='utf-8') as f:  
  17.         data = f.read()
  18.    
  19.     #对中文文档进行分词处理
  20.     cut_data = " ".join([w for w in list(jb.cut(data))])
  21.     #分词处理后的文档保存到data文件夹中的cut子文件夹中
  22.     cut_file=f"./data/cut/cut_{file}"
  23.     with open(cut_file, 'w') as f:   
  24.         f.write(cut_data)
  25.         f.close()
  26.         
  27. #加载文档
  28. loader = DirectoryLoader('./data/cut',glob='**/*.txt')
  29. docs = loader.load()
  30. #文档切块
  31. text_splitter = TokenTextSplitter(chunk_size=1000, chunk_overlap=0)
  32. doc_texts = text_splitter.split_documents(docs)
  33. #调用openai Embeddings
  34. a=os.environ["OPENAI_API_KEY"] = ""
  35. embeddings = OpenAIEmbeddings(openai_api_key=a)
  36. #向量化
  37. vectordb = Chroma.from_documents(doc_texts, embeddings, persist_directory="./data/cut")
  38. vectordb.persist()
  39. #创建聊天机器人对象chain
  40. chain = ChatVectorDBChain.from_llm(OpenAI(temperature=0, model_name="gpt-3.5-turbo"), vectordb, return_source_documents=True)
  41. def get_answer(question):
  42.   chat_history = []
  43.   result = chain({"question": question, "chat_history": chat_history})
  44.   return result["answer"]
  45. question = "xxxxxxxxxxx"
  46. print(get_answer(question))
  47. end_time = time.time()    # 程序结束时间
  48. run_time = end_time - start_time    # 程序的运行时间,单位为秒
  49. print(run_time)
复制代码
如果问题及答案在文档中会返回正确的结果,如果不在文本中,则会返回错误信息
可能出现的问题
  1. UnicodeEncodeError: 'gbk' codec can't encode character '\u0643' in position 58: illegal multibyte sequence
复制代码
如果是vscode编辑器可能是电脑设置的问题,解决方法win+i > 时间和语言 > 时间 日期 区域格式设置 >其他时间 日期 区域格式设置>区域更改日期,时间或数字格式> 管理>更改系统区域设置

(, 下载次数: 0)

(, 下载次数: 0)

Beta打钩能解决这个问题,这个是针对txt文本(其他文档没试过),出现问题不一定是代码的问题,这个打钩可能会影响电脑其他应用乱码(大部分应用不会)
搜索问答(待更新)

可能出现的问题:
  1. ImportError: cannot import name 'load_tools' from 'langchain.agents'
  2. 我用的是python3.7,然后将python版本升级到了3.9就解决了。
复制代码
如何系统的去学习大模型LLM ?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。
事实上,抢你饭碗的不是AI,而是会利用AI的人。
继科大讯飞、阿里、华为等巨头公司发布AI产品后,很多中小企业也陆续进场!超高年薪,挖掘AI大模型人才! 如今大厂老板们,也更倾向于会AI的人,普通程序员,还有应对的机会吗?
与其焦虑……

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!
但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高。
基于此,我用做产品的心态来打磨这份大模型教程,深挖痛点并持续修改了近70次后,终于把整个AI大模型的学习门槛,降到了最低!
在这个版本当中:

第一您不需要具备任何算法和数学的基础
第二不要求准备高配置的电脑
第三不必懂Python等任何编程语言
您只需要听我讲,跟着我做即可,为了让学习的道路变得更简单,这份大模型教程已经给大家整理并打包,现在将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等,




欢迎光临 AI创想 (https://www.llms-ai.com/) Powered by Discuz! X3.4