简单之美LangChain框架介绍及入门指南

LangChain是一个用来开发大型语言模型(LLM)应用的框架,为了简化构建基于LLM的应用,它能够为开发LLM应用带来如下能力:

LangChain是什么

LangChainLibraries是一个Python和JavaScript库,是LangChain中最核心的部分,在图中对应于下方的深色块。LangChainLibraries被分为3个核心的部分,也是代码组织方式的表现:LangChain、LangChain-Community、LangChain-Core,简要介绍如下:

包含LangChain的基本抽象和LCEL(LangChainExpressionLanguage)。

提供了一组用于简化部署的参考架构,方便构建基于LLM应用的中的各种任务。

提供了用来将LangChain部署为RESTAPI服务的工具,以供应用的其他模块调用。LangChain使用了FastAPI来实现这种服务能力。

LangSmith是LangChain提供的开发平台,方便开发人员进行调试、测试、评估、监控等。

LangChain模块(Modules)概览

LangChain提供了一个标准的可扩展的接口,可以方便地与外部其他组件进行交互以满足面向特定领域LLM应用的需求,它也能够与外部其它组件/中间件连接和交互。这些模块根据功能及行为方式,分为6个类别,如下表所示:

通过上面表格,我们基本了解了LangChain提供的一些方便构建LLM应用的模块及其对应的功能,下面,针对每个模块进行更详细的说明。

LangChain模块:ModelI/O

使用Ollama在本地就可以启动一个模型服务,然后我们就可以使用LangChain创建对应的LLM和ChatModel,示例代码如下:

使用LangChain与LLM进行对话,示例代码如下:

fromlangchain.schemaimportHumanMessagetext="Whatwouldbeagoodcompanynameforacompanythatmakescolorfulsocks"messages=[HumanMessage(content=text)]llm.invoke(text)#>>FeetfulofFunchat_model.invoke(messages)#>>AIMessage(content="SocksO'Color")PromptTemplate包含了我们要查询LLM的请求内容,以及我们所基于的上下文,这样就限制了预训练的LLM能够基于我们提供的上下文来给出更准确的回答。示例代码如下:

LangChain提供了不同类型的OutputParser,能够将LLM输出的消息进行格式化,方便下游应用任务使用。比如,下面示例中使用CommaSeparatedListOutputParser,将消息按照逗号分割,并返回一个列表:

fromlangchain.output_parsersimportCommaSeparatedListOutputParseroutput_parser=CommaSeparatedListOutputParser()output_parser.parse("hi,bye")#>>['hi','bye']使用LCEL将上面的PromptTemplate、ChatModel、OutputParser组合到一起,并实现了与LLM的交互,示例代码如下:

template="Generatealistof5{text}.\n\n{format_instructions}"chat_prompt=ChatPromptTemplate.from_template(template)chat_prompt=chat_prompt.partial(format_instructions=output_parser.get_format_instructions())chain=chat_prompt|chat_model|output_parserchain.invoke({"text":"colors"})#>>['red','blue','green','yellow','orange']LangChain模块:Retrieval

VectorStore也叫VectorDB,用来存储我们自己数据的向量表示内容(Embedding),以支持Retrieval模块的检索匹配。

Retriever称为检索器,从我们构建好的VectorStore中进行检索。LangChain提供了各种支持检索的算法,比如:ParentDocumentRetriever、SelfQueryRetriever、EnsembleRetriever、MultiVectorRetriever,等等。下面以SelfQueryRetriever为例说明使用方法,示例代码如下所示:

LangChain模块:Agents

Agent通过LLM来推理,能够自然地、持续多轮地与LLM交互,这也是智能体所具备与支持的基本能力。为了说明Agent框架的使用方法,使用Tavily和Retriever两个工具来构建Agent,其中Tavily是一个支持Online搜索的工具。

agent_executor.invoke({"input":"hi!"})这样的交互不会记忆上下文,是无状态的。所以,如果考虑上下文,需要把以往的记录加入到Memory,示例代码如下:

fromlangchain_core.messagesimportAIMessage,HumanMessageagent_executor.invoke({"chat_history":[HumanMessage(content="hi!mynameisbob"),AIMessage(content="HelloBob!HowcanIassistyoutoday"),],"input":"what'smyname",})也可以直接使用LangChain提供的ChatMessageHistory、RunnableWithMessageHistory来实现自动跟踪历史消息的功能,可以参考LangChain文档。

LangChain模块:Chains

Chains是一个调用/处理/计算任务序列的抽象,可以根据我们自己的需求来构建不同的调用链、处理链,等等。Chains是通过LangChain提供的LCEL来构建的。下面是LainChain提供的一些LCELConstructor,可以方便构建一个Chain,如下所示:

通过名称,就可以大致了解每个LCELConstructor实现的Chain的功能。

LangChain模块:Memory

fromlangchain_openaiimportOpenAIfromlangchain.promptsimportPromptTemplatefromlangchain.chainsimportLLMChainfromlangchain.memoryimportConversationBufferMemoryllm=OpenAI(temperature=0)prompt=PromptTemplate.from_template(template)memory=ConversationBufferMemory(memory_key="chat_history")#needtoalignthe`memory_key`conversation=LLMChain(llm=llm,prompt=prompt,verbose=True,memory=memory)当然也可以直接使用ChatModel来实现整个对话过程,具体例子可以参考LangChain官网文档。Memory模块提供了多个不同的实现,具体也可以根据自己实际应用需求来实现,如下所示是LangChain提供的一些实现:

具体功能和使用方法,可以点击对应链接查看官网文档的详细说明。

LangChain模块:Callbacks

LangChain支持使用Callbacks,通过Hook到基于LLM的应用的任何位置,来实现类似日志记录、监控、Streaming处理以及其它任务等等。要想实现自定义的Callback能力,可以直接实现CallbackHandler接口,开发满足自己应用需求的CallbackHandler。LangChain实现的StdOutCallbackHandler是一个非常基础的Callback,使用示例如下:

fromlangchain.callbacksimportStdOutCallbackHandlerfromlangchain.chainsimportLLMChainfromlangchain_openaiimportOpenAIfromlangchain.promptsimportPromptTemplatehandler=StdOutCallbackHandler()llm=OpenAI()prompt=PromptTemplate.from_template("1+{number}=")chain=LLMChain(llm=llm,prompt=prompt,callbacks=[handler])#Constructorcallbackchain.invoke({"number":2})chain=LLMChain(llm=llm,prompt=prompt,verbose=True)#Useverboseflagtoachievecallbackschain.invoke({"number":2})chain=LLMChain(llm=llm,prompt=prompt)#Requestcallbackschain.invoke({"number":2},{"callbacks":[handler]})LCEL(LangChainExpressionLanguage)

下面通过一个实现prompt+model+outputparser的例子,用来说明使用LCEL带来的直观性和便利性,示例代码如下:

LangServe工具介绍

LangServe提供了将LangChain的runnables和chains部署为RESTAPI的能力,它是使用FastAPI来实现的。使用LangServe部署基于LLM的应用,会包含两个部分:Server(提供LLMChatModel服务)、Client(调用模型服务)。下面通过一个例子来说明如何构建。

Server包括OpenAIChatModel和AnthropicChatModel,它们可以提供对话服务能力,示例代码如下:

#!/usr/bin/envpythonfromfastapiimportFastAPIfromlangchain.promptsimportChatPromptTemplatefromlangchain.chat_modelsimportChatAnthropic,ChatOpenAIfromlangserveimportadd_routesimportuvicornapp=FastAPI(title="LangChainServer",version="1.0",description="AsimpleapiserverusingLangchain'sRunnableinterfaces",)add_routes(app,ChatOpenAI(),path="/openai",)add_routes(app,ChatAnthropic(),path="/anthropic",)model=ChatAnthropic()prompt=ChatPromptTemplate.from_template("tellmeajokeabout{topic}")add_routes(app,prompt|model,path="/joke",)if__name__=="__main__":uvicorn.run(app,host="localhost",port=8000)如果没有报错,打开浏览器浏览localhost:8080/docs可以看到对应的页面,说明Server端部署成功。

Client端用来与Server端进行交互:调用Server端提供的RESTAPI就可以实现。Client端示例的Python代码如下:

LangSmith工具介绍

LangGraph介绍

LangGraph是一个用来构建有状态的、多Actor的LLM应用的库,它是在LangChain框架的基础之上构建实现的。LangGraph的灵感来自Pregel和ApacheBeam,支持基于LCEL的能力构建一个带有循环的(Cyclic)的应用模式,从而实现协调多个Chain跨多个计算步骤(ComputationSteps)的能力。可见,LangGraph是支持带环的计算图模式的,并不是简单的DAG(有向无环图)。下面以官网的入门例子为例,说明如何使用LangGraph,如下所示:

fromlangchain_community.tools.tavily_searchimportTavilySearchResultstools=[TavilySearchResults(max_results=1)]fromlanggraph.prebuiltimportToolExecutortool_executor=ToolExecutor(tools)#wrapTavilytoolusingLangGraphToolExecutorfromlangchain_openaiimportChatOpenAI#Wewillsetstreaming=Truesothatwecanstreamtokensmodel=ChatOpenAI(temperature=0,streaming=True)fromlangchain.tools.renderimportformat_tool_to_openai_functionfunctions=[format_tool_to_openai_function(t)fortintools]model=model.bind_functions(functions)#Bindtoolstothemodellanggraph提供的图主要是指StatefulGraph,它可以被一个状态对象参数化(Parameterized)。状态对象在图中的每个节点之间传递,每一个节点会返回更新状态对象的操作,从而实现状态的更新。这里的状态会跟踪对话过程中产生的消息的列表,构建的图中的每个节点需要把消息添加到列表中,所以使用TypedDict来实现Agent状态,如下所示:

fromtypingimportTypedDict,Annotated,Sequenceimportoperatorfromlangchain_core.messagesimportBaseMessageclassAgentState(TypedDict):messages:Annotated[Sequence[BaseMessage],operator.add]在langgraph中,图节点是一个function对象或runnable对象;然后通过边来连接各个节点,在langgraph中有两种类型的边:ConditionalEdge和NormalEdge,可以通过定义函数来实现,确定从一个节点到另一个节点的路径。示例代码如下:

fromlanggraph.graphimportStateGraph,ENDworkflow=StateGraph(AgentState)#Definethetwonodeswewillcyclebetweenworkflow.add_node("agent",call_model)workflow.add_node("action",call_tool)workflow.set_entry_point("agent")#Settheentrypointas`agent`#Addaconditionaledgeworkflow.add_conditional_edges("agent",#First,wedefinethestartnode.Weuse`agent`.should_continue,#Next,thefunctionwilldeterminewhichnodeiscallednext.#Finallywepassinamapping,andbasedonwhichoneitmatches,thatnodewillthenbecalled.{"continue":"action",#If`tools`,thenwecallthetoolnode."end":END#Otherwisewefinish.})#Addanormaledgefrom`tools`to`agent`:after`tools`iscalled,`agent`nodeiscallednext.workflow.add_edge('action','agent')app=workflow.compile()##CompilesitintoaLangChainRunnable,fromlangchain_core.messagesimportHumanMessageinputs={"messages":[HumanMessage(content="whatistheweatherinsf")]}app.invoke(inputs)通过上面1~6步骤,就可以构建并执行一个基于LangGraph的简单LLM应用。

THE END
1.Lib最新,探索现代技术中的新领域新能源科技1、提高开发效率:通过使用最新的Lib,开发者可以快速地实现复杂的功能,提高开发效率,使用数据处理库,开发者可以轻松地处理大数据;使用机器学习库,开发者可以快速地实现人工智能功能。 2、优化性能:最新的Lib往往具有更好的性能优化,通过使用这些库,开发者可以优化应用程序的性能,提高用户体验,使用图形库可以优化图形的渲染http://hnxhmxny.com/post/176.html
2.嵌入式开发的魔法工具箱揭秘创意项目的关键软件综上所述,在嵌入式开发中,我们需要考虑众多细节,从基础环境搭建到高级功能整合,每一步都影响着最终产品质量。一旦掌握这些关键技能,我们将拥有无限可能去创造前沿科技产品,无论是在物联网(IoT)领域还是汽车电子行业,都充满了挑战,但同时也带来了巨大的市场需求增长机会。不久前,一些公司已经开始采用AI技术来辅助他们https://www.csjrjkivd.cn/cai-dian/521098.html
3.开源项目fossphotolibraries常见问题解决方案foss_photo_libraries是一个专注于免费和开源照片库的项目,旨在跟踪和比较不同开源照片库的功能集。该项目特别关注“Gratis”(免费使用)和“Libre”(自由软件)的开源照片库。通过这个项目,用户可以了解各个开源照片库的功能、优缺点以及适用场景。 该项目的主要编程语言包括: https://blog.csdn.net/gitblog_00473/article/details/144418185
4.管理库MicrosoftLearnLIB 默认模式用于生成或修改 COFF 对象库。当没有指定 /EXTRACT(将对象复制到文件中)和 /DEF(生成导入库)选项时,LIB 在此模式下运行。若要从对象和/或库生成库,请使用下列语法:复制 LIB [options] files 此命令从一个或多个输入 files 创建库。此 files 可以是 COFF 对象文件、32 位 OMF 对象https://learn.microsoft.com/zh-cn/previous-versions/visualstudio/visual-studio-2012/e17b885t(v=vs.110)
5.功能焕新!Baklib助力内部通信更灵活可控功能更新:内部通信控制和灵活性的新选项 灵活性和控制力在内部沟通中至关重要。因此,我们最新的产品更新都致力于为用户和管理员提供灵活性和控制力。激发员工敬业度 我们 Baklib 非常热爱音乐,所以我想先讲一个关于尝试创作美妙音乐的故事。想象一下,你负责一个管弦乐队,你指示你的音乐家开始创作音乐。一组音乐https://baijiahao.baidu.com/s?id=1818055803741486378&wfr=spider&for=pc
6.SketchLibraries功能图文详解Mac教程Libraries功能适合我吗? 无论是独自工作,还是团队协作,Libraries功能都能帮你从容应对。 我们提供了“iOS UI Design”作为默认Library,你可以通过“Insert”菜单将常用的Symbols快速添加到文件当中,也可以将自己的Sketch文件添加到Libraries当中,或是打造全新的Library;无论怎样,你都能够在所有的Sketch文件当中统一调用这些https://mac.wmzhe.com/article/10085.html
7.Vitis中的Libraries新功能Vitis 2023.2是Vitis开发工具变化较大的一个版本,设计流程和界面发生了变化。今天介绍一下Vitis New IDE的一个新功能。在过去,Vitis使用Vitis Libraries中的库进行开发的时候,会存在移植困难,IDE支持有限的问题,导致用户处于一个尴尬的境地。针对这一问题,Vitis New IDE做了哪些变化呢? https://www.eet-china.com/mp/a317896.html
8.夜雨玩转Sketch番外篇4:Sketch47正式版发布,Libraries等新功能来袭2017年10月10日,Sketch正式发布V47版本,带来了新功能Libraries,以及针对iPhone X和iPhone 8的支持,一起来看看更新了哪些内容吧。 1.重要更新-Libraries(图书馆) Sketch正式版本带来了重磅更新Libraries(图书馆),它可以理解为团队协作版本的“Symbol”,它具备了symbol的所有特性,而且支持设计团队成员之间的共享和协作。https://www.jianshu.com/p/a0d6507af608
9.AdobeIllustratorv21.0(AiCC2017)Win/Mac中文多语言版本CG【新 Creative Cloud Libraries 功能】 Illustrator 中的 Libraries 现在支援文字及 Adobe Stock 范本。此外,「传送连结」也已经更新,您现在可以分享公开资料库的唯读存取权。当您关注某个资料库时,这个资料库就会出现在您的资料库面板并自动更新。 https://www.cgown.com/mac/mac-software/23064.html
10.AdobePhotoshopCC2020中文破解版(免破解)2、新Creative Cloud Libraries功能 Photoshop 中的 Libraries 现在支持 Adobe Stock 样本。此外,「传送连结」也已经更新,您可以分享公开数据库的只读存取权。当您关注某个数据库时,这个数据库就会出现在您的数据库面板并自动更新。 3、应用程序内搜寻 使用可供随手取用的新搜寻面板,在应用程序中快速搜寻 Photoshop 工https://www.adaigou.net/image/11011.html
11.你所期待的AdobePhotoShop2020来了!腾讯云开发者社区2、新Creative Cloud Libraries功能 Photoshop 中的 Libraries 现在支持 Adobe Stock 样本。此外,「传送连结」也已经更新,您可以分享公开数据库的只读存取权。当您关注某个数据库时,这个数据库就会出现在您的数据库面板并自动更新。 3、应用程序内搜寻 使用可供随手取用的新搜寻面板,在应用程序中快速搜寻 Photoshop 工https://cloud.tencent.com/developer/news/461347
12.AdobePremierePro2020forMac(pr2020直装版)协作增强功能、团队邀请团队项目 您现在可以使用从组织目录同步的组(对于企业用户)邀请协作者加入您的团队项目。您还可以邀请其他人通过邀请组而不是键入单个电子邮件地址来协作您的团队项目。邀请协作者加入您的团队项目。 Creative Cloud Libraries增强功能 https://blog.itpub.net/69956340/viewspace-2699977/
13.moost—Last.fm'scollectionofC++utilitylibraries(功能libmoostis a collection of C++ utility libraries, including: algorithms (set intersection, hashing, variable length encoding, ) abstractions for compiler specific features configuration container data structures (e.g. LRU cache, memory mapped files) https://www.cnblogs.com/findumars/p/7629811.html
14.Blender3.0震撼来袭!开启内容创作新纪元可将文件夹定位为Asset Libraries(资产库),随时随地载入你喜欢的资产。 Catalogs(分类) 利用分类功能管理资产,此功能独立于储存.blend格式文件的文件夹,灵活性更高。 Tags(标签) 可以在资产中添加作者、标签、资产描述等特殊的元数据。 摆个Pose 利用新的资产浏览器,Blender中的pose库得到大幅更新。 https://www.renderbus.com/news/post-id-1207/
15.建模小白也能拥有3D模型的神器网站!有氧周末不过这个功能是收费的,买断制:$30。?前全站只有这?个地?收费,毕竟?佬也要恰饭对吧,能理解能理解。这个功能详细情况在?站详情有完整的体现,?家可以根据需要去 氪?。接下来要开始重头戏了。 下载方式 除了上?过的 Sketch Libraries,?前其他的所有素材均为免费。既然上?提https://www.shangyexinzhi.com/article/4938611.html
16.提供多樣的Libraries,創造最大的功能性價比cpcStudio多元除此之外,也有其他針對特殊功能延伸的功能方塊圖,並且擁有 Libraries 搜尋引擎進行整個資料庫的管理,在使用上得到事半功倍的效果;在搭配自家機器手臂的應用中,整合一般 PLC 與手臂控制功能,讓 PLC 可以直接透過功能方塊圖進行系統與手臂控制。cpcStudio 多元的乙太網路科技,支援擴充整個自動化網絡通訊http://www.chieftek.com/chinese/product-cpcStudio.asp
17.AltiumDesigner18系统参数选项介绍及常规设置Installed Libraries(安装库) 保持默认,进行原理图库和PCB库的安装,在AD主页面右下角也可以进行选择安装 Device Sheets(器件页面符文件夹) 保持默认,多页原理图时使用 SVN Libraries(SVN版本库) 保持默认 Parts Providers(Altium 器件选项) 保持默认,各个国家的一些器件规则等 https://www.360doc.cn/article/13328254_791442401.html
18.vulkanruntimelibraries能卸载吗vulkanruntimelibraries能卸载,但是不建议进行卸载。因为它能够提高GPU与多核CPU的处理性能,特别是在高画质需求的游戏中。 早在2016年Dota 2便推出官方补丁使其支持Vulkan。如下图第一张所示为原版Dota 2的游戏场景图,第二张图所示为在Vulkan支持下运行的Dota 2游戏场景图。通过两图的对比可以看出,在游戏画面方面,https://wenda.so.com/q/1629018063210723
19.CCLibrariesAdobeCreativeCloud共享CC Libraries (4:14) 描述更高效地工作,确保创意一致性,并轻松地与您的团队保持同步。 在本教程中,您将了解如何: 让您的资源触手可及,项目符合品牌形象 直接从您喜爱的应用程序轻松协作处理项目演示者:Ashley Dvorin,高级解决方案顾问(数字媒体) CC Libraries资源 学习和支持是您获取其他教程、新增功能以及社区https://experienceleague.adobe.com/zh-hans/docs/creative-cloud-enterprise-learn/cce-learning-hub/max/tutorials/integrations/cclibraries
20.《界面设计》复习资料37.从哪个功能可以体现出团队协作优势这一点,具体展开说明。 答:Sketch 并不仅仅满足于作为一个孤立设计师的生产力工具,而是想要打造更多设计师协同作业的可能,Sketch 47 Beta 版本中的 Libraries 功能更新透露了这一个信息。通过统一的Libraries,多名设计师可以直接调用公共组件库、像搭建积木一样搭建自己的设计稿。https://www.wjx.cn/xz/260641939.aspx
21.高阶功能高手进阶技巧!全方位深入理解sketch库(上)库则是指被添加到 「Preferences - Libraries」 面板下的那些文件,它们没有统一保存的地方。 在没有引入库功能时,设计团队使用模板文件来协作,但 Sketch 并未提供一种文档内容更新机制,只能依赖一些插件将文档通过组件名称匹配来替换成另一个文件的组件,但这对组件图层命名要求严格,也没有可视化对比。库功能解决了这https://www.uisdc.com/comprehensive-understanding-of-the-sketch-library-1
22.VulkanRuntimeLibraries是什么软件?读完这篇最后,我来说说如何看自己的电脑是否存在Vulkan Runtime Libraries,以我的64位Windows 10专业版系统(版本号20H2)为例,点击桌面左下角,选择齿轮图标“设置”,选择“应用”→“应用与功能”,再搜索框中输入“vulkan”即可搜到系统中的Vulkan Runtime Libraries。 https://zealer.com/video/1107035
23.Chrome,WebDevLibraries,andGuides我们都知道,开发者在过去为 WebView 构建时遇到过的问题:HTML5 功能有限、无调试工具、构建工具。随着 Android 4.4 (KitKat) 中引入由 Chromium 提供支持的 WebView,开发者现在可以使用大量新工具,以便使用 WebView 构建出色的原生应用。 WebView 与您用于 Chrome 的工具一样,支持完整的远程调试。您还可以使用 Grhttps://developers.google.cn/web/shows/cds/2013/build-mobile-apps-with-chrome-webview?hl=zh-cn
24.「技法」两步学会用Sketch新功能library进行symbol共享与更新Sketch 近期又要进行一次新的更新了,在新的版本中会引入一个叫做 「Libraries」 的新功能。该功能是为了解决了个人、团队在使用 Sketch 时对跨文件的 symbol 复用与更新的问题。想必现在以 Sketch 协作作为产品痛点的CRAFT、Lingo和Brand.ai要赶紧起床开会了。要说明的是,beta 版的 Sketch logo 是一颗蓝色的钻石。https://zhuanlan.zhihu.com/p/29008906
25.科学网—Citavi:参考文献与知识组织管理软件在界面B处单击右键则会弹出新建文献类别、子类别等选项。该功能与许多软件相似,此处不再赘述。 3、如何添加参考文献,如何管理参考文献 Endnote Libraries导入 如果您是Endnote用户,使用导入功能可以方便地将Endnote Libraries导入Citavi6。点击File菜单,再点击Import。 https://blog.sciencenet.cn/blog-3361982-1193729.html
26.翻译使用AFL++Frida模式进行Android灰盒模糊测试Android和native libraries 在Android系统中,有许多本机二进制文件,尤其是许多共享库。这些库可以嵌入到应用程序、框架或系统的其他低级部分中。选择的目标是专为本文目的而设计的 Android 应用程序,以便以基本方式评估模糊测试解决方案的功能、覆盖范围以及针对 Android 上常见的几种情况的不同利用策略。 目标应用程序评估https://xz.aliyun.com/t/14062
27.MicroPython函数库—MicroPython1.9.2文档Python标准库和micro-libraries下面的标准Python库已被微型化,以适应MicroPython的原理。这些库执行该模块的核心功能,并被设计作为标准Python库的替代选择。以下的某些模块使用标准的Python名,但带有“u”前缀,例如,其名称为 ujson 而不是 json。 这表示这样的一个模块是micro-library,即仅实现CPython模块功能的一个https://docs.singtown.com/micropython/zh/latest/pyboard/library/index.html
28.idealibraries为空idea里libraries是干嘛的功能方面的使用 DeBug IDEA快捷键 CTRL ALT和SHIFT CTRL+ALT CTRL+SHIFT 软件使用方面 DEA与myeclipse有何区别? 如何选择创建一个Java Web项目? 如何配置JDK和Tomacat? 软件配置 如何配置IDEA的JDK开发环境? 在为创建项目之前界面点击Configure: 如何设置自动导包? https://blog.51cto.com/u_16099234/10174846
29.WebofScience資料庫個人化功能大公楱C國立艦炒髮W圖書館本文主要介紹?Web of Science 資料庫所提供的個人化功能──註冊個人帳號、儲存檢索歷史、設定新知通報、匯出書目至EndNote Online等,協助您更便利地利用資料庫內容。使用個人化功能的第一步驟,當然是申請個人帳號。請點選畫面右上方的「Register」註冊帳號:http://tul.blog.ntu.edu.tw/archives/646
30.AcuratedlistofawesomeCA curated list of awesome C-Sharp frameworks, libraries and software. - uhub/awesome-c-sharphttps://github.com/uhub/awesome-c-sharp
31.PhysXSDKA scalable multi-platform physics simulation solution for a wide range of devices, from smartphones to CPUs and GPUs.http://developer.nvidia.com/physx-sdk