个人技术总结——在LangChain中使用国产大模型调用Tools的实践总结

222100229俞炜昆 2024-06-06 23:49:22

目录

  • 1. 技术概述
  • 2. 技术详述
  • 3. 技术使用中遇到的问题和解决过程
  • 4. 总结
  • 5. 参考文献
  • 参考博客

1. 技术概述

技术概述

LangChain 是一个用于开发由大语言模型驱动的应用程序的开源框架,提供了模块化的组件和可定制化的用例链。
简单来说,它允许开发人员将像 GPT-4 这样的大型语言模型与外部的计算和数据源结合起来。 目前,它提供了 Python 和 JavaScript(确切地说是 TypeScript )的软件包。LangChain 是一个强大的框架,旨在帮助开发人员使用语言模型构建端到端的应用程序。 它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。

tools是LLM接触外部世界的工具,比如联网、数学计算、读取文件等都是通过tools的能力。

2. 技术详述

2.1 环境配置与依赖安装

首先,需要配置开发环境并安装必要的依赖项。

pip install langchain #其他需要的库

2.2 获取和配置国产大模型的API密钥

os.environ["MOONSHOT_API_KEY"] = "**************"

2.3 创建LangChain项目

创建一个新的LangChain项目,并初始化相关文件和目录结构。

2.4 编写调用国产大模型的工具代码

编写用于调用国产大模型API的函数。

llm = MoonshotChat(streaming=True,temperature=0.3,api_key="xxxxx")

先定义两个简单的tool类

def multiply(first_int: int, second_int: int) -> int:  
    """将两个数相乘"""  
    return first_int * second_int  
  
  
@tool  
def add(first_int: int, second_int: int) -> int:  
    "将两个数相加"  
    return first_int + second_int``
tools=[multiply,add]
prompt = hub.pull("hwchase17/openai-tools-agent")  
llm = init_llm("kimi")

定义一个agent
agent = create_openai_tools_agent(llm, tools, prompt)  
  
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
 result = agent_executor.invoke({"input": "999+999*72177="})

继续接入实用的tool,比如baidusearch

@tool  
def baidu_search(query:str) -> str:  
    """联网搜索内容"""  
    params = {  
        "engine": "baidu",  
        "q": query,  
        "api_key": "xxxxxxx",  
        "rn":"6"  
    }  
    search = BaiduSearch(params)  
    results = search.get_dict()  
    return results["organic_results"]

调用和前面一样的,记得改为
tools=[multiply,add,baidu_search]

联网效果:

img

2.4 编写流式异步传输不同事件数据的代码

async def chat_tools(history,input):  
    async for event in agent_executor.astream_events(  
            {"input":input,"chat_history":history},  
            version="v1",  
    ):  
        kind = event["event"]  
        # 根据不同的事件类型生成不同的 SSE 消息  
        if kind == "on_chain_start":  
            if event["name"] == "Agent":  
                msg = f"data: Starting agent: {event['name']} with input: {event['data'].get('input')}\n\n"  
                yield msg  
        elif kind == "on_chain_end":  
            if event["name"] == "Agent":  
                msg = f"data:\n--\ndata: Done agent: {event['name']} with output: {event['data'].get('output')['output']}\n\n"  
                yield msg  
        elif kind == "on_chat_model_stream":  
            content = event["data"]["chunk"].content  
            if content:  
                msg = f"data: {content}\n\n"  
                yield msg  
        elif kind == "on_tool_start":  
            msg = f"data: --\ndata: Starting tool: {event['name']} with inputs: {event['data'].get('input')}\n\n"  
            yield msg  
        elif kind == "on_tool_end":  
            msg = f"data: Done tool: {event['name']}\ndata: Tool output was: {event['data'].get('output')}\ndata: --\n\n"  
            yield msg

因为Langchain没有对大部分国产大模型做适配,这一部分的工作得手工完成。

3. 技术使用中遇到的问题和解决过程

3.1 网络请求失败

问题描述:在调用API时,经常遇到网络请求失败的情况。

解决过程

  1. 检查网络连接和API服务的可用性。
  2. 添加重试机制以确保请求成功。

3.2 缺少合适的API

问题描述:很多API都需要访问海外网络,国内访问不了。

解决过程

  1. 找到一个平替的baidusearch

4. 总结

通过这次实践,我学会了如何在LangChain中集成和调用国产大模型,解决了在API调用和数据处理过程中遇到的多个技术难题。这不仅增强了我的技术能力,也提高了我在实际项目中解决问题的能力。

5. 参考文献

参考博客

  1. LLM大语言模型(四):在ChatGLM3-6B中使用langchain - 链接
  2. 一文读懂Langchain:ChatGLM3和ChatGPT的Agent调用分析 - 链接
...全文
267 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

122

社区成员

发帖
与我相关
我的任务
社区描述
FZU-SE
软件工程 高校
社区管理员
  • LinQF39
  • 助教-吴可仪
  • 一杯时间
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧