LangChain 介绍随着各种开源大模型的发布越来越多的人开始尝试接触和使用大模型。在感叹大模型带来的惊人表现的同时也发现一些问题比如没法查询到最新的信息有时候问一些数学问题时候会出现错误答案还有一些专业领域类问题甚至编造回答等等。有没有什么办法能解决这些问题呢答案就是LangChain。LangChain 是一个开源的语言模型集成框架旨在简化使用大型语言模型LLM创建应用程序的过程。利用它可以让开发者使用语言模型来实现各种复杂的任务例如文本到图像的生成、文档问答、聊天机器人、调用特定的SaaS服务等等。随着ChatGPT、midjourney等AI技术的爆火LangChain也是在短时间内得到6w的star数版本迭代也是异常的快社区十分活跃。LangChain 在没有任何收入也没有任何明显的创收计划的情况下获得了 1000 万美元的种子轮融资和 2000-2500 万美元的 A 轮融资估值达到 2 亿美元左右。上面是LangChain的核心架构图可以看到LangChain主要包含如下模块Model I/O大模型的输入输出包含提示词、任何大模型、结果解析器。Retrieval涉及到数据集相关主要包含文档提取器、文档转换器、向量数据库等。Chains允许将多个不同组件组合在一起使用形成链条式调用。Memory在大模型调用期间提供存储能力。Agents链式调用是硬编码的而代理是由大模型根据实时情况来决定如何调用工具。Callbacks大模型各个阶段的的回调系统对于日志记录、监控、流传输和其他任务非常有用。Agent大模型一般只拥有他们被训练的知识这种知识可能很快就会过时了所以在推理的时候大模型与外界是处于“断开”状态。为了克服这一限制LangChain在Yao等人在2022年11月提出的推理和行动ReAct框架上提出了“代理”(Agent)的解决方案。此方案可以获取最新的数据并将其作为上下文插入到提示中。Agent也可以用来采取行动例如运行代码修改文件等然后该行动的结果可以被LLM观察到并被纳入他们关于下一步行动的决定。运行大体流程:1用户给出一个任务(Prompt) - 2思考(Thought) - 3行动(Action) - 4观察(Observation) 然后循环执行上述2-4的流程直到大模型认为找到最终答案为止。Agent内部具体拆解使用Agent有两个必备条件相关能力工具和对这些工具的正确描述。定义工具工具的定义只需要集成BaseTool类然后在_run方法中编写你的逻辑就行大模型会把合适的参数传进来。 需要定义类变量有:name: 工具名称很重要大模型内部会使用到description工具描述很重要告知大模型在什么情况下来使用这个工具return_direct这个字段默认为false如果设置为true工具返回结果后大模型就不再循环思考了会直接将这个结果当做答案。LangChain 已经内置了duckduckgo搜索引擎pip install duckduckgo-search安装一下依赖包即可使用只是需要科学上网才能调通。下面是我定义的两个工具一个用于电影搜索一个用于数学计算:fromlangchain.toolsimportBaseTool,DuckDuckGoSearchRun# 搜索工具classSearchTool(BaseTool):nameSearchdescription当问电影相关问题时候使用这个工具return_directFalse# 直接返回结果def_run(self,query:str)-str:print(\n正在调用搜索引擎执行查询: query)searchDuckDuckGoSearchRun()returnsearch.run(query)# 计算工具classCalculatorTool(BaseTool):nameCalculatordescription如果问数学相关问题时使用这个工具return_directFalse# 直接返回结果def_run(self,query:str)-str:returneval(query)定义结果解析类每次大模型输出之后都会对结果进行解析如果找到action就会去调用。但是默认的解析类我测试的时候总报错所以我改写了一下fromtypingimportDict,Union,Any,Listfromlangchain.output_parsers.jsonimportparse_json_markdownfromlangchain.agents.conversational_chat.promptimportFORMAT_INSTRUCTIONSfromlangchain.agentsimportAgentExecutor,AgentOutputParserfromlangchain.schemaimportAgentAction,AgentFinish# 自定义解析类classCustomOutputParser(AgentOutputParser):defget_format_instructions(self)-str:returnFORMAT_INSTRUCTIONSdefparse(self,text:str)-Union[AgentAction,AgentFinish]:print(text)cleaned_outputtext.strip()# 定义匹配正则action_patternraction:\s*([^]*)action_input_patternraction_input:\s*([^]*)# 提取出匹配到的action值actionre.search(action_pattern,cleaned_output)action_inputre.search(action_input_pattern,cleaned_output)ifaction:action_valueaction.group(1)ifaction_input:action_input_valueaction_input.group(1)# 如果遇到Final Answer则判断为本次提问的最终答案了ifaction_valueandaction_input_value:ifaction_valueFinal Answer:returnAgentFinish({output:action_input_value},text)else:returnAgentAction(action_value,action_input_value,text)# 如果声明的正则未匹配到则用json格式进行匹配responseparse_json_markdown(text)action_valueresponse[action]action_input_valueresponse[action_input]ifaction_valueFinal Answer:returnAgentFinish({output:action_input_value},text)else:returnAgentAction(action_value,action_input_value,text)output_parserCustomOutputParser()初始化Agent如果你使用ChatGPT的话这里需要配置ChatGPT的api-key同时需要科学上网。也可以配置一些本地的开源大模型比如ChatGLM2-6B、Baichuan-13B等但是效果确实要比ChatGPT差很多。fromlangchain.memoryimportConversationBufferMemoryfromlangchain.agents.conversational_chat.baseimportConversationalChatAgentfromlangchain.agentsimportAgentExecutor,AgentOutputParser SYSTEM_MESSAGE_PREFIX尽可能用中文回答以下问题。您可以使用以下工具# 初始化大模型实例可以是本地部署的也可是是ChatGPT# llm ChatGLM(endpoint_urlhttp://你本地的实例地址)llmChatOpenAI(openai_api_keysk-xxx,model_namegpt-3.5-turbo,request_timeout60)# 初始化工具tools[CalculatorTool(),SearchTool()]# 初始化对话存储保存上下文memoryConversationBufferMemory(memory_keychat_history,return_messagesTrue)# 配置agentchat_agentConversationalChatAgent.from_llm_and_tools(system_messageSYSTEM_MESSAGE_PREFIX,# 指定提示词前缀llmllm,toolstools,memorymemory,verboseTrue,# 是否打印调试日志方便查看每个环节执行情况output_parseroutput_parser#)agentAgentExecutor.from_agent_and_tools(agentchat_agent,toolstools,memorymemory,verboseTrue,max_iterations3# 设置大模型循环最大次数防止无限循环)调用Agent调用就很简单了执行agent.run(prompt)即可下面是一个详细的调用日志输出日志已经完整的体现出了整个流程大模型的确每次都匹配到了正确的tool。如果还觉得日志不详细可以设置langchain.debug True这样会打印更详细日志。总结可以这么理解Agent它让大模型变成了一个决策者。用户的问题首先由它去理解和拆分它来从工具列表中找到觉得合适的工具然后将用户的提问信息转化成结构化的数据当成参数传递给工具函数。工具函数返回结果又交还给了大模型去观察分析如果它觉得不是正确答案那么继续这个循环直到得出它认为的正确答案。它就像是一个优秀的项目经理分解用户的问题可能他不擅长完成某一项任务但是他能找到合适专业的外部的人去完成子任务最后他再汇总任务结果交付给用户。后期大模型能力越来越强之后还需要高成本的训练和微调大模型吗优点框架层上来说对大模型的有更系统化的干预机制方便集成。拓展了大模型更多的能力而且是不需要经过复杂且昂贵的训练过程。不用再去写那些匹配场景的规则了大模型已经帮你做了前提是这个模型参数要够大能理解用户的意思。整个流程都有详细的记录日志方便调试。不足大模型会被多次调用响应用户的时间可能会比较久因此相应产品也就会限制在一些特定领域。虽然不用写工具匹配规则但是这也让这一块逻辑变成一个黑盒了很难去精准的匹配或者调试。对大模型本身能力要求很高如果使用低参数大模型很有可能无法识别问题并正确的分发给对应工具。当然还是有优化的方向的比如可以考虑去使用语料专门往解析action方面训练让模型能更好的解析出action。最后的最后感谢你们的阅读和喜欢我收藏了很多技术干货可以共享给喜欢我文章的朋友们如果你肯花时间沉下心去学习它们一定能帮到你。因为这个行业不同于其他行业知识体系实在是过于庞大知识更新也非常快。作为一个普通人无法全部学完所以我们在提升技术的时候首先需要明确一个目标然后制定好完整的计划同时找到好的学习方法这样才能更快的提升自己。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】大模型知识脑图为了成为更好的 AI大模型 开发者这里为大家提供了总的路线图。它的用处就在于你可以按照上面的知识点去找对应的学习资源保证自己学得较为全面。经典书籍阅读阅读AI大模型经典书籍可以帮助读者提高技术水平开拓视野掌握核心技术提高解决问题的能力同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说阅读经典书籍是非常有必要的。实战案例光学理论是没用的要学会跟着一起敲要动手实操才能将自己的所学运用到实际当中去这时候可以搞点实战案例来学习。面试资料我们学习AI大模型必然是想找到高薪的工作下面这些面试题都是总结当前最新、最热、最高频的面试题并且每道题都有详细的答案面试前刷完这套面试题资料小小offer不在话下640套AI大模型报告合集这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】