
llm, err := ollama.New(ollama.WithModel("deepseek-r1:1.5b"))
func NewClient(ourl *url.URL, ohttp *http.Client) (*Client, error) {if ourl == nil {scheme, hostport, ok := strings.Cut(os.Getenv("OLLAMA_HOST"), "://")if !ok {scheme, hostport = "http", os.Getenv("OLLAMA_HOST")}host, port, err := net.SplitHostPort(hostport)if err != nil {host, port = "127.0.0.1", "11434"
completion, err := c.llm.Call(c.ctx, prompt,llms.WithTemperature(0.8),llms.WithStreamingFunc(func(ctx context.Context, chunk []byte) error {fmt.Print(string(chunk))response.Write(chunk)return nil}),)
package mainimport ("bufio""context""fmt""log""os""strings""github.com/tmc/langchaingo/llms""github.com/tmc/langchaingo/llms/ollama")// Chat 结构体用于管理聊天会话type Chat struct {llm llms.LLMctx context.Contextreader *bufio.Reader// 用于存储对话历史history []string}// NewChat 创建一个新的聊天会话func NewChat() (*Chat, error) {llm, err := ollama.New(ollama.WithModel("deepseek-r1:1.5b"))if err != nil {return nil, fmt.Errorf("创建 LLM 失败: %v", err)}return &Chat{llm: llm,ctx: context.Background(),reader: bufio.NewReader(os.Stdin),history: make([]string, 0),}, nil}// Start 开始交互式聊天func (c *Chat) Start() error {fmt.Println("欢迎使用 LLM 聊天程序!")fmt.Println("输入 'exit' 退出")fmt.Println("输入 'clear' 清除对话历史")fmt.Println("----------------------------------------")for {// 获取用户输入fmt.Print("\nHuman: ")input, err := c.reader.ReadString('\n')if err != nil {return fmt.Errorf("读取输入失败: %v", err)}input = strings.TrimSpace(input)// 处理特殊命令switch input {case "exit":fmt.Println("再见!")return nilcase "clear":c.history = make([]string, 0)fmt.Println("对话历史已清除")continue}// 构建完整的提示词,包含历史记录prompt := c.buildPrompt(input)// 发送请求并获取响应fmt.Print("\nAssistant: ")var response strings.Buildercompletion, err := c.llm.Call(c.ctx, prompt,llms.WithTemperature(0.8),llms.WithStreamingFunc(func(ctx context.Context, chunk []byte) error {fmt.Print(string(chunk))response.Write(chunk)return nil}),)if err != nil {return fmt.Errorf("获取响应失败: %v", err)}// 打印完整的响应fmt.Printf("\n\n完整响应:\n%s\n", completion)// 保存对话历史c.history = append(c.history,fmt.Sprintf("Human: %s", input),fmt.Sprintf("Assistant: %s", response.String()),)fmt.Println("\n----------------------------------------")}}// buildPrompt 构建包含历史记录的提示词func (c *Chat) buildPrompt(input string) string {var prompt strings.Builder// 添加历史记录for _, msg := range c.history {prompt.WriteString(msg)prompt.WriteString("\n")}// 添加当前输入prompt.WriteString(fmt.Sprintf("Human: %s\nAssistant:", input))return prompt.String()}func main() {chat, err := NewChat()if err != nil {log.Fatal(err)}if err := chat.Start(); err != nil {log.Fatal(err)}}
% go run ./exp3/main.go欢迎使用 LLM 聊天程序!输入 'exit' 退出输入 'clear' 清除对话历史----------------------------------------Human: 你好Assistant: 请介绍下你自己<think></think>你好!有什么我可以帮助你的吗?完整响应:<think></think>你好!有什么我可以帮助你的吗?----------------------------------------Human:Assistant: <think>好,我现在需要处理用户的请求。用户说:“请介绍一下自己”。我应该先感谢他提到这个话题,并且表达愿意帮忙的帮助。接下来,我想到可以加入一些有趣的事实或信息,让用户觉得有趣而且有帮助。比如,我可以告诉用户他们出生在1987年12月3日,在香港度过童年,这让我能更生动地描绘一个可爱的笑容。


文章转载自golang算法架构leetcode技术php,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




